GC-STW-SafePoint

2023-12-12 08:38
文章标签 gc safepoint stw

本文主要是介绍GC-STW-SafePoint,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Safepoint 可以理解成是在代码执行过程中的一些特殊位置,当线程执行到这些位置的时候,线程可以暂停。在 SafePoint 保存了其他位置没有的一些当前线程的运行信息,

供其他线程读取。这些信息包括:线程上下文的任何信息,例如对象或者非对象的内部指针等等。我们一般这么理解 SafePoint,就是线程只有运行到了 SafePoint 的位置,

他的一切状态信息,才是确定的,也只有这个时候,才知道这个线程用了哪些内存,没有用哪些;并且,只有线程处于 SafePoint 位置,这时候对 JVM 的堆栈信息进行修改


GC 一定需要所有线程同时进入 SafePoint,并停留在那里,等待 GC 处理完内存,再让所有线程继续执。像这种**所有线程进入 SafePoint **等待的情况,就是 Stop the world

在 SafePoint 位置保存了线程上下文中的任何东西,包括对象,指向对象或非对象的内部指针,在线程处于 SafePoint 的时候,对这些信息进行修改,线程才能感知到。所以,只有线程处于 SafePoint 的时候,才能针对线程使用的内存进行 GC,以及改变正在执行的

SafePoint 实现相关源代码

操作触发了某个 VM 线程所有线程需要进入 SafePoint(例如现在需要 GC),如果其他线程现在:
1 运行字节码:运行字节码时,解释器会看线程是否被标记为 poll armed,如果是,VM 线程调用 SafepointSynchronize::block(JavaThread *thread)进行 block
2 运行 native 代码:当运行 native 代码时,VM 线程略过这个线程,但是给这个线程设置 poll armed,让它在执行完 native 代码之后,它会检查是否 poll armed,如果还需要停在 SafePoint,则直接 block。
3运行 JIT 编译好的代码:由于运行的是编译好的机器码,直接查看本地 local polling page 是否为脏,如果为脏则需要 block
4处于 BLOCK 状态:在需要所有线程需要进入 SafePoint 的操作完成之前,不许离开 BLOCK 状态
5处于线程切换状态或者处于 VM 运行状态:会一直轮询线程状态直到线程处于阻塞状态(线程肯定会变成上面说的那四种状态,变成哪个都会 block 住)。

哪些情况下会让所有线程进入 SafePoint, 即发生 Stop the world?
1定时进入 SafePoint
2由于 jstack,jmap 和 jstat 等命令,也就是 Signal Dispatcher 线程要处理的大部分命令,都会导致 Stop the world
3偏向锁取消(这个不一定会引发整体的 Stop the world)
4Java Instrument 导致的 Agent 加载以及类的重定义
5Java Code Cache相关:当发生 JIT 编译优化或者去优化,需要 OSR 或者 Bailout 或者清理代码缓存的时候
6GC:这个由于需要每个线程的对象使用信息,以及回收一些对象,释放某些堆内存或者直接内存,所以需要 Stop the world
7JFR 的一些事件:如果开启了 JFR 的 OldObject 采集,这个是定时采集一些存活时间比较久的对象,所以需要 Stop the world


什么情况会导致 Stop the world 时间过长?
1 Stop the world 阶段可以简单分为(这段时间内,JVM 都是出于所有线程进入 Safepoint 就 block 的状态):某个操作,需要 Stop the world(就是上面提到的哪些情况下会让所有线程进入 SafePoint, 即发生 Stop the world 的那些操作)
2 向 Signal Dispatcher 这个 JVM 守护线程发起 Safepoint 同步信号并交给对应的模块执行。
3 对应的模块,采集所有线程信息,并对每个线程根据状态做不同的操作以及标记(根据之前源代码那一块的描述,有5种情况)
4所有线程都进入 Safepoint 并 block。
5做需要发起 Stop the world 的操作。
6操作完成,所有线程从 Safepoint 恢复。

这篇关于GC-STW-SafePoint的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/483955

