1、对象没有与GCRoots关联,是否还可以存活? 可以。 对象没有与GC Roots关联时,会被虚拟机标记一次(缓刑)。但如果对象没有覆盖finalize方法或finalize方法已经被虚拟机调用过,虚拟机将不会再执行 finalize 方法,对象将能存活。 2、对象没有与GCRoots关联,且被执行了finalize方法,是否还可以存活? 可以。 因为虚拟机所谓的执行finalize方法只是“触发”,不承诺会等待它运行结束。只要对象在被执行finalize方法期间,重新与引用链上的任何一个对象建立关联,将在虚拟机的第二次标记时成功拯救自己。 3、方法区主要回收什么? 废弃常量和无用的类 4、类需要满足哪些条件才算是“无用的类”? 1)该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例 2)加载该类的ClassLoader已经被回收 3)该类对应的Java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法 5、标记—清除算法有什么缺点? 1)效率问题。标记和清除两个过程的效率都不高 2)空间问题。标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 6、新生代为什么用复制算法,老年代为什么用标记—清理算法? 在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,复制算法只需要付出少量存活对象的复制成本就可以完成收集; 在老年代中,对象存活率高,没有额外空间对它进行分配担保,就必须使用标记—清除或标记—整理算法来回收 7、垃圾回收中,并行和并发的区别是什么? 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行在另一个CPU上。 8、Parallel Scavenge收集器和CMS收集器的差别? 关注点不同。 Parallel Scavenge 的目标是达到一个可控制的吞吐量; CMS 的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间。 9、SerialOld收集器的用途有什么? 在虚拟机的Client模式下,用作老年代的收集器,使用标记—清理算法; 在虚拟机的Server模式下,有两个用途: 一个是在JDK1.5及之前的版本中与Parallel Scavenge收集器配合使用, 另一个用途是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure 时使用。 10、CMS收集器的工作过程是什么样的? 初始标记:标记GC Roots能直接关联到的对象,速度很快 并发标记:进行GC Roots Tracing的过程 重新标记:为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录 并发清除
全部评论
(1) 回帖