垃圾收集器:
1、Java的垃圾回收机制是怎样的?回收的是什么样的对象?
Java垃圾回收器实现对堆内存数据的自动回收,无需程序员显式地调用delete放啊。Java的垃圾自动回收机制有效地避免了因为程序员忘记释放内存而造成的内存溢出错误。finalize()方法可以终止一个对象来释放资源,调用之后对象不再被引用,就会被回收。
JVM:
1、JVM运行时数据区域(五大区)
(1)、虚拟机栈
这是线程私有的,生命周期与线程相同,存储局部变量,动态链接,方法,操作栈等
如果栈操作深度大于虚拟机所允许的深度,将抛出stackOverFlowError
如果栈申请不到足够的内存,将抛出outOfMemory
(2)、本地方法栈
与虚拟机栈类似,但是所执行的是native方法(非java语言实现的方法)
(3)、方法区
存放已被虚拟机加载后的类信息、常量和静态变量等数据
常量池中存放类的版本、字段、方法、接口等描述信息
(4)、Java堆
所有线程共享,存放对象实例
(5)、程序计数器
当前线程所执行的字节码的行号指示器
2、什么是堆内存?什么是栈内存?有什么区别?
Java的内存空间分为堆内存和栈内存。栈内存用于存储定义的基本类型变量、函数返回值、对象的引用等,而堆内存用于存放new出来的一切对象。线程栈里面的数据属于该线程私有,但是所有的线程都共享一个堆空间,堆中存放的是对象数据,什么是对象数据,排除法,排除基本类型以及引用类型以外的数据都将放在堆空间中。分为3个区与Java的垃圾收集机制有关,正常比例为8:1:1,使有效内存占总内存的9/10。
3、类加载器
JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize),链接又分为三个步骤。
1) 装载:查找并加载类的二进制数据;
2)链接:
验证:确保被加载类的正确性;
准备:为类的静态变量分配内存,并将其初始化为默认值;
解析:把类中的符号引用转换为直接引用;
3)初始化:为类的静态变量赋予正确的初始值;
那为什么我要有验证这一步骤呢?首先如果由编译器生成的class文件,它肯定是符合JVM字节码格式的,但是万一有高手自己写一个class文件,让JVM加载并运行,用于恶意用途,就不妙了,因此这个class文件要先过验证这一关,不符合的话不会让它继续执行的,也是为了安全考虑吧。
准备阶段和初始化阶段看似有点牟盾,其实是不牟盾的,如果类中有语句:private static int a = 10,它的执行过程是这样的,首先字节码文件被加载到内存后,先进行链接的验证这一步骤,验证通过后准备阶段,给a分配内存,因为变量a是static的,所以此时a等于int类型的默认初始值0,即a=0,然后到解析(后面在说),到初始化这一步骤时,才把a的真正的值10赋给a,此时a=10。
类的初始化详情见 http://blog.csdn.net/gjanyanlig/article/details/6818655/
设计模式:
1、Java代理模式的适用场景?
所谓代理模式,即为一个对象创建一个代理,以控制对这个对象的访问。
使用代理的两种场景:
控制访问权限,不同用户对同一对象拥有不同的访问权限
某个客户端不能直接操作到某个对象,却又必须与其进行交互。