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

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

请访问 http://www.curiousmentality.co.uk/2011/11/tuning-jvm-memory-settings/ 了解一些实用的信息。 - rmuller
请参阅GC调优问题:https://dev59.com/GWw15IYBdhLWcg3wCXSJ - Aleš
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信息的方法。记录是好的,但有时还有可用的轻量级命令行工具,可以提供更多的见解,例如Hotspot的`jstat`,它将显示Eden、Survivor和Old Gen的占用/容量。 3. 计算: - 活数据集、分配速率和晋升速率。这将告诉您是否需要更大的堆,或者您的Young Gen是否太小,或者Survivor空间是否溢出等。 - 总GC时间,应该小于总运行时间的5%。这样您就可以判断您的整体GC策略是否有效。 - 观察Perm Gen占用情况
一旦您获得了这些数据,您可以开始调整代的大小,并再次监视所做更改的影响。吞吐量的通常大小建议如下:
- Old Gen = Live Data Set的1.5-2倍 - 数据集应舒适地适合OldGen空间。 - Perm Gen = 常规PermGen占用的1.5倍。 - Young Gen = 基于分配速率。查看您每秒分配了多少,然后查看晋升速率,通过增加YoungGen减少晋升率。 - Survivor Spaces = 监控Tenuring阈值和Promotion rate。
总体而言,调整大小的建议取决于调整的目标:
- 吞吐量调整 - 如上所述, - 低延迟调整 - 监视GC暂停 - Young GC太长=>减少young gen - Young GC太频繁=>增加young gen - 占用空间调整 - 根据LiveDataSet、Promotion Rate和Allocation Rate调整大小。您可能不需要像吞吐量调整中那样为每个空间添加额外的空间。

另外请参阅GC调优问题:是否有针对GC问题的烹饪书指南?


1
在极少数需要调整这些值的情况下,有一个名为JavaVisualVM的程序非常有用,它包含在jdk中(我认为是bin文件夹)。您可以连接到正在运行的虚拟机并分析其所有运行时参数。
在“插件”部分下,您还可以找到一个非常有用的插件来监视gc,您可以看到其中发生了什么。

1

通常情况下,在发现需要解决的问题之前,不应更改JVM内存设置。JVM在运行时会自动调整大多数参数以适应您的应用程序。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接