一、GC作用区域
GC垃圾回收作用区域集中于堆和方法区。栈由于先进后出的特性,所有存在于栈中的方法或者变量等,最后都会出栈。因此,栈中不存在可回收的垃圾。
二、GC如何判定垃圾
GC进行垃圾回收,前提是确认哪些对象为垃圾。只有确定了垃圾对象后,方可对垃圾对象进行回收。
垃圾定位主要涉及两种方法:引用计数法、可达性分析法。
1. 引用计数法
Java对象头中分配了一个空间来记录对象被引用的次数,当对象引用次数为0时,可认定该对象可被回收、释放。
引用计数法的优点在于实现简单,缺点在于无法应对循环引用的情形。
2. 可达性分析法
可达性分析法以“GC Roots”为起点,向下遍历。当一个对象不存在到GC Roots的引用链时,则表明该对象是不可达的。也即,是可被回收的。
可作为“GC Roots”的对象包括:
- 虚拟机栈中引用的变量。因为还在被当前程序所使用。
- 方法区中类的静态属性引用的对象。因为静态属性生命周期同类。
- 方法区中常量引用的对象。
- 本地方法栈中JNI引用的对象。
三、GC回收算法
1. 标记清除算法
2. 标记整理算法
3. 复制算法