JVM学习记录——GC对象搜索算法

Java与C最大的区别或许就是Java拥有垃圾回收(Garbage Collect)功能,可以让开发人员无需过多关心程序中的对象内存如何管理,更专注于业务的开发。但是如果不好好了解GC,也遇到性能瓶颈时很难容易的解决。

GC回收的对象是无用的对象,狭义是没有被引用的对象。如何在内存中找到这些对象,一般有以下两种

引用计数算法

这个算法非常简单。给对象一个计数器,每当这个对象被引用了,计数器值加一;引用失效,则减一。但这个对象计数值为0的时候,证明是无用对象,可以被GC程序回收掉。这种算法比较广泛应用在一些脚本语言上,如FLASH、PYTHON等。
但是引用计数算法无法解决对象间相互引用的问题。当a对象引用了b对象,b对象也引用了a对象,这样a、b两个对象的计数器值都不会为0,即使这两个对象都被其他对象所引用,最终导致这些对象一直无法被回收。这种情况往往会出现在比较复杂的编程语言中。

可达性分析算法

可达性分析算法(GC roots算法),广泛应用于主流的商用语言。设置一个根节点,从图论角度来看,只要从该节点可达一个对象,证明这个对象是存活的(被引用)。

通常地,GC会包含以下区域的对象:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象;
  • 方法区中类静态属性引用的对象;
  • 方法区中常量引用的对象;
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象;

参考

《深入理解Java虚拟机——JVM高级特性与最佳实践》—— 3.2

听说你想请我喝下午茶?~