我正在努力为我的 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 雄猫 6
gc.log 片段:
第 7 行数据加载开始
20号线它停了