java - 使用 ParallelOld GC 禁用 ClassUnloading

标签 java garbage-collection

我的应用程序使用 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/

相关文章:

java - ISafeRunnable 在哪里?

c# - GC 时间百分比高的原因是什么?对于我们在 APM perfmonitor 工具中的应用程序池,我们看到它超过 99% 并保持数小时

vb.net - 句柄与 AddHandler

c - 如何坚持 C 编译器将局部变量放在堆栈上,而不是寄存器中

java - 哪个对象将被垃圾收集?

memory-leaks - Lua 弱表内存泄漏

java - 通过 SOAP/Java 在 MS Dynamics CRM 2011 中创建产品

java - ResourcePool 无法从其主要工厂或来源获取资源

Java 与 Drupal-6/PHP

java - 一种布局中图像的最大尺寸是多少?