Java面试基础复习笔记(JVM、GC、设计模式)

垃圾收集器:

1、Java的垃圾回收机制是怎样的?回收的是什么样的对象? 

Java垃圾回收器实现对堆内存数据的自动回收,无需程序员显式地调用delete放啊。Java的垃圾自动回收机制有效地避免了因为程序员忘记释放内存而造成的内存溢出错误。 
Java使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再被使用时,即不再被引用时,就会自动释放对象所占用的内存。Java使用一系列软指针来跟踪对象的各个引用,这些软指针并不直接指向对象,而是指向对象的引用。通过软指针,Java的垃圾收集器能够以单独的线程在后台运行,并不时检查每个对象的引用。 
调用System的静态方法gc()可以运行垃圾收集器,但是并不能保证立即回收指定对象。(这就是建议回收,不能强迫回收。) 

finalize()方法可以终止一个对象来释放资源,调用之后对象不再被引用,就会被回收。


JVM:

1、JVM运行时数据区域(五大区)

(1)、虚拟机栈
这是线程私有的,生命周期与线程相同,存储局部变量,动态链接,方法,操作栈等
如果栈操作深度大于虚拟机所允许的深度,将抛出stackOverFlowError
如果栈申请不到足够的内存,将抛出outOfMemory
(2)、本地方法栈
与虚拟机栈类似,但是所执行的是native方法(非java语言实现的方法)
(3)、方法区
存放已被虚拟机加载后的类信息、常量和静态变量等数据
常量池中存放类的版本、字段、方法、接口等描述信息
(4)、Java堆
所有线程共享,存放对象实例
(5)、程序计数器
当前线程所执行的字节码的行号指示器

2、什么是堆内存?什么是栈内存?有什么区别? 

Java的内存空间分为堆内存和栈内存。栈内存用于存储定义的基本类型变量、函数返回值、对象的引用等,而堆内存用于存放new出来的一切对象。线程栈里面的数据属于该线程私有,但是所有的线程都共享一个堆空间,堆中存放的是对象数据,什么是对象数据,排除法,排除基本类型以及引用类型以外的数据都将放在堆空间中。
JVM中堆空间可以分成三个大区,新生代、老年代、永久代。
新生代可以划分为三个区,Eden区,两个幸存区。

分为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。

类的初始化
类什么时候才被初始化:
1)创建类的实例,也就是new一个对象
2)访问某个类或接口的静态变量,或者对该静态变量赋值
3)调用类的静态方法
4)反射(Class.forName("com.lyj.load"))
5)初始化一个类的子类(会首先初始化子类的父类)
6)JVM启动时标明的启动类,即文件名和类名相同的那个类
只有这6中情况才会导致类的类的初始化。
类的初始化步骤:
        1)如果这个类还没有被加载和链接,那先进行加载和链接
        2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)
         3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。

详情见 http://blog.csdn.net/gjanyanlig/article/details/6818655/


设计模式:

1、Java代理模式的适用场景? 
所谓代理模式,即为一个对象创建一个代理,以控制对这个对象的访问。 
使用代理的两种场景:
控制访问权限,不同用户对同一对象拥有不同的访问权限

某个客户端不能直接操作到某个对象,却又必须与其进行交互。

你可能感兴趣的:(Java)