|
原文地址: https://aikar.co/category/minecraft/
|
- 经过数周的学习JVM,参数和测试各种搭配,我总结出了一套高效的MineCraft垃圾收集系统。我已经在我的服务器上测试过这些,并且已经使用很多年了。然后我向大家宣布了我的研究,直到今天,许多服务器已经使用我建议的参数很多年了,并且帮助我改进了垃圾收集行为。
- 这些参数是大量研究的结果,并且在各种规模的服务器,各种类型的服务器中反复证明了自己是有效的!
- 我强烈建议使用这些参数来启动您的服务器,这些参数有助于你的服务器良好运行,不会出现大的垃圾回收高峰,CPU占用率可能过高,但是您的服务器TPS将会变得整体稳定。
- 如果这些参数帮助到你了,请考虑捐助我。
|
- 使用这些参数仅仅需要更改 Xmx 和 Xms 。这些参数应该适用于任何大小的内存,即使是500MB也同样适用。
- 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 -Dusing.aikars.flags=mcflags.emc.gs -jar paperclip.jar
|
- 如果你还没有使用Spigot的改进版Paperspigot,你真的需要换掉了!Paperspigot是一个比Spigot速度更快的版本,具有巨大的性能提升。它还有Bug和漏洞修复系统,许多新动能以及大量新的API供开发人员使用,具有更好的体验。
- Paperspigot是Spigot的替代品,每个Bukkit/Spigot插件的工作方式都相同,换用Paperspigot对你来说没有任何坏处!
- 【 下载Paperspigot | Paperspigot文档 | PaperspigotDiscord | “你为什么应该切换到Paperspigot”】
- Paperspigot是唯一一个能够以高性能运行MineCraft1.13服务器的
|
- 我建议使用10GB内存,无论你有多少玩家!如果你买不起10GB内存,你也要尽可能争取,但也要确保给你的系统留一些内存,G1GC在内存高的服务器上运行效果更好。
- 超过10GB内存可能会有点多余,但应该没问题,实际上很少有服务器真正需要10GB内存以上。
- 如果运行MC的内存为10GB或者更少,则不应该调整这些参数。
|
如果您你的玩家数量很多且使用超过10GB的内存,并且看到旧一代延迟峰值,您可能需要调整以下内容:
- -XX:G1MaxNewSizePercent=60
- -XX:G1NewSizePercent=40
|
1. -Xms 和 -Xmx 相同,为什么?
- 你不应该让 Xmx 完全占用你机器的全部内存,你的服务器会使用整个 Xmx 的内存。
- 然后,你应该确保除了Xmx之外,你的机器还有剩余内存,来运行服务器系统以及非MC服务器的东西。如果Xmx低于Xmx,你有未使用的内存!未使用的内存就代表浪费了内存。G1的内存越多,运行效果就越好。G1自适应地选择给每个区域多少内存来优化,如果您的内存超过了达到最佳暂停时间所需的内存,那么g1只会将多余的内存推到旧一代中,而不会对您产生影响。
- 改善GC行为的基本思想是确保对象尽快清除,随着G1的内存越多,你就能更好的保证将对象尽快清除。
- G1的运行方式与以前的垃圾收集器不同,能够更有效地处理更大的堆,它不会使用它不需要的内存,整个运行方式不同,并且没有太大的堆积,这是行业内广泛认可的,在G1下确保 -Xms 和 -Xmx 相同!
2. UnlockExperimentalVMOptions :
- 下面的一些选项会用到。
3. TargetSurvivorRatio:
- 我觉得你一定会看到这里,好消息!他实际上是一个很好地参数,此参数控制提升前可以使用多少生存空间,如果空间过满,就会推向旧一代,原因是能够处理内存分配峰值。然而,大多数情况下MC的分配率相当稳定,并且当它稳定时可以安全地提高这个值以避免出现问题。
4. G1NewSize Percent:
- 这是一个非常重要的参数,在CMS和其他Generations中,调整新的GC会产生固定大小的新GC,通常使用 -xmn 来设置。有了G1,就变好了!你现在可以为新一代制定整体所需范围的百分比,通过这些设置,我们告诉G1不要使用默认的5%用于新一代,而是至少给它50%!这样MineCraft具有极高的内存分配率,在一个有30个玩家的服务器上每秒最少800兆字节!
- 这在,意味着MC真的需要更多的关注新一代,以便能够支持这种分配率,如果你的新Gen太小,你将每秒运行Gen1-2次,这样真的很糟糕,你会感觉到很多卡顿,TPS也会很低,服务器无法保证GC的使用量。
5. G1MixedGCLiveThresholdPercent:
- 控制何时在新的GC集合中包含混合GC,以保证旧GC集合的整洁,而不执行常规的旧GC集合。当你的内存低于这个百分比的时候,旧的GC不会包含混合GC,混合GC不像完整的那么沉重,所以对老的GC集合进行小的增量清理可以减少内存使用量。
6. AlwaysPreTouch:
- AlwaysPreTouch 获取内存并在进程启动时保留,确保它是连续的,从而提高其效率。 提高了操作系统内存访问速度。
7. +DisableExplicitGC:
- 许多插件自认为他们知道如何控制内存,并尝试调用垃圾收集。 执行此操作的插件会触发完整的垃圾回收,从而引起极高的延迟峰值。 此参数禁止插件尝试执行此操作,从而保护您免受其错误代码的影响。
8.MaxGCPauseMillis=100:
- 此参数控制在为新一代指定内存使用的最小和最大范围。
- 这是您希望服务器暂停收集多长时间的“目标”。 100等于2个刻度,目标是最多丢失2个刻度。 这样会导致短暂的TPS下降,但是Spigot和Paper都可以立即弥补这一下降,这意味着它对您的TPS没有任何有意义的影响。 低于100ms的延迟玩家基本感觉不到。
9.+ParallelRefProcEnabled:
- 优化GC过程中使用多个线程进行。
|
- 对于大内存分页来说,保证 Xms 和 Xmx 相同更重要!大内存分页需要为其指定所有内存,否则最终可能无效果。 操作系统不会使用此内存,因此请使用它。
- 另外此参数只支持Java8,不能在Java7上使用。
- -XX:+UseLargePagesInMetaspace