Java 对象是否存活

Heer Liu

在JVM中,垃圾回收器会对内存中的对象进行生死判定,将无用的对象回收以释放内存空间。本篇博客将介绍JVM对象生死判定的过程。

算法

用来判定对象存亡的常用算法有两种:引用计数法、可达性分析算法。

引用计数法

引用计数法是最简单也是最基础的垃圾回收算法之一。该算法通过跟踪每个对象被引用的次数来判断对象是否已经成为垃圾。

当一个新对象被创建时,其引用计数为1。当其他对象引用该对象时,其对应的引用计数加1。当某个对象的引用计数变为0时,说明该对象已经成为垃圾,可以被回收。

然而,引用计数法有一个明显的问题:循环引用。如果两个或多个对象之间互相引用,它们的引用计数永远不会变成0,导致垃圾回收器无法将它们回收。因此,引用计数法并不适用于实际的垃圾回收。

可达性分析算法

JVM 使用此算法

可达性分析算法是目前主流的垃圾回收算法之一。它基于“GC Roots”的概念来判断对象是否可达。

在JVM中,GC Roots包括以下几类:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象。
  • 方法区中静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中JNI(Java Native Interface)引用的对象。

可达性分析算法从GC Roots开始遍历内存中的所有对象,将可以到达的对象标记为“存活”,而未被标记的对象则被视为垃圾。

可达性分析算法可以有效地处理循环引用问题,并且能够精确地识别出无用对象。

对象生死判定流程

JVM中的垃圾回收器会周期性地对内存中的对象进行生死判定,以便将无用对象回收。其具体流程如下:

  1. 根据GC Roots开始遍历内存中的所有对象。
  2. 将所有可以到达的对象标记为“存活”。
  3. 将未被标记的对象视为垃圾,进行回收。

需要注意的是,在进行垃圾回收时,可能会造成一些短暂的系统停顿。这是因为垃圾回收器需要暂停正在执行的程序,并锁定整个堆空间,以便安全地对内存中的对象进行回收。为了减少这种停顿时间,JVM引入了一些优化措施,如并发标记和整理、增量式收集等。

总结

JVM对象生死判定是垃圾回收机制的重要组成部分。可达性分析算法是目前主流的垃圾回收算法之一,它可以精确地识别出无用对象,并解决循环引用问题。程序员需要了解JVM对象生死判定的过程,以便更好地管理内存资源,提高程序性能。

  • 标题: Java 对象是否存活
  • 作者: Heer Liu
  • 创建于: 2020-06-07 18:50:10
  • 链接: https://blog.heer.love/posts/6a10d920/
  • 版权声明 : 本文章采用 CC BY-NC-SA 4.0 进行许可。
推荐阅读
JVM 垃圾回收算法 JVM 垃圾回收算法 Java 对象的生命周期 Java 对象的生命周期 JVM 安全点 JVM 安全点