我的应用程序使用 ParallelOld GC,在使用 JMC 分析应用程序时,我发现类卸载花费了相当多的时间。例如。
Event Type Name Duration (ns)
GC Phase Pause GC Pause 191,864,741
GC Phase Pause Level 1 pre compact 18,946
GC Phase Pause Level 1 marking phase 140,394,856
GC Phase Pause Level 2 par mark 40,388,459
GC Phase Pause Level 2 reference processing 1,073,803
GC Phase Pause Level 3 SoftReference 756,766
GC Phase Pause Level 3 WeakReference 61,320
GC Phase Pause Level 3 FinalReference 238,764
GC Phase Pause Level 3 PhantomReference 6,014
GC Phase Pause Level 3 JNI Weak Reference 6,629
GC Phase Pause Level 2 class unloading 98,902,975 <=========
GC Phase Pause Level 1 summary phase 6,858
GC Phase Pause Level 1 adjust roots 15,803,657
GC Phase Pause Level 1 compaction phase 34,518,114
GC Phase Pause Level 2 drain task setup 1,672
GC Phase Pause Level 2 dense prefix task setup 1,816
GC Phase Pause Level 2 steal task setup 234
GC Phase Pause Level 2 par compact 34,206,466
GC Phase Pause Level 2 deferred updates 1,624
GC Phase Pause Level 1 post compact 890,295
这里,类卸载阶段花费了总共 192 毫秒中的 99 毫秒——即大约 99 毫秒。一半的时间。我的应用程序不使用动态代码生成或代理生成,因此我尝试使用 -XX:-ClassUnloading 禁用类卸载,但没有成功:“类卸载”阶段仍然存在于配置文件中,并且仍然需要 Major GC 时间的 1/2-1/3。我找不到任何用于禁用 ParallelOld GC 类卸载的特殊标志(我尝试找到它,因为有 CMS 的特定标志)。如何禁用 ParallelOld GC 的类卸载?
(适用于 linux-amd64 1.8.0_102-b14 64 位服务器虚拟机的 HotSpot)
最佳答案
你可以尝试:
-Xnoclassgc
禁用类的垃圾收集 (GC)。这可以节省一些GC时间,从而缩短应用程序运行期间的中断。当您在启动时指定 -Xnoclassgc 时,应用程序中的类对象在 GC 期间将保持不变,并且始终被视为 Activity 的。
这可能会导致更多内存被永久占用,如果不小心使用,将引发内存不足异常。
或者要考虑内存大小,请增加 MetaspaceSize -XX:MetaspaceSize=64m
。
当类元数据使用量达到 MetaspaceSize(32 位客户端 VM 上为 12 MB,32 位服务器 VM 上为 16 MB,64 位 VM 上的大小更大)时,会引发垃圾收集来收集失效的类加载器和类。
来源http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
关于java - 使用 ParallelOld GC 禁用 ClassUnloading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39408664/