如何判定对象是否为垃圾

GC通过确定对象是否被活动对象引用来确定是否需要回收这个对象。常用的饮用方法是引用计数和对象的引用遍历

引用计数

引用计数存储特定对象的所有引用数。

  • 当应用程序创建引用以及引用超出范围时,JVM必须适当增减引用数
  • 当某个对象引用数==0时,对其进行垃圾回收

可达性分析算法

对象引用遍历从GC Roots开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。

  • 如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集
  • 在对象遍历阶段,GC必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。

GC Roots包括什么?

  1. 虚拟机栈中引用的对象
  2. 方法区中静态属性/常量引用的对象
  3. 本地方法栈中JNI(Native方法)引用的对象