本文最后更新于 3 分钟前,文中所描述的信息可能已发生改变。
垃圾回收策略
GC Strategies
如何辨别对象是否需要进行回收(可达)?通常是通过引用和引用链的方式来判断对象是否可达。
引用计数 (Reference Counting)
引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象实例都有一个引用计数。当一个对象被创建时,就将该对象实例分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象实例的计数器+1),但当一个对象实例的某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器减1。任何引用计数器为0的对象实例可以被当作垃圾收集。当一个对象实例被垃圾收集时,它引用的任何对象实例的引用计数器减1。
优点:引用计数收集器可以很快的执行,交织在程序运行中。对程序需要不被长时间打断的实时环境比较有利。
缺点:无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0。
可达性分析 (Reachability Analysis)
从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点,无用的节点将会被判定为是可回收的对象。
在Java语言中,可作为GC Roots的对象包括下面几种:
虚拟机栈中引用的对象(栈帧中的本地变量表);
方法区中类静态属性引用的对象;
方法区中常量引用的对象;
本地方法栈中JNI(Native方法)引用的对象。
垃圾回收算法
Garbage Collection Algorithms
标记-清除 (Mark-Sweep)
复制 (Copying)
标记-整理 (Mark-Compact)
分代收集 (Generational Collection)
垃圾回收模式
GC Patterns
- Partial GC: 并不收集整个堆的模式。
- Young GC: 只收集 Young gen 区域的模式。
- Old GC: 只收集 Old gen 区域的模式。CMS 中存在这种模式。
- Mixed GC: 收集整个 Young gen 和部分 Old gen 区域的模式。G1 中存在这种模式。
- Full GC: 收集整个堆,包括 Young gen、Old gen 和 Perm gen(如果存在)等所有区域的模式。
垃圾回收器
Garbage Collectors
Serial GC
Parallel GC
CMS (Concurrent Mark-Sweep)
G1 (Garbage First)
回收模式
- Young GC
- Mixed GC
- Full GC