我的应用程序使用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毫秒 - 即大约。一半的时间。我的应用程序不使用动态代码生成或代理生成,因此我尝试使用-XX:-ClassUnloading禁用类卸载,但没有成功:&#34;类卸载&#34;阶段仍然存在于配置文件中,仍然需要主要GC时间的1 / 2-1 / 3。我找不到任何用于ParallelOld GC的禁用类卸载的特殊标志(我试图找到它,因为CMS有特定的标志)。我如何禁用ParallelOld GC的类卸载?
(HotSpot for linux-amd64 1.8.0_102-b14 64位服务器VM)
答案 0 :(得分:0)
你可以尝试:
-Xnoclassgc
禁用类的垃圾收集(GC)。这可以节省一些GC时间,从而缩短应用程序运行期间的中断。在启动时指定-Xnoclassgc时,应用程序中的类对象将在GC期间保持不变,并始终被视为实时。
这会导致更多内存被永久占用,如果不小心使用,将会导致内存不足。
或者要考虑内存大小,增加 MetaspaceSize -XX:MetaspaceSize=64m
。
当类元数据使用量达到MetaspaceSize时(32位客户端虚拟机上为12Mbytes,而64位虚拟机上大小较大的32位服务器虚拟机上为16Mbytes),会引发垃圾收集以收集死类加载器和类。
来源http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html