在JVM中优化Xms / Xmx / XX:MaxPermSize

时间:2013-01-09 08:08:18

标签: java java-ee garbage-collection jvm

获得Xms/Xmx/XX:MaxPermSize的优化值的必要步骤是什么?

当然我可以设置一个很大的值,但是你知道GC需要花费大量时间。当我可以节省时间进行测试并找到这些值时,一般建议是什么?

例如,以下数字是否有帮助?

Eden Space heap usage - 42MB / 62MB (used / committed)
Survivor Space heap usage - 8.5MB / 8.5MB (used / committed)
CMS Old Gen heap usage - 100MB / 217MB  (used / committed)
Non-heap memory pool usage - 36MB

3 个答案:

答案 0 :(得分:4)

调整GC时,需要在较长时间内收集GC统计信息,然后对其进行操作。只有一个代数大小的快照是不够的。

你应该:

  1. 启用完整GC记录。轻巧而强大。

    • 使用-XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
  2. 考虑收集有关GC的信息的其他方法。记录很好,但有时可用的轻量级命令行工具可以提供更多的洞察力。例如。热点jstat将显示你对伊甸园,幸存者和老一代的职业/能力。

  3. 计算:

    • 实时数据集分配率促销率。这将告诉您是否需要更大的堆或者如果您需要更大的堆。 Young Gen太小,或者你的幸存者空间溢出等等。
    • 总GC时间,应该<总运行时间的5%。通过这种方式,您可以判断整体GC策略是否运作良好。
    • 观察Perm Gen职业
  4. 获得此数据后,您可以开始调整Generations并再次监控所做更改的影响。吞吐量的通常的大小调整建议是:

    • Old Gen = 1.5-2x的实时数据集 - 您的数据集应该可以轻松适应OldGen空间。
    • Perm Gen =通常PermGen职业的1.5倍。
    • Young Gen =基于分配率。看看您在一秒钟内分配了多少,然后查看促销率,通过增加YoungGen来降低促销率。
    • 幸存者空间 =监控终身门槛和促销率。

    通常,调整建议取决于调整的目标:

    • 吞吐量调整 - 见上文
    • 低延迟调整 - 监控GC暂停
      • 年轻的GC太长了=&gt;减少年轻人
      • 年轻的GC过于频繁=&gt;增加年轻人
    • 足迹调整 - 根据LiveDataSet,促销率和分配率调整大小。您可能不需要像吞吐量调整
    • 那样为每个空间添加额外的空间

    另请参阅GC调优问题:Is there a cookbook guide for GC problems?

答案 1 :(得分:1)

在我需要调整这些值的极少数情况下,有一个名为JavaVisualVM的程序,它包含在我认为非常有用的jdk(bin文件夹)中。您可以连接到正在运行的虚拟机并分析其所有运行时参数。

在“插件”部分下,您还可以找到一个非常有用的插件,用于监控gc,您可以在其中查看其中的确切内容。

答案 2 :(得分:1)

一般规则是,在发现需要解决的问题之前,不应更改JVM内存设置。 JVM在调整运行时的大多数参数方面做得非常好,以适应您的应用程序。

如果您发现需要优化内存参数,则取决于您需要优化的内容。您将使用的设置会有很大差异,具体取决于您需要优化的方面(例如,最小化暂停的设置与最大化吞吐量的设置非常不同)。

如果您确实需要进行优化,请提供有关优化所需方面的更多信息。