少女祈祷中...

众所周知,Bugjump在MC高版本下的优化稀烂,如此辣鸡的优化对于想要开服但手头上却只有1c2g或是2c4g渣机的服主来说是一个非常大的负担。
对于spigot,paper等非原版端的优化MCBBS上已经有非常多的帖子,优化的方式基本上可以分为三类:

  • 修改bukkit.yml、spigot.yml和paper.yml等配置
  • 增加区块卸载和清理掉落物等优化插件
  • 修改Java启动参数和Java版本

但实际上,修改配置文件产生的效果并不明显,且过分的修改参数会对游戏体验产生影响。而有关区块卸载、清理掉落物、生物限制等优化插件在高版本下可以说是几乎没有。
Java启动参数其实对于服务器来说非常重要,但网络上对于启动参数网上的说法众说纷纭。本人会在未来对不同的参数进行测试,敬请期待。
本文通过三个测试来粗略地探究一下Java8和Java11下Hotspot和Openj9虚拟机对于Minecraft高版本服务端spigot端的性能影响
本次测试采用的Minecraft版本为1.16.5,所以并不支持Java17
Spigot版本为3096a-Spigot-9fb885e-af1a232
Java启动参数采用最简单的设置方式,仅仅设置初始堆和最大堆的大小

1
java -Xmx2G -Xms1G -jar spigot-1.16.5.jar nogui

Java选用以下四个版本:

  • Openj9 jre8
1
2
3
4
5
6
openjdk version "1.8.0_322"
IBM Semeru Runtime Open Edition (build 1.8.0_322-b06)
Eclipse OpenJ9 VM (build openj9-0.30.0, JRE 1.8.0 Linux amd64-64-Bit Compressed References 20220128_306 (JIT enabled, AOT enabled)
OpenJ9 - 9dccbe076
OMR - dac962a28
JCL - c1d9a7af7c based on jdk8u322-b06)
  • Hotspot jre8
1
2
3
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-8u312-b07-0ubuntu1~20.04-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
  • Openj9 jre11
1
2
3
4
5
6
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.10+9)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.24.0, JRE 11 Linux amd64-64-Bit 20210120_821 (JIT enabled, AOT enabled)
OpenJ9 - 345e1b09e
OMR - 741e94ea8
JCL - 0a86953833 based on jdk-11.0.10+9
  • Hotspot jre11
1
2
3
openjdk version "11.0.15" 2022-04-19
OpenJDK Runtime Environment Temurin-11.0.15+10 (build 11.0.15+10)
OpenJDK 64-Bit Server VM Temurin-11.0.15+10 (build 11.0.15+10, mixed mode

地图种子:1145141919810
开服系统:Ubuntu20.04
服务器配置:腾讯云2c4g6m
测试分为三个部分:无插件开服测试跑图测试多插件开服测试

无插件开服测试

说是无插件实际上还是存在一个插件:EssentialsX-2.19.0,该插件仅仅用于运行/gc命令获得tps和Allocated memory
测试方法:在存档已经生成后使用四个不同的Java版本启动mc服务器,使用腾讯云监控面板获得CPU和内存占用情况,同时使用/gc命令获得tps和游戏内Allocated memory

在测试的过程中不运行其他程序,此时腾讯云监控面板的数据可以近似为mc服务器独占

CPU占用率

非常明显,Hotspot相比于Openj9来说CPU占用率更低,这也反应在了开服时间上:Hotspot开服均在30-40s左右,而Openj9开服时间均在60s以上。
横向对比Java8和Java11,在虚拟机相同的情况下两者差距并不明显,但还是可以看出11比8占用率要高一些。

内存占用

非常明显,Openj9在内存上完爆Hotspot,这也符合Openj9的定位:以牺牲一部分性能的前提下极大降低内存占用率。
此外相同虚拟机下11内存占用率要比8要高出许多。

TPS

对于TPS,四个不同版本均在开服初期发生了明显的下降,但都能以几乎相同的速度恢复。

Allocated memory

该数据来源于/gc指令之中,个人感觉该参数还是比较迷的,仅供参考。

跑图测试

测试方法:在开服5分钟后首先连续跑图2分钟(约2600格,创造飞行),接着挂机13分钟
每次飞行方向均相同,测试完成后会将存档重置保证每次测试都会重新生成地形

内存占用

Openj9 jre11在这里发生了意外,在跑图1分钟时内存极速飙升,CPU也到了100%,服务器后台提示overload,个人认为这只是个别现象,但这也说明了Openj9可能出现的不稳定情况。
跑图时的内存和静态测试唯一不同的是Hotspot jre8,在跑图完成后内存仍然上升,但到了2000M后触发了内存回收,内存下降至1680M以下,这甚至比开服初期的内存还要低。经过反复测试后确认了该现象并不是偶然。

CPU占用率

无明显区别。

多插件开服测试

测试方法:和无插件开服测试相同
使用插件列表:

  • AdvancedNMotd-9.2.0
  • Boom-1.3.3
  • EastLandLog4jFixer-1.0.4
  • EssentialsX-2.19.0-dev+52-7245e84
  • EssentialsXChat-2.19.0-dev+52-7245e84
  • EssentialsXSpawn-2.19.0-dev+52-7245e84
  • HolographicDisplays-2.4.5
  • HolographicPlaceholders-2.1.2 Stable
  • LimitPillagers-3.0.1
  • MiaoBoard-2.6.0
  • MySkin-3.3
  • NekoMaid-0.2.5
  • PlaceholderAPI-2.10.9
  • PlugManX-2.2.9
  • ProtocolLib-4.5.1
  • spark-1.9.23
  • Uniporter-1.3.3
  • Vault-1.7.3
  • VillagerOptimiser-1.1.5
    使用存档为本人服务器存档,大小约3G,含多个强加载区块

CPU占用率

Openj9 jre11表现不佳,其余占用率相近。

内存占用

和无插件开服测试结果相同,Openj9的内存依然非常低。

TPS

四个版本TPS均会下降,但由于Hotspot启动速度约是Openj9两倍,所以TPS下降时间点也略微提前。

总结

Openj9相比于Hotspot性能会有略微的损失,具体表现为开服速度慢约两倍,CPU占用率会更高。但由此带来的是内存的大量降低。如果在TPS上并没有过大的压力但是内存紧俏的情况下建议还是 采用Openj9的虚拟机。
对于1.16版本的Minecraft,如果没有插件的特殊要求,建议使用java8而非java11。