判断对象已死
引用计数法和可达性分析法 jvm使用可达性分析法,前者无法解决循环引用
4种引用
强引用 new出来的对象
软引用 SoftReference 在发生内存溢出之前,会回收这些对象,回收完之后还是溢出,报异常
弱引用 WeakReference 在下一次垃圾回收的时候一定会回收
虚引用 PhantomReference 可以使用它来在垃圾回收的时候得到一个通知
finalize()方法
这个方法在垃圾回收的时候调用一次,如果不可达的对象重新被引用,那么它会逃脱垃圾回收
方法区回收
回收常量和回收对象类似
回收类需要满足
没有该类的是示例,
该类的类加载器已经回收
该类的Class对象没有被引用
垃圾回收算法
标记清楚 效率不高产生大量碎片
复制 内存分2块,每次用一半,存活的对象复制到另外一半,比较浪费空间,新生代使用复制算法,但是不是1:1
而是新生代分为1块eden个2块survivor,每次使用1块eden个1块survivor,将存活的对象移到另一块survivor,如果放不下,会被担保至老年代。
Hotspot虚拟机默认8:1
标记整理
分代收集
新生代使用复制算法,因为存活的对象较少,只需要复制少量存活的对象,
老年代使用标记-整理或者标记清除算法,因为对象大部分是存活的