4

获得优化值的必要步骤是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
4

3 回答 3

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 的信息。日志记录很好,但有时有可用的轻量级命令行工具可以让您获得更多洞察力。例如。jstatHotspot 会显示 Eden、Survivor 和 Old Gen 的职业/容量。

  3. 计算:

    • 实时数据集分配率提升率。这将告诉您是否需要更大的堆或您的例如。Young Gen 太小,或者您的 Survivor 空间溢出等。
    • total GC time,它应该小于总运行时间的 5%。这样你就可以判断你的整体 GC 策略是否有效。
    • 观察 Perm Gen 职业

一旦你有了这些数据,你就可以开始调整世代的规模,并再次监控你所做的更改的影响。通常的吞吐量大小建议是:

  • Old Gen = Live Data Set 的 1.5-2 倍 - 您的数据集应该很适合 OldGen 空间。
  • Perm Gen = 通常 PermGen 占用的 1.5 倍。
  • Young Gen = 基于分配率。看你一秒分配多少,再看提升率,通过增加YoungGen来降低提升率。
  • 幸存者空间= 监控任期门槛和晋升率。

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

  • 吞吐量调整 - 见上文,
  • 低延迟调整- 监控 GC 暂停
    • Young GC 太长 => 减少young gen
    • Young GC 太频繁 => 增加young gen
  • Footprint Tuning - 根据 LiveDataSet、Promotion Rate 和 Allocation Rate 调整大小。您可能不需要像吞吐量调整中那样为每个空间添加额外的空间

另请参阅 GC 调整问题:是否有针对 GC 问题的说明书指南?

于 2013-01-09T18:12:05.450 回答
1

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

在“插件”部分下,您还可以找到一个非常有用的插件,用于监控 gc,您可以在其中查看到底发生了什么。

于 2013-01-09T08:20:15.520 回答
1

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

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

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

于 2013-01-09T13:11:43.210 回答