我正在努力获取适合我的JVM的正确设置。
这是使用情况: Tomcat正在处理请求(300req/s)。但它们非常快(键值查找),所以我没有任何性能问题。一切都很好,直到我需要每3小时刷新它正在提供的数据。您可以想象我有一个大HashMap,我只是在进行查找。在数据重新加载期间,我创建了一个临时HashMap,然后将其交换。我需要加载相当多的数据(每次在内存中约800MB)。
我遇到的问题是,在这些加载期间,Tomcat不时停止响应。 最初的问题是晋升失败和FullGC,但通过调整设置解决了这些问题。
正如您可能已经注意到的那样,我已经降低了CMS收集器启动时的值。我不再遇到任何晋升失败或类似的问题。年轻一代足够小,使得小集合快速完成。我增加了SurvivorRatio,因为所有请求对象都会很快消失,而其他对象(即要加载的数据)应自动晋升到老年代。
但是,在数据加载期间,我仍然看到Tomcat中的503错误。在gc.log中,我的小集合开始变慢。它们现在需要秒来比较毫秒。我尝试减慢加载过程以让GC喘口气,但似乎不起作用... 问题特别严重的时候是我达到老年代容量的时候。CMS启动,释放内存,然后分配变得非常缓慢。我不再在gc.log中看到任何错误。 我应该怎么做才能有所不同?我知道碎片化可能是一个问题,但我没有遇到晋升失败。机器是8核服务器。减少GCThread的数量有意义吗?为数据加载线程设置较低的线程优先级是否有意义?
有没有办法定期在后台启动CMS收集器?实际上可以立即回收要交换的数据。
我对任何建议都持开放态度!
以下是我的JVM设置。
-Xms14g
-Xmx14g
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+AlwaysPreTouch
-XX:MaxNewSize=256m
-XX:NewSize=256m
-XX:MaxPermSize=128m
-XX:PermSize=128m
-XX:SurvivorRatio=24
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=88
-XX:+UseCompressedStrings
-XX:+DisableExplicitGC
JDK 1.6.33
Tomcat 6
gc.log片段:
第7行开始数据加载
第20行停止