本篇教程由作者设定使用 CC BY-NC-SA 协议。

这套参数是我逛了好久中外各种关于JVM参数讨论的帖子总结而成的,参数如下:

-d64 -XX:+AggressiveOpts -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSConcurrentMTEnabled -XX:ParallelGCThreads=8 -Dsun.rmi.dgc.server.gcInterval=3600000 -XX:+UnlockExperimentalVMOptions -XX:+ExplicitGCInvokesConcurrent -XX:MaxGCPauseMillis=50 -XX:+AlwaysPreTouch -XX:+UseStringDeduplication -Dfml.ignorePatchDiscrepancies=true -Dfml.ignoreInvalidMinecraftCertificates=true -XX:-OmitStackTraceInFastThrow -XX:+OptimizeStringConcat -XX:+UseAdaptiveGCBoundary -XX:NewRatio=3 -Dfml.readTimeout=90 -XX:+UseFastAccessorMethods

注意有些启动器会添加自带的G1GC的优化参数,把这个参数添加过后会导致参数冲突从而无法启动游戏。解决方法:找一找你的启动器有没有关闭添加默认参数的按钮,如果有就关掉。(比如HMCL填参数的地方下方就有“不添加默认的JVM优化参数”的按钮,只有打开了才能启动游戏。)

进行以上步骤后,如果发现在启动器中更改内存没有用,请在参数的最前面加上-Xms10240M -Xmx10240M 两个参数,并将其中的10240M改为你要分配的值。

推荐搭配Sampler使用,可以使用/sampler gc 命令手动GC(内存清理),由于使用了 -XX:+ExplicitGCInvokesConcurrent 参数,这样的显式GC调用也不会卡住你的游戏,同时能释放大量的内存。

另外推荐安装FoamFix以降低内存占用

仅适用于Hotspot版Java 8 8u271,未在其他版本测试,OpenJ9兼容性未知,如果出现问题请将Java更新到8u271版本。

实测1.12的500+模组整合包,这套参数相比使用G1GC的常用优化参数可以极大降低卡顿和跳帧情况,平均帧数提高了10左右。同时内存占用也提高了(分的内存就是要多用),然而似乎在内存即将爆满的情况下也不会明显降低帧率,试了下分配6G内存进游戏,即使内存占用长时间在80%以上还能保持高帧率运行不掉帧。

一个小bug: 使用此参数时有一定概率导致一些游戏模型丢失(比如女仆手办、无线合成终端)之类,过一段时间或者切换维度后会恢复正常。