Concurrent Mark Sweep(CMS)是否能阻止世界事件?

use*_*127 14 java garbage-collection jvm concurrent-mark-sweep

我看到许多类的卸载,我的整个系统将在这段时间内挂起..

[Unloading class sun.reflect.GeneratedMethodAccessor117]
[Unloading class sun.reflect.GeneratedConstructorAccessor1896]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor485]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor579]
.... // about 1700 of them
Run Code Online (Sandbox Code Playgroud)

与此同时,我没有看到烫发空间出现峰值,所以它似乎不是GC事件.

我想知道以下内容

IS Concurrent Mark Sweep收集了一个停止世界事件?

即使烫发空间不满也会发生吗?

Ani*_*kur 19

CMS是一种GC,分为几个阶段

在此输入图像描述

正如您可以看到两个阶段 - 初始标记和备注是停止世界事件.

资料来源:根据Reviewing Generational GC and CMS部分.

Does it happen even when the perm space is not full?
Run Code Online (Sandbox Code Playgroud)

AFAIK这个你应该有CMSClassUnloadingEnabledUseConcMarkSweepGC.当permgen面积达到阈值时,将触发FGC.

此外,虽然并发扫描(短语(4))不是STW事件,如果permgen区域被填满(并且GC仍在处理permgen区域),它可能导致停止所有进程线程并且只有GC线程运行直到回收所有所需的内存.


Ste*_*n C 5

CMS不是“事件”。这是一个垃圾收集器。CMS确实有几个阶段,所有阶段都停止了,但是在正常情况下,这些阶段非常短(几毫秒)。通常,如果您停顿了很长时间,则意味着CMS无法跟上垃圾产生的速度(在已设置的约束范围内),并且JVM必须使用“打扫”收藏家...这停止世界。

根据您的JVM,可能只有在发生完全GC时才收集permgen,并且仅在对permgen进行GC处理时才收集/卸载类。

但是您不能推断出类的卸载会导致长时间的停顿。实际上,如果您的GC统计数据表明未充满permgen,则很有可能反过来。

您的类卸载日志也可能导致 “停止世界”问题:请参阅http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6637203


观察结果:

  • 如果您有成千上万的关于卸载动态创建的类的消息,那么我来看看您系统的体系结构。您是否过度使用代理类?

  • 在Java 8中,permgen消失了,并由元空间代替。升级可以缓解您的问题。