java 垃圾回收算法

时间:2022-12-27 23:15:04

判断对象已死

引用计数法和可达性分析法 jvm使用可达性分析法,前者无法解决循环引用


4种引用

强引用 new出来的对象

软引用 SoftReference 在发生内存溢出之前,会回收这些对象,回收完之后还是溢出,报异常

弱引用 WeakReference 在下一次垃圾回收的时候一定会回收

虚引用 PhantomReference 可以使用它来在垃圾回收的时候得到一个通知


finalize()方法

这个方法在垃圾回收的时候调用一次,如果不可达的对象重新被引用,那么它会逃脱垃圾回收


方法区回收

回收常量和回收对象类似

回收类需要满足

没有该类的是示例,

该类的类加载器已经回收

该类的Class对象没有被引用


垃圾回收算法

标记清楚 效率不高产生大量碎片

复制 内存分2块,每次用一半,存活的对象复制到另外一半,比较浪费空间,新生代使用复制算法,但是不是1:1

而是新生代分为1块eden个2块survivor,每次使用1块eden个1块survivor,将存活的对象移到另一块survivor,如果放不下,会被担保至老年代。

Hotspot虚拟机默认8:1

标记整理


分代收集

新生代使用复制算法,因为存活的对象较少,只需要复制少量存活的对象,

老年代使用标记-整理或者标记清除算法,因为对象大部分是存活的