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

获得Xms/Xmx/XX:MaxPermSize优化值的必要步骤是什么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 

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

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

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

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

你应该:

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

    • 使用-XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
  2. 考虑收集有关GC的信息的其他方法 。 记录很好,但有时可用的轻量级命令行工具可以提供更多的洞察力。 例如。 热点的jstat将向您展示Eden,Survivor和Old Gen的职业/能力。

  3. 计算:

    • 实时数据集分配率促销率 。 这将告诉您是否需要更大的堆或者如果您需要更大的堆。 Young Gen太小,或者你的幸存者空间溢出等等。
    • 总GC时间 ,应该<总运行时间的5%。 这样您就可以判断整体GC策略是否运作良好。
    • 观察Perm Gen职业

获得此数据后,您可以开始调整Generations并再次监控所做更改的影响。 通常的吞吐量大小建议是:

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

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

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

另请参阅GC调整问题: 是否有关于GC问题的食谱指南?

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

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