一 考察方向:JVM的内存分配模型和垃圾回收机制
Q1:什么是垃圾,确定垃圾有哪些方法?
垃圾是内存中无法被程序使用的对象,确定垃圾的方法有:引用计数法,可达性分析。
Q2:引用计数法的优缺点是什么?
优:将垃圾回收分摊到整个程序的运行中,并不需要Stop-The-World。缺:无法解决循环引用的问题,容易造成内存泄漏,因此事实上JVM并无使用该方法,而是使用可达性分析。
Q3:可达性分析使用的GC Root有哪些(顺便考察面试人员对JVM内存分配模型的了解程度)?
虚拟机栈/本地方法栈中引用的对象,方法区中类静态属性/常量引用对象。
Q4:以下程序中,对象MethodAreaStaicProperties("parameter")是否会被回收?
public class MethodAreaStaicProperties {
public static MethodAreaStaicProperties m;
public MethodAreaStaicProperties(String name){}
}
public static void testGC(){
MethodAreaStaicProperties s = new MethodAreaStaicProperties("properties");
s.m = new MethodAreaStaicProperties("parameter");
s = null;
}
不会,该对象和m有引用关系,而m是方法区中的静态属性,属于GC Root中的一种。
Q5:能否画出内存模型?
如下图(主要能说出虚拟机栈和堆关系和区别,栈:线程隔离,存放引用;堆:线程共享,存放对象)
Q6:有哪些垃圾回收的算法,以及各个算法的优缺点?
标记-清楚:简单,但会造成内存碎片
复制:不会产生内存碎片,但有一半的空间无法被分配
标记-整理:不会产生内存碎片,但内存变动频繁,效率较差
Q7:能否画出JVM的堆结构?
Q8:能否简述分代收集算法的主要思想?
对于新生代中的对象,大部分生命周期较短,每次回收都有大量的对象死去,因此采用的是复制算法;而对于老年代的对象生命周期较长,采用标记-整理算法。当Eden区中没有足够的内存分配的时候就需要进行Minor GC,一次Minor GC会将Eden和From区中存活的对象复制到To区中,From和To区可以相互转化,本次的From区对下次来说就是To区。每经过一个Minor GC,存活下来的对象就”长了一岁“,只有16岁的对象才会被移到老年区。当老年区也没有足够内存可分配的时候就会进行Major GC了。每次GC都是Stop-The-World,Minor GC的效率较高而Major GC效率较低,如果Major GC次数过多将会严重影响程序的运行效率。
文章来源: www.oschina.net,作者:莫在全,版权归原作者所有,如需转载,请联系作者。
原文链接:https://my.oschina.net/u/4042451/blog/3162896