吸收了各种MC调优后再进行重新定制的MC JVM参数,将同时研究服务端和客户端的方案。
如果遇到问题或者有更好的调优,欢迎提出。
- 方便写入文件使用
-XX:+IgnoreUnrecognizedVMOptions
-XX:+UnlockExperimentalVMOptions
-Dfile.encoding=UTF-8
-Djava.awt.headless=true
-XX:+AlwaysPreTouch
-XX:+DisableExplicitGC
-XX:MaxDirectMemorySize=1024G
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:G1HeapRegionSize=8M
-XX:G1NewSizePercent=100
-XX:G1MaxNewSizePercent=100
-XX:+AlwaysTenure
-XX:-G1UseAdaptiveIHOP
-XX:InitiatingHeapOccupancyPercent=80
-XX:G1MixedGCLiveThresholdPercent=95
-XX:+ParallelRefProcEnabled
- 方便命令行使用
-XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -Dfile.encoding=UTF-8 -Djava.awt.headless=true -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:MaxDirectMemorySize=1024G -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=8M -XX:G1NewSizePercent=100 -XX:G1MaxNewSizePercent=100 -XX:+AlwaysTenure -XX:-G1UseAdaptiveIHOP -XX:InitiatingHeapOccupancyPercent=80 -XX:G1MixedGCLiveThresholdPercent=95 -XX:+ParallelRefProcEnabled
Note
服务端、客户端、Velocity通用
Tip
如果使用Java17+
还可以再添加--add-modules jdk.incubator.vector
- 方便写入文件使用
-XX:+IgnoreUnrecognizedVMOptions
-XX:+UnlockExperimentalVMOptions
-Dfile.encoding=UTF-8
-Djava.awt.headless=true
-XX:+AlwaysPreTouch
-XX:+DisableExplicitGC
-XX:MaxDirectMemorySize=1024G
-XX:-UseG1GC
-XX:+UseZGC
-XX:+ZGenerational
-XX:-ZProactive
--add-modules jdk.incubator.vector
- 方便命令行使用
-XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -Dfile.encoding=UTF-8 -Djava.awt.headless=true -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:MaxDirectMemorySize=1024G -XX:-UseG1GC -XX:+UseZGC -XX:+ZGenerational -XX:-ZProactive --add-modules jdk.incubator.vector
Important
需要Java21+
Note
服务端、客户端、Velocity通用
- 方便写入文件使用
-XX:+IgnoreUnrecognizedVMOptions
-XX:+UnlockExperimentalVMOptions
-Dfile.encoding=UTF-8
-Djava.awt.headless=true
-XX:+AlwaysPreTouch
-XX:+DisableExplicitGC
-XX:MaxDirectMemorySize=1024G
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:G1HeapRegionSize=8M
-XX:G1NewSizePercent=100
-XX:G1MaxNewSizePercent=100
-XX:+AlwaysTenure
-XX:-G1UseAdaptiveIHOP
-XX:InitiatingHeapOccupancyPercent=80
-XX:G1MixedGCLiveThresholdPercent=95
-XX:+ParallelRefProcEnabled
-XX:G1PeriodicGCInterval=1100
-XX:MinHeapFreeRatio=5
-XX:MaxHeapFreeRatio=5
- 方便命令行使用
-XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -Dfile.encoding=UTF-8 -Djava.awt.headless=true -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:MaxDirectMemorySize=1024G -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=8M -XX:G1NewSizePercent=100 -XX:G1MaxNewSizePercent=100 -XX:+AlwaysTenure -XX:-G1UseAdaptiveIHOP -XX:InitiatingHeapOccupancyPercent=80 -XX:G1MixedGCLiveThresholdPercent=95 -XX:+ParallelRefProcEnabled -XX:G1PeriodicGCInterval=1100 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=5
Important
需要Java12+
Note
可以不需要设置-Xms
或者-Xms设置到比-Xmx更小
Note
服务端、客户端、Velocity通用,但最适合客户端
- 方便写入文件使用
-XX:+IgnoreUnrecognizedVMOptions
-XX:+UnlockExperimentalVMOptions
-Dfile.encoding=UTF-8
-Djava.awt.headless=true
-XX:+AlwaysPreTouch
-XX:+DisableExplicitGC
-XX:MaxDirectMemorySize=1024G
-XX:-UseG1GC
-XX:+UseZGC
-XX:+ZGenerational
-XX:-ZProactive
-XX:ZCollectionIntervalMinor=1.1
-XX:ZUncommitDelay=2
--add-modules jdk.incubator.vector
- 方便命令行使用
-XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -Dfile.encoding=UTF-8 -Djava.awt.headless=true -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:MaxDirectMemorySize=1024G -XX:-UseG1GC -XX:+UseZGC -XX:+ZGenerational -XX:-ZProactive -XX:ZCollectionIntervalMinor=1.1 -XX:ZUncommitDelay=2 --add-modules jdk.incubator.vector
Important
需要Java21+
Note
可以不需要设置-Xms
或者-Xms设置到比-Xmx更小
Note
服务端、客户端、Velocity通用,但最适合客户端
-
按机器规格
客户端 服务端 低主频少核心 G1GC
G1GC
低主频多核心 ZGC
/G1GC
G1GC
/ZGC
高主频少核心 ZGC
ZGC
/G1GC
高主频多核心 ZGC
ZGC
-
按MC运行侧重
<=1.20 >=1.21 低GC负载 G1GC
G1GC
低GC停顿 ShenandoahGC ZGC
低内存占用 内存紧凑G1GC
内存紧凑ZGC
- 服务端
- Java <= 8
- 将JVM参数添加到启动命令行
- Java >= 9
- 方式1:将JVM参数添加到启动命令行
- 方式2:写入到文件里并在启动命令行引用
- 高版本纯ModLoader可以写入到
user_jvm_args.txt
- 使用jar启动的核心就写入一个自定义名字的txt文件
- 高版本纯ModLoader可以写入到
- Java <= 8
- 客户端
添加到启动器自定义JVM参数
需要注意删除启动器已有的-XX:+UseG1GC
Important
写入到txt时,Windows需要注意行尾必须为LF
Note
你是说,怎么在启动命令行引用?
比如在my_args.txt
里填写好了上面的参数
然后启动命令就这样写
java @my_args.txt -jar server.jar
@my_args.txt一定要在-jar之前
MC一般值得计算的Java内存有
- 堆内存(Xmx)
- 非堆内存(Metaspace,Code Cache,...)
- 外界API管理的内存
估算方式例如:
- 给服务端-Xmx4G,运行期占用大概是(堆4G + 非堆1G = 5G占用)
- 给客户端-Xmx4G,运行期占用大概是(堆4G + 非堆1G + OpenGL 2G = 7G占用)