Aikar: 调整JVM —— 非常有效的服务器启动参数 |
|
原文地址:
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对你来说没有任何坏处!
- 我建议使用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:
- 对于大内存分页来说,保证 Xms 和 Xmx 相同更重要!大内存分页需要为其指定所有内存,否则最终可能无效果。 操作系统不会使用此内存,因此请使用它。
- 另外此参数只支持Java8,不能在Java7上使用。
- -XX:+UseLargePagesInMetaspace
复制代码
作者: 森林蝙蝠
时间: 2019-5-22 08:36
这是spigot的东西,未必适用于forge/sponge和catserver。
作者: linbo10
时间: 2019-5-22 12:47
请问一下面板服可以不可以修改?使用
作者: 幻境雲達達
时间: 2019-5-22 13:28
部分面板有更改参数功能
作者: Freez!流年
时间: 2019-5-22 22:20
我修改启动参数后tps为-0.01 -0.03 -0.08 真的。。。。
核心版本为1.14.1的paperclip-37
作者: 幻境雲達達
时间: 2019-5-23 05:08
?????不会吧233
怎么会这样哦

作者: Freez!流年
时间: 2019-5-23 05:46
就感觉有点奇怪。。。内存我给的6G-6G
作者: 寂
时间: 2019-5-24 13:17
我觉得,这篇文章既然是面对腐竹的,来教他们调整他的服务器的教程,
直接翻译的详细说明未免有些太硬核了,专业名词对于不专业的腐竹可能难以理解。
建议按照自己的理解,写成通俗易懂的白话解释,再把原文翻译折叠起来,或许更好一些。
作者: 幻境雲達達
时间: 2019-5-24 13:18
对于我来说难度真的大。。理解不了。。
只能这样硬翻译。。
作者: ysy960108
时间: 2019-5-26 21:28
Spigot,Sponge之类的服务端都是Java应用,任何Java应用都可以用到JVM优化。
作者: omysho
时间: 2019-6-23 02:40
有些翻译问题,估计是楼主对 JVM 不是很熟悉:
New Generation -> 新生代(实际上应该是 Young Generation,原作者也写错了)
Old Generation -> 老生代
这两个都是 JVM 术语,指的是 JVM 内存结构的区域,具体可以看下图:
可以看到,实际上原作者也搞错了,其实并没有什么 New Generation,而应该是
Young Generation 。
顺便解释一下 G1NewSize Percent 这个设置的意义:
在 G1 垃圾回收算法中,上面的 Young Generation 的大小是通过算法动态调整的,这个参数指定的是 Young Generation 的最小百分比。
默认值是 5%,那为什么要调高这个值呢?JVM 把内存分了很多部分,当 Young Generation 里面的一个块(比如 Eden)分配满了之后,会触发一次 Minor GC 进行垃圾回收,然后把没有回收掉的内存放到下一个内存区域。垃圾回收会重新调整内存,于是机器就会卡顿。而对于 MC 来说,动态变化的东西很多,很多对象的内存都不会持续很长时间,因此有很多内存都是处于 Young Generation 的。如果 Young Generation 的内存过小,那么就会频繁触发 GC,导致卡顿。因此,这里直接给 Young Generation 一半的空间,减少其 GC 频率。
作者: 幻境雲達達
时间: 2019-6-23 08:38
感谢,这方面确实不懂,强行翻译出来自己都觉得丢人。
作者: 26790top
时间: 2019-6-27 07:51
感谢分享,码住码住

作者: 索隆嘎嘎嘎
时间: 2019-6-27 08:08
感谢分享
作者: Xiao_FD
时间: 2019-6-28 23:13
呃呃呃呃呃呃呃呃呃呃呃呃 不懂
作者: addc123
时间: 2019-7-3 13:24
我想请问一下对于多模组服务器这种对服务器cpu要求本来就很高的,占用也一直很满可以使用这种优化形式来进行么,不行的话有没有其他的更好的办法,谢谢楼主大大
作者: wodewode
时间: 2019-7-7 16:09
用ParNewGC和这个一起更舒服
作者: 2313043769
时间: 2019-7-8 11:55
CMD一下就消失了
作者: 简简爱
时间: 2019-7-19 19:14
提示:
作者被禁止或删除 内容自动屏蔽
作者: 贺兰兰
时间: 2019-8-2 10:25
哒哒牛逼233333很不错的教程,表示以后开服参数都用这个
另外大内存分页那个可能会有腐竹听不懂是啥吧,大内存分页的意思应该是指大的虚拟内存
作者: kilito午夜
时间: 2019-11-10 01:16
好难懂 这些专业名词
作者: 小小周尼玛
时间: 2019-12-31 10:40
请问Linux可以直接用这个参数吗
作者: Minecraft小橙
时间: 2020-1-20 04:40
提示:
作者被禁止或删除 内容自动屏蔽
作者: 零落Y_
时间: 2020-2-7 19:18
使用上面参数后
我服务器cpu利用率100% 内存利用率100%然后........服务器没了
作者: 稳定c
时间: 2020-2-8 04:28
你这个代码。。。我服务器直接炸了。。。。
阿里云的2H4G,,居然开不起来。。
作者: Lonely丶独独
时间: 2020-2-10 22:36
感谢分享!
作者: lfm0719
时间: 2020-2-13 17:34
在脚本最后加入pause可以看到报错是什么
作者: lfm0719
时间: 2020-2-13 17:36
请问我用64GB的内存,24线程cpu,最佳参数有没有变化?
作者: fengmowanxiang
时间: 2020-2-17 06:56
使用率100% 真的没问题吗
作者: 武者、年
时间: 2020-2-23 15:16
非常有用!!鞋鞋
作者: 武曲
时间: 2020-3-1 11:24
各位腐竹注意了!java -Xms6G -Xmx6G 这个地方一定要改成自己服务器的使用内存范围内,最好是留出一点非服务器使用的空间;要不然服务器会直接崩溃!,实测4G使用内存使用Xms3G -Xmx3G的话会崩,建议在2G以下,就是2048M。
作者: Rhythm
时间: 2020-3-13 11:48
这种参数显然是不适用于官服和forge的
会频繁触发gc导致tps大幅度下降
作者: 1430704465
时间: 2020-3-16 21:06
CPU倒着跑了?!

作者: 猥琐的小王
时间: 2020-3-31 22:36
what ** this ????
作者: 抱枕丶蓝晨
时间: 2020-4-1 08:39
感谢楼主的java参数
作者: 虚伪的悲催
时间: 2020-4-5 01:38
我可能是少打了什么东西
作者: 晴天娃娃_
时间: 2020-4-10 13:55
请问cpu方面如何优化,我这边内存方面占用不到8/1,主要是cpu一核有难8核围观
作者: GS_LemonAngel
时间: 2020-4-14 23:42
我vps16G 内存分配12G
不知道为什么一开内存占用就100%。。
作者: 随随缘
时间: 2020-7-21 22:05
cat有用嘛
作者: CrazyPeanut
时间: 2020-7-25 01:39
-XX:ParallelGCThreads
大佬 我看到其他人帖子里面提到这个参数 但你帖子里面没有
是为什么呢 这个东西到底有用没
作者: 洲爸比
时间: 2020-11-9 14:15
MCBBS有你更精彩~
作者: wunaimzy
时间: 2020-11-27 00:32
谢谢楼主教程
作者: 不正经的取经人
时间: 2020-11-27 14:52
支持支持
作者: 阿莎蕊雅同学
时间: 2021-1-3 04:19
提示:
作者被禁止或删除 内容自动屏蔽