JVM内存管理和垃圾回收
Ray (ayufox@gmail.com)
Java 虚拟机的一个强大之处在于其提供垃圾自动回收,对开发人员掩盖了
内存分配和回收的细节。 本篇将探索 JVM的内存分配和垃圾回收机制, 以在内存
分析实战中提供一些理论和实践参考。
1. 从理论开始
1.1.垃圾检测
任何虚拟机的回收算法都包括两个步骤:检测垃圾和回收垃圾。当一个对象
被创建时,其是活动的对象,此时其是可用的,而在运行过程中,该对象的引用
不再被使用, 这时该对象就成为垃圾, 一般采用两种方式来区别活动对象和垃圾
对象:引用计数和跟踪。当一个对象被其它对象引用时,其引用计数加 1,当不
再被其它对象引用时,计数减 1,当其引用计数为 0 时,该对象就成为垃圾,引
用计数的缺点是无法检测循环引用和维护引用计数的代价, 在现代虚拟机中一般
不采用该方式。 而跟踪指的是虚拟机追踪从根对象出发的有向对象图, 如果一个
对象不能被追踪到, 则该对象为垃圾, 采用追踪算法的垃圾回收器也叫标记并回
收回收器(见 下图 , 可以 形 象地理 解 为在堆 空间中引入 了重力 场 , 参见
http://developer.51cto.com/art/200610/32793.htm )。
图 1 初始状态
图 2 TR1-A 链和 TR2-D链断开, A、B、C、D掉入回收池