5

我正在努力为我的 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号线它停了

http://safebin.net/9124

4

2 回答 2

2

查看附加的日志并看到次要 GC 时间的巨大增加让我相信您的机器承受着来自 JVM 以外的其他进程的极重负载。

我的理由是,当您的次要 GC 发生时,所有应用程序线程都将停止。因此,您的应用程序所做的任何事情都不应影响次要 GC 时间,因为您的新世代的大小是恒定的。

但是,如果在此期间机器上的其他进程有大量负载,GC 线程将竞争执行时间,您可能会看到这种行为。

当您的数据加载运行时,您能否检查其他进程的 CPU 使用率?

编辑:在日志上多看一点,我想出了另一种可能的解释。

似乎目标幸存者空间已满(ParNew 下降到恰好 10048K 每个“慢”GC)。这意味着对象被直接提升为老一代,这可能会减慢速度。我会尝试增加新一代的大小并降低幸存者比率。甚至可以尝试在根本不设置新生成大小或幸存率的情况下运行,看看 JVM 是如何设法优化这一点的(尽管要注意 JVM 通常在优化这样的突发方面做得很差)。

于 2012-12-11T19:50:56.740 回答
1

您的负载持续大约 90 秒,并且每 1 秒左右被一次 GC 中断,但是您有一个 14G 的堆,其稳定状态占用(假设周围的日志行是稳定状态)只有大约 5G,这意味着您有很多内存在运行浪费。我认为前面的答案看起来是正确的(基于提供的数据),当它说你的幸存者空间太小时。如果它合理的只是在其余时间进行查找,那么一个完全合理的策略将类似于

  • 任期阈值 = 0(或 1)
  • eden 大小 > 2x 工作集,所以可能是 1.5-2G(即允许当前的实时数据和工作副本完全驻留在 eden 中)
  • 终身的=剩下的

这里的重点是在加载阶段尝试并完全避免年轻收集。然而,0 的终身阈值意味着以前的版本可能是终身的,你最终会看到一个可能很长的收集来清理它。另一种选择可能是反过来,拥有足够大的任期以容纳 2-3 个版本的数据,其余的 eden 以尽量减少年轻收集的频率并帮助尽快收集终身.

最有效的方法实际上取决于应用程序在其余时间还做了什么。

顺便说一句,对于大堆来说,cms 触发器似乎相当高,如果你只开始收集 88%,那么在强制执行 fullgc 之前是否有时间完成工作?我想如果你实际上大部分时间都在做 v little 分配,那可能会很安全。

于 2012-12-11T21:30:54.757 回答