垃圾收集 - 改变收集器算法

时间:2012-02-15 18:45:46

标签: java garbage-collection

我们在Tomcat(Java 1.5)上运行Spring + Hibernate Web应用程序。目前我们使用2GB的堆空间(我被告知它是Solaris 32位服务器上的最大可能,尽管Server总共有16GB RAM)。目前的JAVA_OPTS是:

-XX:MaxPermSize = 512m -XX:+ UseParallelGC -Xms2048m -Xmx2048m

Young Gen + Survivor空间约为600 MB,Old Gen为1.4 GB。

有时间内存已满,我们需要重启Tomcat。以下是观察结果:

  1. 在大约16个小时的服务器主动运行中,GC花费大约一个小时用于MarkSweep(约300个收集 - Old Gen)和5-7分钟用于清理(~1500个收集 - Young Gen)。
  2. 有些时候Old Gen会在10分钟内完成,我们需要重新启动服务器。识别导致的线程并不是很成功
  3. 我们想要更改为以下JAVA_OPTIONS - 我需要反馈是否这是明智的选择(UAT环境与Prod env的负载不匹配,我们无法在UAT中复制相同的内容)

    1. 添加-Xmn1024m - 这是为了确保Young Gen对象不容易升级为Old Gen.有关增加/减少此项的任何建议吗?这也将导致更多的Young Gen GC和较小的Old Gen GC。

    2. -XX:+ UseParallelOldGC - 这是为了让Young和Old Gen GC运行多个线程,以便更快地获得GC。

    3. 2GB的限制是否也适用于Solaris服务器?堆不能增加到2GB以上吗?

    4. 请分享您对上述内容的看法。

      谢谢, Midhun

1 个答案:

答案 0 :(得分:0)

如果您经历了太长时间的主要收藏暂停,则应考虑使用-XX:+UseConcMarkSweepGC(并保留-XX:+UseParallelOldGC)以便同时执行G​​C。

你使用-Xms2048m -Xmx2048m的事实可能是一个坏主意,如果这些值不是很好,你不要让JVM扩展它们(但如果你肯定没问题)。 在 Java Performance Tuning 2nd Ed。中,经常有关于堆大小的建议:

  
      
  1. 将起始堆大小设置为与最大堆大小相同
  2.   
  3. 将起始大小设置为最大活动对象数所需的大小,并将最大值设置为此金额的4倍
  4.   
  5. 将起始堆设置为最大堆大小
  6.   
  7. 将起始堆大小设置为最大堆大小的1/10到1/4
  8.   
  9. 使用默认的初始堆大小
  10.   

(尽量找到最适合你的人)

本文档为resolve GC issue提供了很好的建议,请仔细阅读生成大小调整,并尝试使用某些命令打印您的GC活动,其中一些可能真的有助于查看您的应用或GC配置中的一些瓶颈。