java MC 服务器 jvm 调优 总结集合

一些可能改善 mc 客户端&服务端性能的 JVM 优化参数【minecraft吧】_百度贴吧 (baidu.com)

-XX:+UseLargePages
-XX:+UseLargePagesInMetaspace

这两个参数使 Java 堆内存和元空间分配都使用大页内存,这对于 Java 应用来说几乎没有缺点,对内存密集型应用改善尤其明显,也会让 GC 的吞吐量延迟都有所提升。
当然这么好的事情默认不开启也是有原因的,那就是配置较为复杂。Linux 上需要手动配置分配大页内存,而且会长期占用挤占常规内存空间,而 Windows 上还需要专业版或更高版本手动开启,用管理员权限执行应用,具体开启操作可以以系统+大页内存为关键字查询。

-XX:+ExplicitGCInvokesConcurrent

使得用 System.gc() 调用后可以不阻塞,并行的回收内存,与 GC 算法配置相关,建议多核环境启用。

-Xnoclassgc
-Xverify:none
  1. mc 常见使用情况下不需要类卸载,禁用类卸载可能可以改善 GC 表现,具体效果有待对比测试。

  2. 关闭字节码校验。虽然未知环境下开启可能导致安全性问题,对于游戏本体以及所有 mod 可信且完整的情况下,关闭校验几乎没有副作用,同时能改善启动速度。Java 13 因为安全性以及有 CDS 情况下这个选项作用下降,而弃用了该选项,不过直到当前版本 (Java 15),该选项依然能使用。

-XX:MaxInlineLevel=(内联层数)

Hotspot 对函数内联的层数有限制,不会内联层数过深。低版本 Java(包括 Java 11)默认层数是 9,而 Java 12~15 中某个版本已经将默认层数放宽到了 15(懒得挨个下12~14看哪个版本改的了,至少我的 OpenJDK 15 已经默认 15 了)。适当放宽该值大小(譬如改成 15)对峰值性能应该有所改善,会略微增加预热时间并占用更多代码缓存空间。

-XX:FreqInlineSize=325
-XX:MaxInlineSize=35
-XX:InlineSmallCode=2000
-XX:MinInliningThreshold=250

-XX:MaxRecursiveInlineLevel=1

限制内联的条件(热方法字节码大小限制,普通方法字节码大小限制,小方法编译结果大小限制,内联调用次数阈值,递归深度限制(包括互递归,这玩意会扫描调用栈)),有能力的用户可以反复调整测试来寻找最佳值,这与实际情况相关,一般用户别动了,放的太宽可能影响使缓存命中率下降导致性能下降。

-XX:-DontCompileHugeMethods

默认情况下 JVM 不会编译超过 8000 字节的方法,添加这个选项解除 JVM 的限制。
理论上应该能提升峰值性能,不过 mc 和 jdk 应该都没有太多这么大方法,提升应该比较小。
代价是增加预热时间,占用代码缓存空间,不过因为没太多大方法,实际应该影响也不大。

-XX:ReservedCodeCacheSize=(预留代码缓存区大小)

默认代码缓存区预留了 240m,正常情况下够用,不过加很多 mod 或者改参数都可能导致占用上升,真的不够用刘的话,可以用 -XX:ReservedCodeCacheSize=512m 指定预留 512m。

-XX:+AlwaysPreTouch

因为系统可能在程序实际访问内存时才真正分配物理内存,这个参数让 JVM 开启时预先访问一遍内存,可以让后续使用更平滑,但启动时间会增加(特别是 Java 8以及更低的版本不会并行访问,导致堆内存大的时候加这个参数启动非常非常慢,低版本慎用)

-XX:+UseBiasedLocking

Java 15 默认禁用且弃用了偏向锁优化,使用这个参数能强制打开,低版本也能用 -XX:-UseBiasedLocking 强制关闭。
偏向锁优化对于新程序收益较低,而且偏向锁撤销成本较高。一般用户建议保持默认,有条件的用户最好能打开/关闭对比测试一下。

-XX:+UseStringDeduplication

在使用 G1 GC 的情况下(Java 9 以上是默认值,Java 8 可以用 -XX:+UseG1GC 打开),这个选项会在 GC 时尝试把相同的字符串内部的数组合并。打开选项可能导致轻微性能下降,但对内存占用有所改善,建议打开。

-XX:-StackTraceInThrowable

禁用异常栈填充。改善抛出异常时性能,但是报错时很难分析,可以考虑开启,出现问题后关闭再复现。

-XX:-CompactStrings

关闭 Java 9 以上对字符串的内存优化。使用后部分操作可能性能略微提升,但缓存命中率下降,实际性能影响未知,内存占用可感知的升高。不建议开启,建议对比测试结果后酌情考虑。

-XX:AutoBoxCacheMax=(缓存最大值)

默认为128,设置为更大值让 Integer 缓存更多元素,略微减少后续内存分配,可以考虑填大一些的数(譬如20000).

该用户已被删除。