垃圾回收中的STW

300 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情

什么是垃圾回收中的STW?

STW 它的称之为 垃圾回收装置中的暂停。

一般来说进行垃圾回收中的任何回收,首先在我们 JVM 运行过程中往往是业务线程在运行,在运行这我们的项目,运行着我们的代码,但是这个时候一旦触发了垃圾回收,那么它就需要把所有的业务线程给全部暂停掉。

暂停掉之后再启动垃圾回收器中相关的线程,去完成我们的垃圾收集,去完成空间清理,完成这一系列操作之后呢再让我们的业务线程再启动。

image.png

所以在我们垃圾回收线程工作的时候,就会针对于我们的业务线程的时间线上面出现暂停,上面这个图中红色的 GC线程 的时候对于业务线程是停止的,所以这个现象一般称之为全世界停止。

其实也就是业务线程它感受到了卡顿,这也就是 JVM 垃圾回收器的 STW垃圾回收装置的暂停现象。
一般来说就是在做项目开发的时候得尽量减少 STW 的时间,特别是对 FUll GC 一定要减少它的出现,因为对于 young GC 来说 FUll GC 它需要的时间要更多,产生的暂停现象也就更明显,用户也就能容易感受到程序的卡顿。
比如说用户突然下了一个订单,然后 JVM 刚好就发生了垃圾回收,这就导致我们的业务线程暂停了,这个订单暂时也就搁置了,只有等 GC线程 完成垃圾回收操作之后才会继续进行下单的操作。如果这个过程中进行的 是 young GC 的话时间就很快,用户几乎感受不到,但是如果进行的是 FUll GC ,那么时间可能会比较久这样用户就能很直观的感受到程序的卡顿。