什么是获得的最佳值的必要步骤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,然后该行为。 代的大小只是一个快照是不够的。
你应该:
启用完整的GC日志记录 。 轻巧而强大。
- 使用
-XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
考虑收集有关您的GC信息的补充手段 。 日志记录是好的,但有时有可用轻便的命令行工具,这将让您有更深入的了解。 例如。 jstat
的热点,它会显示你伊甸园,幸存者和老将军的职业/能力
计算:
- 现场数据集 , 分配率和升学率 。 如果你需要一个更大的堆,或者如果您如这会告诉你。 杨根太小,或者如果您的Survivor空间满溢等
- 总GC时 ,它应<的总行驶时间的5%。 这样,如果你的整体GC策略效果很好,你就可以判断。
- 观察烫发根占领
一旦你有了这个数据,你就可以开始施胶代,并再次监测所做的更改的影响。 吞吐量通常大小的建议是:
- 老根 =实时数据集的1.5-2x -你的数据集应该轻松融入OldGen空间。
- 烫发根通常的PermGen占领= 1.5倍。
- 杨根 =基于分配率。 见你第二多少分配,然后再看推广速度,通过增加YoungGen降低推广速度。
- 生存空间 =监视器Tenuring阈值和推荐费率。
在一般情况下, 建议的大小取决于你调优的目标:
- 吞吐量调整 -见上面,
- 低延迟优化 -监控GC暂停
- 年轻GC过长=>减少年轻根
- 年轻GC过于频繁=>增加年轻代
- 足迹调整 -调整根据LiveDataSet,升学率和分配率的大小。 您可能不需要在吞吐量调整每个空间添加额外的一房
又见GC优化问题: 有没有一本食谱指南GC的问题?
IH在罕见的情况下,我需要调整这些值有一个叫做程序JavaVisualVM它包含在JDK(bin文件夹我觉得)我觉得这是非常有用的。 您可以连接到您正在运行的VM,并分析其所有运行参数。
在“插件”部分中,您还可以找到用于监视GC在这里你可以看到究竟是什么在那里发生的一个非常有用的插件。