一、如何判断对象已死?
引用计数法--Python
存在循环引用问题
可达性分析法--Java
GC Roots对象:
虚拟机栈中的引用对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中引用的对象
引用类型--JDK1.2
强引用
软引用
弱引用
虚引用
生存还是死亡?
如果对象在进行可达性分析之后没有与GC Roots相连接,那么它会被标记并且进行筛选,筛选条件是是否有必要执行finalize()方法,如果此对象没有finalize()方法或者已经被调用过,这时,此对象才是真正的死亡
二、回收方法区
方法区(永久代)垃圾回收主要收集:废弃常量和无用的类
满足下列条件则为无用的类:
该类所有的实例都已经被回收
加载该类的ClassLoader被回收
该类对应的Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法
满足上述条件也仅仅是可以,而不是必然。在大量的反射、动态代理等场景都需要JVM具备类卸载的功能来防止永久代的溢出
三、垃圾回收算法
标记清除算法
效率问题:标记和清除俩个效率都不高
空间问题:标记清除会产生大量的不连续内存碎片,导致需要分配较大内存时,无法找到足够连续的空间而提前触发一次垃圾回收
复制算法--新生代
复制算法是为了解决标记-清除的效率问题。但是对象存活率较高时,则效率会降低。这时,我们就引入了老年代算法。每次一个周期年龄涨一岁,到十五岁则将其放入老年代。
标记-整理算法--老年代
复制算法在对象存活率较高时会进行比较多的复制操作,效率会变低,因此老年代不使用复制算法,针对老年代提出来标记-整理算法。
分代收集算法
JVM收集器采用分代收集算法,,将对象存活周期将内存化为几块。一般讲Java堆分为新生代和老年代,新生代中采用复制算法,老年代中采用标记-清除或者标记-整理算法。
面试题:请问了解Minor GC和Full Gc么,这俩种GC有什么不一样吗
Minor GC:称为新生代GC,发生在新生代的垃圾收集,由于Java对象都具有朝生夕死的特性,因此Minor GC非常频繁,因此回收速度比较快
Full Gc:称为老年代GC,发生在老年代的垃圾收集,出现了Full GC,一般会伴随一次Minor GC,Full GC一般比Minor GC慢十倍以上
四、垃圾收集器
Serial收集器--新生代收集器、串行GC
ParNew收集器--新生代收集器、并行GC
Parallel Scavenge收集器--新生代收集器、并行GC
Serial Old收集器--老年代收集器、串行GC
Parallel Old收集器--老年代收集器、并行GC
CMS收集器--老年代收集器、并发GC
G1收集器--全区域垃圾回收器
五、内存分配及回收策略
对象优先在Eden分配内存
大对象直接进入老年代
长期存活对象进入老年代