在JVM MaxPermSize参数:优化X毫秒/ XMX / XX(Optimizing Xms/

2019-08-06 03:10发布

什么是获得的最佳值的必要步骤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

Answer 1:

一般的规则是,你不应该改变的JVM内存设置你发现需要解决的问题了。 在JVM确实在调整中运行的大多数参数,以满足您的应用程序一个不错的工作。

如果您发现需要优化它取决于你需要什么优化内存参数。 你会使用的设置将根据需要优化哪些方面差别很大(例如设置为最小化暂停从设置,最大限度地提高吞吐量非常不同)。

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



Answer 2:

当调整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. 计算:

    • 现场数据集分配率升学率 。 如果你需要一个更大的堆,或者如果您如这会告诉你。 杨根太小,或者如果您的Survivor空间满溢等
    • 总GC时 ,它应<的总行驶时间的5%。 这样,如果你的整体GC策略效果很好,你就可以判断。
    • 观察烫发根占领

一旦你有了这个数据,你就可以开始施胶代,并再次监测所做的更改的影响。 吞吐量通常大小的建议是:

  • 老根 =实时数据集的1.5-2x -你的数据集应该轻松融入OldGen空间。
  • 烫发根通常的PermGen占领= 1.5倍。
  • 杨根 =基于分配率。 见你第二多少分配,然后再看推广速度,通过增加YoungGen降低推广速度。
  • 生存空间 =监视器Tenuring阈值和推荐费率。

在一般情况下, 建议的大小取决于你调优的目标:

  • 吞吐量调整 -见上面,
  • 低延迟优化 -监控GC暂停
    • 年轻GC过长=>减少年轻根
    • 年轻GC过于频繁=>增加年轻代
  • 足迹调整 -调整根据LiveDataSet,升学率和分配率的大小。 您可能不需要在吞吐量调整每个空间添加额外的一房

又见GC优化问题: 有没有一本食谱指南GC的问题?



Answer 3:

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

在“插件”部分中,您还可以找到用于监视GC在这里你可以看到究竟是什么在那里发生的一个非常有用的插件。



文章来源: Optimizing Xms/Xmx/XX:MaxPermSize in JVM