这是针对 Minecraft 调整 Java 的指南。每个标志和调整都经过单独基准测试以测试回归,并根据 Java 默认值进行检查以避免冗余。
虽然这些调整显着减少了一些服务器和客户端的卡顿,但最多只能实现适度的 TPS 增益 + 最小的 FPS 增益,并且会稍微增加 RAM + CPU 使用率。它们并不能替代使用 Spark 或 Observable 等 mods 来清除滞后的东西。
对于问题等的不和谐:https://discord.gg/zeFSR9PnUw
所有标志均使用 Benchmark.py 脚本进行测试。请参阅正在进行的 Benchmarks.md。
对于 Minecraft 1.16.5 及更高版本,请使用 Java 17。一些启动器(例如 Curseforge 和 Prism Launcher)要求您在 1.16.X 上使用 Java 8,但 Minecraft 1.16.5+、所有 1.18+ mod 和大多数1.16.5 mod 都是兼容的与Java 17。
有时,Java 11 可以工作,而 Java 17 则无法工作。
1.12.2 及以下版本通常需要 Java 8。
Azul、Microsoft、Adoptium、Amazon 等公司的 Java 运行时基本相同。一些值得注意的例外:
Oracle GraalVM 企业版具有更积极的 Java 编译器。这是我个人用来运行 Minecraft 的,请参阅下面的 GraalVM 部分。
英特尔的 Clear Linux OpenJDK使用与任何其他 OpenJDK 相同的代码(使其高度兼容),但构建过程本身和依赖项针对较新的 CPU 进行了优化。通过swupd
、Distrobox 或 Docker 从 Clear Linux 的存储库中获取它。请注意,您必须回滚到 Java 17 版本,并且 Java 18 会恢复一些性能增强。
Azul 的 Prime OpenJDK非常快,因为它连接到 llvm,但它目前与大多数 mod 不兼容,并且仅适用于 Linux。从这里获取:https://docs.azul.com/prime/prime-quick-start-tar
Red Hat Java 8有 Shenandoah 垃圾收集器。它由免费电子邮件注册提供:https://developers.redhat.com/products/openjdk/download
IBM 的 OpenJ9在 Minecraft 中慢得多,并且使用与任何其他 Java 构建完全不同的标志,但它确实比基于 OpenJDK 的运行时消耗更少的内存。请参阅常见问题解答、基准文件夹和此要点以了解低内存消耗标志。
如果您不知道选择什么,我推荐 GraalVM EE(见下文)或最新的 Adoptium Java 17 JRE:https://adoptium.net/
Couleur 在这里维护着一份良好的 JRE 运行列表:https://rentry.co/JREs
这些优化标志可与任何 Java 11+ 版本一起运行。它们在服务器和客户端上工作:
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3
您必须将垃圾收集标志添加到这些 java 参数中。
-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m
最小和最大( -xms
和-xmx
)内存应设置为相同的值,如下所述:https://dzone.com/articles/benefits-of-setting-initial-and-maximum-memory-siz
一个例外是:如果您使用的是低内存系统,并且《我的世界》几乎占用了您所有的 RAM,请将最小内存设置为低于最大内存,以尽可能节省内存。
大小以兆字节 ( -Xms4096M
) 或千兆字节 ( -Xmx8G
) 为单位设置
分配太多内存可能会破坏 gc 或减慢 Minecraft 的速度,即使您有足够的空闲内存。分配太少也会减慢或破坏游戏。当 Minecraft 运行时,密切关注 Windows 任务管理器(或 DE 的系统监视器),并仅分配所需的空间(通常小于 8G)。 sparkc gcmonitor
会告诉您分配是否太高(暂停时间太长)或太低(频繁 GC,并在通知中显示内存不足警告)。
必须将垃圾收集标志添加到 Minecraft 服务器和客户端,因为默认“暂停”会停止并收集垃圾清单,因为客户端上会卡顿,服务器上会出现滞后。使用 Spark mod 中的/sparkc gcmonitor
命令来观察游戏中的暂停情况。任何老年代暂停都是不好的,年轻代 G1GC 收集应该不频繁,但足够短以至于难以察觉。
选择一组标志。我推荐在客户端上使用 Shenandoah ,在强大的 Java 17 服务器上使用 ZGC ,在 Graal 上或在 RAM 和内核较少的服务器/客户端上使用 G1GC :
ZGC 非常适合高内存/高核心数服务器。我无法测量它对服务器吞吐量的影响,并且绝对不会卡顿。然而,它比其他垃圾收集器需要更多的 RAM 和更多的内核。
不幸的是,它对我的(8 核/16 线程)笔记本电脑造成了显着的客户端 FPS 影响。请参阅基准测试文件夹中的“ZGC”基准测试。它在 Java 8 中不可用,并且在 Java 11 中的性能比 Java 17 低得多。
-XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:-ZProactive
启用它,但会比通常为其他 GC 分配更多的 RAM 和更多的ConcGCThreads
。请注意,ZGC 不喜欢 AllocatePrefetchStyle=3,因此将其设置为 1 会覆盖之前的条目。 U
Shenandoah 在客户端上表现良好,但在我的测试中降低了服务器吞吐量。使用-XX:+UseShenandoahGC -XX:ShenandoahGCMode=iu -XX:ShenandoahGuaranteedGCInterval=1000000 -XX:AllocatePrefetchStyle=1
启用它
请在此处查看更多调整选项。 “herustic”和“mode”选项对我来说没有太大变化(“compact”除外,您不应该使用它)。与 ZGC 一样,Shenandoah 也不喜欢 AllocatePrefetchStyle=3。
请注意,Shenandoah 不在 Java 8 中。它也不在任何 Oracle Java 版本中!如果您是 Java 8 用户,则必须使用 Red Hat OpenJDK 才能使用 Shenandoah:https://developers.redhat.com/products/openjdk/download
G1GC 是默认的垃圾收集器,也是 GraalVM 用户唯一可用的垃圾收集器。 Aikar 著名的 Minecraft 服务器 G1GC 参数在客户端上运行得很好,但有两个警告:它们通过将G1NewSizePercent
设置得这么高,有效地限制了MaxGCPauseMillis
参数,在某些客户端上产生长时间的口吃,并且它们收集旧代垃圾过于积极(因为客户端产生的垃圾远远少于已填充的服务器)。
这些与 aikar 标志类似,但具有更短、更频繁的暂停、不太激进的 G1 混合收集和更激进的背景收集: -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99
G1NewSizePercent
和MaxGCPauseMillis
可用于调整年轻代集合的频率/持续时间。如果您的设置出现任何老年代暂停,则应删除G1HeapWastePercent=18
。或者,您可以提高它并将G1MixedGCCountTarget
设置为 2 或 1,以使混合垃圾收集更加惰性(以更高的内存使用量为代价)。
服务器上更容易接受较长的暂停。这些标志非常接近 aikar 默认值:
-XX:+UseG1GC -XX:MaxGCPauseMillis=130 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=28 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=20 -XX:G1MixedGCCountTarget=3 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150
-XX:ConcGCThreads=[Some Number]
控制垃圾收集器允许使用的后台线程的最大数量,默认为logical (hyperthreaded) cores / 4
。如果需要,最新版本的 Java 将减少 gc 线程的数量。
在某些情况下(特别是使用 ZGC 或 Shenandoh),您希望将此线程上限增加到超过默认值。我建议在具有 4 个线程的 CPU 上使用“2”,在大多数其他 CPU 上使用[number of real cores - 2]
,但您可能需要使用此参数。如果它太低,垃圾收集将无法跟上 Minecraft,并且游戏会卡顿和/或开始消耗大量 RAM 并崩溃。如果它太高,可能会减慢游戏速度,特别是如果您运行的是 Java 8。
不需要像ParallelGCThreads
或JVMCIThreads
这样的其他“线程”标志,因为它们在 Java 8+ 中通过良好的自动设置默认启用。
注意:大页面需要 Windows 上的管理员权限。这是一个安全风险,如果您对此感到不舒服,应该跳过此部分。
启用大页面可以提高 Minecraft 服务器和客户端的性能。以下是一些启用它的精彩教程:
在 Windows 上,您必须以管理员身份运行 java 和启动器。这意味着检查javaw.exe
、 java.exe
和your launcher.exe
的“以管理员身份运行”兼容性复选框,否则大页面将默默失败。将-XX:+UseLargePages -XX:LargePageSizeInBytes=2m
添加到您的参数中。
在 Linux 上,您通常需要使用-XX:+UseTransparentHugePages
。要手动分配内存(以获得更大的性能提升),Red Hat 为类似 RHEL 的 Linux 发行版(如 Fedora、CentOS 或 Oracle Linux)提供了一个很好的教程:https://www.redhat.com/en/blog/optimizing -rhel-8-run-java-implementation-minecraft-server
检查并查看 Java 17 中的-Xlog:gc+init
java 参数是否支持大页面。
在任何 Java 版本/平台中,如果大页面不起作用,您将在日志中收到类似于以下内容的警告:
Java HotSpot(TM) 64 位服务器 VM 警告:JVM 无法使用大页面内存,因为它没有足够的权限来锁定内存中的页面。
GraalVM 是 Oracle 的一款新 Java VM,可以提高(经过修改的和普通的)Minecraft 的性能。虽然客户端 FPS 提升不大,但服务器端工作负载(例如块生成)可以获得 20% 以上的提升!
只有 GraalVM 企业版附带全套优化。通过 Oracle 的直接链接下载:
Windows AMD64(64 位):https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-windows-amd64-22.3.1.zip
Linux AMD64(64 位):https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-linux-amd64-22.3.1.tar.gz
Linux AARCH64(ARM 64 位):https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-linux-aarch64-22.3.1.tar.gz
Mac AMD64(64 位):https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-darwin-amd64-22.3.1.tar.gz
Windows AMD64(64 位):https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-windows-amd64-22.3.1.zip
Linux AMD64(64 位):https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-linux-amd64-22.3.1.tar.gz
Linux AARCH64(ARM 64 位):https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-linux-aarch64-22.3.1.tar.gz
Mac AMD64(64 位):https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-darwin-amd64-22.3.1.tar.gz
Windows AMD64(64 位):https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-windows-amd64-21.3.5.zip
Linux AMD64(64 位):https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-linux-amd64-21.3.5.tar.gz
Mac AMD64(64 位):https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-darwin-amd64-21.3.5.tar.gz
(AUR 和 Oracle Linux 存储库上也提供了部分 GraalVM EE 版本)
适用于 ARM Mac 的新版本需要在 Oracle 的主要下载页面上免费注册:https://www.oracle.com/downloads/graalvm-downloads.html
这些版本不是 Java 安装程序。您需要手动替换启动器的 Java 版本,或使用支持指定 Java 路径的 Minecraft 启动器。我推荐 ATLauncher、Prism Launcher 或 GDLauncher。指定 java 路径时,导航到 GraalVM 下载中的“bin”文件夹并使用“javaw.exe”或“java.exe”。
对于服务器,您需要将服务器启动 sh/bat 文件中的“java”命令替换为 graalvm java 的完整路径(用引号引起来)。
或者,您可以按照 Oracle 指南在系统范围内安装它:https://www.graalvm.org/22.2/docs/getting-started/#install-graalvm
GraalVM EE 22+ Java 17(或 Java 11)的参数:
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:AllocatePrefetchStyle=3 -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise
您必须将 G1GC 与这些参数一起使用。 GraalVM 目前无法与 ZGC 或 Shenandoah 配合使用。
GraalVM EE 22.3.0 修复了所有已知的 Minecraft 错误
如果您运行基于 Java 8 的旧版 GraalVM,则存在一些潜在问题:
VectorizeSIMD
使用 Optifine、Iris 或 Occulus 等着色器模块将实体变为不可见...但仅限于特定条件。这将在 GraalVM EE 22.3.0 中修复。请参阅:oracle/graal#4849
GraalVM CE 和 EE 都破坏了 1.16.5 Astral Sorcery 中的星座渲染。这可能与着色器错误有关。请参阅:HellFirePvP/AstralSorcery#1963
我还没有观察到任何服务器端错误。
如果您遇到任何其他可以追溯到 GraalVM 的 mod 问题,请创建一个 Github 问题或在 Discord 中发帖!一般来说,您可以通过禁用主要dgraal
优化标志来解决这些问题,或者通过使用Dgraal.PrintCompilation=true
找到正确的函数,并在找到错误编译的函数后使用-Dgraal.GraalCompileOnly=~...
解决它。
SpecialK 是一种类似于 ReShade 的“通用”Windows 模组,具有 2 个主要性能优势:
“智能”帧限制器,可减少卡顿、消除撕裂、节省电量并节省 CPU TDP,以便在需要时进行提升。它甚至可以与 VRR 或 Nvidia Reflex 结合使用。
称为 OpenGL-IK 的 OpenGL 到 DirectX11 包装器,可消除 Minecraft 的窗口模式开销,并启用其他功能(例如自动 HDR 或可调整大小的无边框窗口)。
在这里下载:https://wiki.special-k.info/en/SpecialK/Tools
添加您的 MC 启动器,然后选中“提升服务”复选框。然后导航到 javaw.exe 所在的 java bin 文件夹,并创建一个名为SpecialK.OpenGL32
的空文件。使用 SpecialK 启动器启动您的 Minecraft 启动器,然后启动器会将 SpecialK“注入”到 Minecraft 中。
您可以通过 SpecialK UI 创建 Minecraft 启动器的桌面快捷方式,以更加方便。
请务必关闭 VSync 和游戏中的 Minecraft 帧限制器。
一位用户报告运行 SpecialK 时 FPS 降低。如果您遇到这种情况,请通过 Discord 或 Github 告诉我!
启动 Minecraft 后,使用任务管理器将 Java 设置为在 Windows 中以“高于正常”进程优先级运行:
Linux 用户可以将sudo nice -n -10
添加到启动命令的开头,但请注意,低于 0 的 Nice 级别(“最大”为 -20)需要以sudo
运行 Minecraft。或者,在启动 Minecraft 后使用renice
命令来避免此安全风险。
这是寻找性能模组的绝佳存储库:https://github.com/NordicGamerFE/usefulmods
我会推荐更兼容的替代方案,例如 Sodium + Iris 或 Rubidium + Oculus,而不是 Optifine。
我建议使用 Java 17,否则,请使用 Java 11,除非绝对需要 8。但如果是的话,这些标志将与 OpenJDK8 一起使用,以及 Shenandoh GC(适用于客户端上的 Red Hat OpenJDK)或 G1GC(适用于其他一切):
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxInlineLevel=15 -XX:MaxVectorSize=32 -XX:+UseCompressedOops -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -Dgraal.CompilerConfiguration=community
x86 Java 8 用户(也称为大多数 Java 8 用户)可以添加以下附加参数:
-XX:+UseXMMForArrayCopy
您还可以从 Oracle 站点上的 21.X 部分获取 Java 8 版本的 GraalVM EE,并使用以下参数:
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:AllocatePrefetchStyle=1 -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -XX:+EnableJVMCI -XX:+UseJVMCICompiler -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise -Dgraal.UsePriorityInlining=true -Dgraal.Vectorization=true -Dgraal.OptDuplication=true -Dgraal.DetectInvertedLoopsAsCounted=true -Dgraal.LoopInversion=true -Dgraal.VectorizeHashes=true -Dgraal.EnterprisePartialUnroll=true -Dgraal.VectorizeSIMD=true -Dgraal.StripMineNonCountedLoops=true -Dgraal.SpeculativeGuardMovement=true -Dgraal.InfeasiblePathCorrelation=true
如果运行着色器,请务必将-Dgraal.VectorizeSIMD
设置为false
。
在 Clear Linux 上运行您的 Minecraft 服务器!它是迄今为止最优化的开箱即用的 Linux 发行版,并且它还有一些其他不错的功能(如无状态配置系统)。它还可以很好地在 AMD/Intel GPU 上运行客户端:https://web.archive.org/web/20220916090057/https://docs.01.org/clearlinux/latest/tutorials/multi-boot/dual-boot- win.html
Oracle Linux 对于服务器来说也是一个不错的选择,因为它开箱即用,优化良好,并且可以通过包管理器使用 Graalvm EE。对于客户来说,基于 Arch 的发行版(例如 CachyOS 或 EndeavorOS)非常出色,因为它们对大多数硬件都有广泛支持。
确保 Minecraft 客户端使用的是您的独立 GPU!检查 F3 选项卡,并强制 Minecraft 在“ Windows 图形设置”中使用它,而不是AMD/Nvidia 控制面板(因为它们似乎不再工作)。
Minecraft 客户端 Linux 用户应该查看 https://github.com/Admicos/minecraft-wayland
关闭后台的所有内容,包括 Discord、游戏启动器和浏览器! Minecraft 是资源密集型的,不像其他应用程序那样产生 CPU 中断或占用磁盘 I/O、RAM 等。
Java 18/19 有一些模组不兼容。据报道,他们可以使用一些模组包,但我不确定是否有任何性能优势。
Java 调整提高了服务器性能和客户端卡顿,但它们并没有大幅提高客户端平均 FPS(如果有的话)。为此,运行正确/最新的图形驱动程序和性能模块更为重要:https://github.com/NordicGamerFE/usefulmods
本指南假设您在运行 Minecraft 时有一点空闲 RAM。如果您的设置受到 RAM 限制,请尝试特别删除以下参数: -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M
,然后尝试服务器G1GC 争论。
正如其声誉所示,IBM 的 OpenJ9 确实节省了 RAM,但在我的测试中,服务器 chunkgen 的速度慢了 30% 以上。如果有任何标志使其与 OpenJDK 竞争,请在 Discord 或此处告诉我:#9
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions
只是解锁更多要使用的标志。这些可以通过-XX:+PrintFlagsFinal
和-XX:+JVMCIPrintProperties
标志列出,请参阅标志转储-XX:G1MixedGCCountTarget=3
:这是“混合”GC 中目标的 oldgen gc 块数。这些混合收集速度要慢得多,而且 Minecraft 客户端不会很快生成 oldgen,因此我们可以将此值降低到 3、2 甚至 1,以获得更短的 GC 暂停时间。-XX:+UseNUMA
启用多插槽系统的优化(如果适用)。不确定这是否适用于 Ryzen 或 Epyc 等 MCM CPU,但如果不适用,它会自动禁用。-XX:-DontCompileHugeMethods
允许编译巨大的方法。 Modded Minecraft 有其中一些,我们不关心更高的后台编译器 CPU 使用率。-XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000
启用较大方法的优化。请参阅:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8058148-XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M
为编译后的代码保留更多空间。所有部分都必须“加起来”到ReservedCodeCacheSize
。我观察到,经过修改的 Minecraft 使用XX:+PrintCodeCache
时会遇到默认的 250 MB 限制,但即使未填充,较大的大小也会使编译代码的驱逐变得不那么激进。-XX:NmethodSweepActivity=1
(默认 10)将“冷”代码在缓存中保留更长时间。也不存在“填满”代码缓存的风险,因为冷代码在填满时会被更积极地删除。-XX:+UseStringDeduplication
-XX:+UseFastUnorderedTimeStamps
避免系统调用来获取时间。其影响因系统而异,但我们并不真正关心记录时间戳的准确性。-XX:+UseCriticalJavaThreadPriority
任何东西都不应抢占 Minecraft 线程。 GC 和编译器线程可以等待。-XX:ThreadPriorityPolicy=1
使用更广泛的线程优先级。在 Linux 上需要 sudo 才能工作。有些 JDK(例如 Graal)默认启用此功能,但有些则不然。-XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150
:优化G1GC的并发收集线程,仍在测试中: https://research.spec.org/icpe_proceedings/2014/p111.pdf-XX:G1RSetUpdatingPauseTimePercent=0
:我们希望所有这些工作在 G1GC 并发线程中完成,而不是在暂停中完成。-XX:G1HeapWastePercent=18
不要费心从老一代收集,直到它超过这个百分比。这可以避免触发较慢的“混合”年轻代 GC,这很好,因为 Minecraft(具有足够的内存)不会那么快地填充旧代。想法来自:https://www.reddit.com/r/Minecraft/comments/k9zb7m/tuning_jvm_gc_for_singleplayer/-XX:GCTimeRatio=99
作为目标,1% 的 CPU 时间应该花在垃圾收集上。默认值为 12,这似乎太低了。 Java 8 的默认值为 99。-XX:AllocatePrefetchStyle=3
每个缓存行生成一个预取指令。更积极的预取通常对于具有大缓存的较新 CPU 有用。看来要打破ZGC了。请参阅:https://github.com/openjdk/jdk/blob/bd90c4cfa63ba2de26f7482ed5d1704f9be9629f/src/hotspot/share/opto/macro.cpp#L1806-Dgraal.LoopRotation=true
非默认优化,可能很快就会默认。-Dgraal.TuneInlinerExploration=1
花更多时间做出内联决策。对于 Minecraft,我们希望 C2 编译器尽可能缓慢且激进。-Dgraal
参数默认启用,并且要么作为健全性检查、用于调试,要么作为故障安全(例如,如果有人在不知情的情况下使用其他一些标志禁用了 JVCMI)。-XX:MaxInlineLevel=15 -XX:MaxVectorSize=32
)只是从 Java 17 默认值复制而来。其他(如+AggressiveOpts
)仅在某些较旧的 Java 8 版本中不是默认的。-Dgraal.BaseTargetSpending=160
(默认 120)和 OpenJDK 中的一些其他标志。具有较大缓存的 CPU 可能会从中受益。-XX:+AlignVector -XX:+OptoBundling -XX:+OptimizeFill -XX:+AlwaysCompileLoopMethods -XX:+EnableVectorAggressiveReboxing -XX:+EnableVectorSupport -XX:+OptoScheduling -XX:+UseCharacterCompareIntrinsics -XX:+UseCopySignIntrinsic -XX:+UseVectorStubs
-Dgraal.LSRAOptimization=true
-Dgraal.OptWriteMotion=true
和graal.WriteableCodeCache=true
,看起来不稳定,但在 GraalVM 22.3.0 中可能更稳定G1HeapWastePercent
值。-XX:+PrintFlagsFinal
和-XX:+JVMCIPrintProperties
标志来转储标志描述/默认值。