JVM GC 垃圾回收(二)之 判断那些可回收,怎么回收
1、哪些对象可回收?
可行性分析算法
通过一系列GC Roots(®1)作为起始点,其到对象之间的引用(®2)称为引用链,当对象到GC Roots之间不存在引用链相连,
则此对象是不可用的。如下,Object5,Object6,Object7被判定为可回收对象。
2、怎么回收?
3、方法区回收:
a.废弃常量:
没有任何String对象引用常量池的常量,也没有其他地方引用这个常量。
b.无用的类:
下列条件全部满足:
1.该类所有的实例都已经被回收。
2.加载改类的ClassLoader已经被回收
3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
®1 GC Roots
1.虚拟机栈中引用的对象
2.方法区中类静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈中JNI引用的对象(java中C/C++编写的方法)
®2 引用
强引用:new 对象,引用还存在,对象不回收。
软引用:有用但非必需的对象。系统将要内存溢出之前,将这些对象列进回收范围中进行第二次回收。回收完内存还不够,则内存溢出。
弱引用:非必需对象。只能生存到下次垃圾回收之前。
虚引用:回收之前收到系统通知。