如何判定对象是否为垃圾
GC通过确定对象是否被活动对象引用来确定是否需要回收这个对象。常用的饮用方法是引用计数和对象的引用遍历
引用计数
引用计数存储特定对象的所有引用数。
- 当应用程序创建引用以及引用超出范围时,JVM必须适当增减引用数
- 当某个对象引用数==0时,对其进行垃圾回收
可达性分析算法
对象引用遍历从GC Roots开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。
- 如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集
- 在对象遍历阶段,GC必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。
GC Roots包括什么?
- 虚拟机栈中引用的对象
- 方法区中静态属性/常量引用的对象
- 本地方法栈中JNI(Native方法)引用的对象