【JVM】并发的可达性分析详细解释

简介: 【JVM】并发的可达性分析详细解释

2eb6b8c0fe274dc58d13e75893160aab.jpg

前言

在垃圾回收的领域中,为了提高垃圾回收的效率并减小对应用程序的影响,许多现代的垃圾回收算法采用了并发的手段。并发的可达性分析和三色标记法就是其中一种经典的组合。这种方法通过允许垃圾收集与用户线程并发执行,以减小垃圾回收的停顿时间,提高系统的响应性。下面我们将介绍并发的可达性分析和三色标记法的基本原理和工作过程。

正文

在Java虚拟机(JVM)中,可达性分析是垃圾回收的一个关键概念。它是通过判断对象是否可被程序中的任何引用链访问到,从而确定对象是否存活的过程。可达性分析是Java内存管理机制的一部分,用于找出哪些对象是活动的,而哪些对象可以被回收。

可达性分析的基本原理:

  1. 根集合(Root Set):
  • 可达性分析的起点是根集合,包括虚拟机栈中引用的对象、静态变量引用的对象以及本地方法栈中JNI(Java Native Interface)引用的对象。这些对象被认为是活动的,它们是可达性分析的起点。
  1. 对象引用关系:
  • 可达性分析通过遍历对象之间的引用关系,沿着引用链检查对象的可达性。如果某个对象A能够通过一系列引用关系达到根集合中的任何对象,那么对象A就被认为是可达的,即它是活动的。

3.标记-清除算法:

  • 常用的垃圾回收算法中,可达性分析主要用于标记-清除算法。在标记阶段,通过遍历对象引用关系,将可达的对象标记为活动。在清除阶段,清除掉未被标记的对象,这些未被标记的对象就被判定为垃圾。

详细解释可达性分析的过程:

  1. 初始标记(Initial Mark):
  • 首先,虚拟机会扫描虚拟机栈上的引用,标记被GC Roots直接引用的对象。这个阶段是短暂的,只是标记一下GC Roots直接引用的对象,不会停顿用户线程。

2.并发标记(Concurrent Mark):

  • 在这个阶段,JVM会和用户线程并发执行,继续扫描并标记可达性。因为这个阶段是与用户线程并发执行的,所以被称为并发标记。这一阶段的目标是标记出所有的可达对象,包括从GC Roots可达的对象以及在并发标记阶段新创建的对象。

3.重新标记(Remark):

  • 在并发标记完成后,为了处理在并发标记期间发生的用户线程对对象图的修改,需要进行一次重新标记。这个阶段会停顿用户线程,进行完整的标记。

4.并发清除(Concurrent Sweep):

  • 在这个阶段,JVM会并发地清理掉那些被标记为垃圾的对象。与并发标记一样,这个过程也是与用户线程并发执行的,不会导致停顿。

5.引用处理(Reference Processing):

  • 最后,虚拟机会处理引用。包括清理SoftReference、WeakReference和PhantomReference等引用类型,以及对应用了Finalizer的对象进行Finalization。


总体来说,可达性分析是一种用于确定对象是否可被访问的技术,是垃圾回收过程的基础。通过标记-清除算法,可以及时地识别出不再被引用的对象,释放它们所占用的内存,从而提高程序的性能和内存利用率。

三色标记

三色标记法是一种用于垃圾回收中的可达性分析的算法,主要包括三种颜色:白色、灰色和黑色。这种标记法通常与并发标记清除算法(Concurrent Mark-Sweep,CMS)一起使用,以实现在减小停顿时间的同时进行垃圾回收。

三色标记法的基本概念:

  1. 白色(White):
  • 初始状态,所有的对象都被标记为白色。白色表示对象尚未被垃圾收集器访问过,即对象处于可回收的状态。

2.灰色(Gray):

  • 表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有被扫描过。灰色对象是待处理的对象,它的引用关系需要进一步探索。

3.黑色(Black):

  • 表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过。黑色的对象是已经扫描过的对象,它是安全存活的,即不会被回收。

三色标记法的工作过程:

  1. 初始标记阶段(Initial Mark):
  1. 在这个阶段,GC Roots直接可达的对象被标记为黑色,表示它们是活动的。这个阶段需要短暂的停顿,但不会引起全局的垃圾回收。
  1. 并发标记阶段(Concurrent Mark):
  1. 灰色对象被并发地扫描,将其引用关系中的对象标记为灰色。这个过程与用户线程并发执行,不会导致停顿。标记过程中新产生的对象可能是白色的,它们会在下一轮的标记中被处理。
  1. 重新标记阶段(Remark):
  1. 在用户线程停顿的情况下,对并发标记阶段中由于用户线程修改而发生变化的对象进行重新标记。将它们从灰色变为黑色,确保准确的标记。这个阶段需要较短的停顿时间。
  1. 重新标记阶段(Remark):
  1. 在用户线程停顿的情况下,对并发标记阶段中由于用户线程修改而发生变化的对象进行重新标记。将它们从灰色变为黑色,确保准确的标记。这个阶段需要较短的停顿时间。

三色标记法通过将对象划分为不同颜色,使得在标记和清理过程中能够高效地识别活动对象和垃圾对象,从而在尽可能减小停顿时间的同时实现垃圾回收。这种算法通常与并发垃圾回收算法结合使用,例如CMS垃圾回收器。

结语

并发的可达性分析和三色标记法是现代垃圾回收领域中为了提高性能和降低垃圾回收停顿时间而采用的一种有效手段。通过在标记和清理阶段与用户线程并发执行,系统能够更加灵活地进行垃圾回收,减小了对应用程序的影响。三色标记法通过将对象标记为白色、灰色和黑色,使得在可达性分析中能够高效地识别出活动对象和垃圾对象,从而提高了垃圾回收的准确性。这一组合极大地提高了垃圾回收的效率,使得现代的垃圾回收器在处理大规模应用和复杂内存结构时能够更好地平衡性能和响应性。

相关文章
|
17天前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
|
2月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
57 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
2月前
|
存储 Java PHP
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
78 0
|
5月前
|
Java
jmap 查看jvm内存大小并进行dump文件内存分析
jmap 查看jvm内存大小并进行dump文件内存分析
116 3
|
5月前
|
运维 监控 Java
(十)JVM成神路之线上故障排查、性能监控工具分析及各线上问题排错实战
经过前述九章的JVM知识学习后,咱们对于JVM的整体知识体系已经有了全面的认知。但前面的章节中,更多的是停留在理论上进行阐述,而本章节中则更多的会分析JVM的实战操作。
124 1
|
4月前
|
监控 JavaScript Java
JVM源码级别分析G1发生FullGC元凶的是什么
线上系统遭遇频繁Old GC问题,监控显示出现多次“to-space exhausted”日志,这表明垃圾回收过程中因年轻代 Survivor 区或老年代空间不足导致对象晋升失败。通过 JVM 源码分析,此问题源于对象转移至老年代失败时,JVM 无法找到足够的空间存放存活对象。进一步排查发现大对象分配占用了预留空间,加剧了空间不足的情况。使用 JFR 分析工具定位到定期报表序列化导致大量大对象生成,通过改用堆外内存进行序列化输出,最终解决了频繁 Old GC 问题。
138 0
|
5月前
|
人工智能 Java
JVM内存问题之当老年代缓慢增加且Full GC无法清除时,应如何使用MAT进行分析
JVM内存问题之当老年代缓慢增加且Full GC无法清除时,应如何使用MAT进行分析
252 0
|
23天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
178 1
|
2月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
40 4
|
12天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。