相关文章

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Spark学习之路 (十四)SparkCore的调优之资源调优JVM的GC垃圾收集器

《2021年最新版大数据面试题全面开启更新》 欢迎关注github《大数据成神之路》 目录 一、概述 二、垃圾收集器(garbage collector (GC)) 是什么? 三、为什么需要GC? 四、为什么需要多种GC? 五、对象存活的判断 六、垃圾回收算法 6.1 标记 -清除算法 6.2 复制算法 6.3 标记-整理算法 6.4 分代收集算法 七、垃圾收集器 7.1 Serial收集器

Kafka 为了避免 Full GC,竟然还在发送端设计了内存池,自己管理内存,太巧妙了...

一、开篇引出一个 Full Gc 的问题 在上一篇文章中,我们讲到了 Kafka 发送消息的八个流程,并且着重讲了 Kafka 封装了一个内存结构,把每个分区的消息封装成批次,缓存到内存里。 如下图所示: 上图中,整体是一个 Map 结构,Map 的 key 是分区,Map 的值是一个队列;队列里有一个个的小批次,里面是很多消息。 这样好处就是可以一次性的把消息发送出去,不至于来一条发送一条,

JVM中的GC过程

堆内存结构:在详细讨论GC过程之前,需要了解JVM堆内存的结构。JVM堆内存通常被分为新生代(Young Generation)和老年代(Old Generation),其中新生代又进一步细分为Eden区(Eden Space)和两个Survivor区(S0和S1,也称为From和To区)。从JDK 1.8开始,永久代(Permanent Generation)被元空间(Metaspace)所取代

Spark GC 调优

我们的Spark环境目前主要问题是数据量大后一些task的GC Time 特别长,多则几分钟,少则几十秒,实在不能忍受。参考databricks的 Tuning Java Garbage Collection for Spark Applications对我们的环境优化后,效果比较明显。 选择垃圾收集器 如果分配给单个Executor的Heap足够大(我认为超过32G)时使用G1,

GC overhead limit exceeded : Spark

我在运行Spark程序的时候报错 java.lang.OutOfMemoryError:GC overhead limit exceeded 伴随着通常有: java.lang.OutOfMemoryError:Java heap spaceorg.apache.spark.shuffle.FetchFailedException:Failed to connect to ... 这是

JVM避免频繁的GC

在编写代码时,完全避免垃圾收集(GC)是不可能的,因为Java(以及许多其他现代编程语言)的内存管理是基于自动垃圾收集的。然而,你可以通过一些最佳实践来减少GC的频率和开销,从而优化你的应用程序性能。以下是一些建议: 减少对象创建 尽可能重用对象,而不是每次需要时都创建新对象。 使用对象池来管理可重用对象的生命周期。 优化数据结构 选择合适的数据结构来存储数据,以减少内存占用和访问时间

浅谈gc-垃圾回收

垃圾回收(Garbage Collection 简称GC) 垃圾回收几种常用的算法有 l 引用计数法 l 标记清除法 l 复制算法 l 标记压缩法 引用计数法 引用计数法实现非常简单,对于对象A,只要有任何对象引用了A,则A的引用计数器则加1,当引用失效时则减1。只要对象A的引用计数器达到0,则对象A是不能被使用的,在下次GC时,则被当做回收对象被回收。   引用计数算法

gitlab 上源码Merge后出现git gc的解决方案

问题: 远程主分支在merger其他分支的请求后,本地主分支pull 远程分支出现git gc * branch master -> FETCH_HEADAuto packing the repository for optimum performance. You may alsorun "git gc" manually. See "git help g

JVM 垃圾回收机制:GC

目录 一、死亡对象的判断算法 1.1 引用计数算法 1.2 可达性分析算法 二、垃圾回收算法 2.1 标记-清除算法 2.2 复制算法 2.3 标记-整理算法 2.4 分代算法 三、垃圾收集器 3.1 CMS收集器(老年代收集器,并发GC) 3.2 G1收集器(唯一一款全区域的垃圾回收器) JVM的垃圾回收机制:GC,是Java提供的对于内存自动回收的机制。 在 J