一、可达性分析算法
以GC Roots对象作为起点向下搜索,通过判断对象的引用链是否可达,来判定对象是否存活。
GC Roots对象:
1)虚拟机栈(栈帧中的本地变量表)中引用的对象。
2)方法区中类静态属性引用的对象。
3)方法区中常量引用的对象。
4)Native方法引用的对象。
二、对象引用
1)强引用
2)软引用 SoftReference
3)弱引用 WeakReference
4)虚引用 PhantomReference
三、方法区回收
永久代垃圾回收主要内容有:废弃常量、无用的类。
常量池中的字面量如果没有任何String对象引用,当发生内存回收且必要时,将会被清理。
无用的类判断条件:
1)该类所有的实例都已经被回收
2)加载该类的ClassLoader已经被回收
3)该类的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法
-Xnoclassgc参数控制JVM是否对类进行回收
四、垃圾收集算法
1)标记-清除算法
2)复制算法
新生代采用复制算法进行回收,HotSpot默认Eden空间和Survivor空间比例是8 :1。
3)标记-整理算法
老年代采用标记-整理算法进行回收。