本帖最后由 紅葉 于 2022-1-29 17:22 编辑
掷地有声
我不知道有什么优化办法,
能直接节约
43.3%
的内存占用,
或者是提升
36.9%
的cpu效率。
================================================================
为什么写这篇教程
优化是一个老生常谈的东西。
有些人使用过一些 调整jvm参数 的优化方案,
但是,有人想过
直接更换 JVM
吗?
有哪种优化方案,能直接减少 40% 的内存占用?
有哪种优化方案,能直接提升 20% 以上的CPU效率?
================================================================
温馨提示
换JVM不仅针对服务器,对客户端也是有作用的。
换jvm之前,先考虑升级java吧
。
java16的gc一定比java11好,java11的gc一定比java8好
本篇教程虽然对于任何规模的服务器都会有帮助,
但是 <300人才能看出非常显著的作用,千人服还是多加点内存吧。
================================================================
各JVM介绍及场景示例
JVM,就是 Java虚拟机,是运行Java代码用的软件程序
,关系着
运行效率
。
除
官版
以外,我挑选了一些已测评过,
稳定且好用
的版本介绍。
然后再介绍这些 JVM
适合的各种场景
建议一个一个看完,因为我把好东西留在压轴了。
Hotspot
最寻常的JVM,它是本篇的
参照物
。
你在 java.com 和 oracle 官网下载的都会是它。
实际上它可以算是“标准JVM”。
顺带一提,不知道为什么,Oracle的Hotspot比OpenJDK包含的Hotspot在CPU和内存效率上高些。
所以如果你坚持使用Hotspot,我建议你使用从Oracle官网下载的,而非从OpenJDK项目组下载的版本
数据(Hotspot 采用Oracle's测试):
================================================================
GraalVM
新生代
JVM。
我测了这个数据,但是不好,就没有推荐
但是有位大佬表示想看,所以我就也写一写
优点
:
CPU效率 和 内存占用 比Hotspot有微弱优势
缺点
:
内存占用 和 CPU效率 不稳定
详细的数据对比(与Hotspot):
|
使用 Paper 1.16.5 进行测试
无优化参数,玩家人数为1
(因为我找不到测试人员只好自己上了
结论:
各项都比Hotspot有小优势
内存占用比Hotspot稳定,CPU效率比Hotspot不稳定
注:mspt:每tick计算时间,一般与cpu效率有关,越小说明计算速度越快,20tps即mspt=50
当然最大是20tps,因为mspt低于50的时候服务端会延时使每秒计算20tick
|
提示:
我建议你看下面几个
Graal主要应用不是开mc服务器
它的提升主要在于把Java程序编译到native
但是不幸的是,minecraft服务器似乎不能。
下载:
================================================================
Eclipse OpenJ9
优缺点突出的
JVM。
由 Eclipse 基金会编译发行。
优点
:
占用内存
极少,
极少,
极少
。
经测试
,在用于开mc服务器的时候,可以节省
30~40%
左右的内存。
你要不是用来开mc服务器还可以更变态:
缺点
:
CPU性能比Hotspot
低
。
GC渐渐不如Hotspot了,调优也赶不上。
有可能和某些插件
不兼容
,
比如momojs
OpenJ9的
单线程优化
比Hotspot差
详细的数据对比(与Hotspot):
|
使用 Paper 1.16.5 进行测试
无优化参数,玩家人数为1
(因为我找不到测试人员只好自己上了
结论:
节约的内存最高达43.3%
不过cpu效率差
注:mspt:每tick计算时间,一般与cpu效率有关,越小说明计算速度越快,20tps即mspt=50
当然最大是20tps,因为mspt低于50的时候服务端会延时使每秒计算20tick
|
推荐应用场景及方法:
说白了就是以降低 约10% CPU效率 的代价
换取降低 约30%~40% 内存占用
适合
CPU性能足够
,而
内存不足
的场景
如 2核2g,4核4g等 CPU核心:内存G数 = 1:1 的服务器
一般在 Linux 服务器上使用更好,可以启用它的 metronome gc
注意,OpenJ9不兼容Hotspot的一些JVM参数,你可能需要另外配置
我这里推荐站友一篇文章,他的参数我一直在用,效果较好:
当然你也可以用在客户端上,客户端缺内存的情况倒是挺多的。
这样能使更多渣配玩家畅快游玩你的服务器。
下载:
================================================================
Azul Zulu
CPU效率和内存效率都
很高
的
JVM
由 Azul 公司编译发行,免费。人是专门搞 JVM 的公司。
优点
:
完美兼容
Hotspot JVM
CPU占用和内存占用
极其稳定
,
经测试,在用于开mc服务器的时候,
最多可以节省
20%
左右的内存,
同时提升了
10~20%
的CPU效率
传承 azul 家老手艺,gc 几乎
无暂停
解释:gc指java虚拟机回收内存中垃圾
缺点
:
无。
纯纯的各方面提升Hotspot。
详细的数据对比(与Hotspot):
|
使用 Paper 1.16.5 进行测试
无优化参数,玩家人数为1
(因为我找不到测试人员只好自己上了
结论:
内存方面节省了 20%左右
mspt也更好,在 10%~30% 左右
注:mspt:每tick计算时间,一般与cpu性能有关,越小说明计算速度越快,20tps即mspt=50
当然最大是20tps,因为mspt低于50的时候服务端会延时使每秒计算20tick
|
推荐应用场景及方法:
任何场景下使用均比 Hotspot 好
如果你不是很缺内存,可以选择zulu
如果你 tps 低,zulu更能拯救你。
下载:
悄悄话:
但是azul的主打产品是zing vm,一个收费的大爹。
如果我把zing也拉到这篇测试里那其他的jvm都没有什么测的必要了。
不过zing收费都是几千几万的。。。我无法给你们推荐,我也买不起
================================================================
Alibaba Dragonwell
CPU效率和内存效率都
较高
的
JVM
由阿里巴巴公司编译发行,免费。
优点
:
较为兼容
Hotspot JVM,不用担心兼容问题
CPU占用和内存占用
极其稳定
,
即使进行大规模跑图、生成实体、tnt爆炸也
几乎无波动
经测试,在用于开mc服务器的时候,
节省
20~40%
左右的内存,
提升
10~30% 左右
的CPU效率
缺点
:
兼容性不如Zulu,有极少数插件不兼容(虽然我还没有遇到)
有些端的java检测有bug,尽管dw提供了java17版本,但是会要求java16..
详细的数据对比(与Hotspot):
|
使用 Paper 1.16.5 进行测试
无优化参数,玩家人数为1
(因为我找不到测试人员只好自己上了
结论:
内存方面节省了 20%~40% 左右
mspt也更好,在 10%~30% 左右
注:mspt:每tick计算时间,一般与cpu性能有关,越小说明计算速度越快,20tps即mspt=50
当然最大是20tps,因为mspt低于50的时候服务端会延时使每秒计算20tick
|
推荐应用场景及方法:
大部分场景下使用比 Hotspot 好
内存占用减少 20%~40%
CPU效率提升 10%~30%
极其稳定,不用担心 tps 波动
下载:
我不推荐用java8 Release Alibaba_Dragonwell_8.7.7 · alibaba/dragonwell8 (github.com)
================================================================
|
这里是换jvm的教程,之前有人要我做那就做一下好了
|
================================================================
全部测试数据
应某位同学的需求测试了Kona,FDK,但是暂时不作推荐了
毕竟FDK并不是很多人能获取到,Kona的性能不是非常好。
优化建议
|
我推荐一下我自己用的
JVM 启动参数(aikar's):
请自行调整xms,xmx和服务器jar名称。
-
java -Xms6G -Xmx6G -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC -XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=50 -XX:G1MaxNewSizePercent=80 -XX:G1MixedGCLiveThresholdPercent=35 -XX:+AlwaysPreTouch -XX:+ParallelRefProcEnabled -jar paperclip.jar
复制代码
1.13以下:采用Dragonwell 8进行开服。服务器核心使用Paperspigot
1.14及以上:采用Dragonwell 11或8进行开服,服务器核心使用Purpur
1.17:采用Zulu 16进行开服,服务器核心使用Purpur
mod服请使用
arclight
核心,sponge如果你会配也行,我是1.12.2的时候用过sponge
|
================================================================
释疑
mspt是什么?
好好看文章
。
每tick计算时间,一般与cpu性能有关,越小说明计算速度越快
是一个缩写,全称是 microsecond per tick,
即 毫秒/游戏刻
为什么不给TPS,而给一个"mspt"为单位来衡量CPU效率?
你这个测试有没有水分?
我尽力保证。
采用相同服务器核心,没有加任何JVM优化参数,也没有调整服务端参数
每次测试都是生成好世界,
然后重启几次预热的
同时数据我也是等待适当时间后取得的平均数据,防止极值干扰
不过因为生成世界可能不同等等原因,我不能保证100%的公平,请见谅。
你为什么不直接传附件?github下载老慢了。
我没有权限传一个一百多M的附件。
================================================================
什么?你还想要一些建议?
你选对了JVM之后还想要更多的优化?
我建议你
升级Java版本
。
1.12.2及以前版本最高使用 Java8
1.13以上可以随意用,我建议你直接拉到 Java16
当然 Dragonwell 现在只有 11。。
为什么?因为高版本有
更多的 gc 策略
回收内存的效率更高,这样也更节省CPU
同时高版本的 JVM 的 JIT 策略也更完善
同时有些插件已经编译到高版本的 Java
高版本 Jvm 可以运行低版本的 Java字节码,反过来不行
================================================================
到此就结束啦!
趣闻:
鸣谢:
声明:
本文中所有数据都是本人自己测量的。
数据仅供参考,我不能保证在任何环境下都是这个结果。
引用本文任何部分请注明来源。
如果本贴帮到了您,请您回复、评分或者分享给他人,
使更多人能看到这个教程,感谢您。