本帖最后由 幻境雲達達 于 2021-2-4 21:24 编辑



Aikar: 调整JVM —— 非常有效的服务器启动参数

原文地址: https://aikar.co/category/minecraft/

介绍

  • 经过数周的学习JVM,参数和测试各种搭配,我总结出了一套高效的MineCraft垃圾收集系统。我已经在我的服务器上测试过这些,并且已经使用很多年了。然后我向大家宣布了我的研究,直到今天,许多服务器已经使用我建议的参数很多年了,并且帮助我改进了垃圾收集行为。
  • 这些参数是大量研究的结果,并且在各种规模的服务器,各种类型的服务器中反复证明了自己是有效的!
  • 我强烈建议使用这些参数来启动您的服务器,这些参数有助于你的服务器良好运行,不会出现大的垃圾回收高峰,CPU占用率可能过高,但是您的服务器TPS将会变得整体稳定。
  • 如果这些参数帮助到你了,请考虑捐助我。

要使用的Java启动参数

  • 使用这些参数仅仅需要更改 Xmx 和 Xms 。这些参数应该适用于任何大小的内存,即使是500MB也同样适用。
  1. 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:
  • 优化GC过程中使用多个线程进行。

使用大内存分页

  • 对于大内存分页来说,保证 Xms 和 Xmx 相同更重要!大内存分页需要为其指定所有内存,否则最终可能无效果。 操作系统不会使用此内存,因此请使用它。
  • 另外此参数只支持Java8,不能在Java7上使用。
  1. -XX:+UseLargePagesInMetaspace
复制代码


回复:

森林蝙蝠

这是spigot的东西,未必适用于forge/sponge和catserver。

2019-05-22 08:36:00

linbo10

请问一下面板服可以不可以修改?使用

2019-05-22 12:47:00

幻境雲達達

linbo10 发表于 2019-5-22 12:47
请问一下面板服可以不可以修改?使用

部分面板有更改参数功能

2019-05-22 13:28:00

Freez!流年

我修改启动参数后tps为-0.01 -0.03 -0.08 真的。。。。
核心版本为1.14.1的paperclip-37

2019-05-22 22:20:00

幻境雲達達

Freez!流年 发表于 2019-5-22 22:20
我修改启动参数后tps为-0.01 -0.03 -0.08 真的。。。。
核心版本为1.14.1的paperclip-37 ...

?????不会吧233

怎么会这样哦

2019-05-23 05:08:00

Freez!流年

XJue_DaDa 发表于 2019-5-23 05:08
?????不会吧233

怎么会这样哦

就感觉有点奇怪。。。内存我给的6G-6G

2019-05-23 05:46:00

我觉得,这篇文章既然是面对腐竹的,来教他们调整他的服务器的教程,
直接翻译的详细说明未免有些太硬核了,专业名词对于不专业的腐竹可能难以理解。
建议按照自己的理解,写成通俗易懂的白话解释,再把原文翻译折叠起来,或许更好一些。

2019-05-24 13:17:00

幻境雲達達

1582952890 发表于 2019-5-24 13:17
我觉得,这篇文章既然是面对腐竹来调整他的服务器的教程,
直接翻译的详细说明未免有些太硬核了,专业名词 ...

对于我来说难度真的大。。理解不了。。

只能这样硬翻译。。

2019-05-24 13:18:00

ysy960108

森林蝙蝠 发表于 2019-5-22 08:36
这是spigot的东西,未必适用于forge/sponge和catserver。

Spigot,Sponge之类的服务端都是Java应用,任何Java应用都可以用到JVM优化。

2019-05-26 21:28:00

omysho

有些翻译问题,估计是楼主对 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-06-23 02:40:00

幻境雲達達

omysho 发表于 2019-6-23 02:40
有些翻译问题,估计是楼主对 JVM 不是很熟悉:

New Generation -> 新生代(实际上应该是 Young Generation ...

感谢,这方面确实不懂,强行翻译出来自己都觉得丢人。

2019-06-23 08:38:00

26790top

感谢分享,码住码住

2019-06-27 07:51:00

索隆嘎嘎嘎

感谢分享

2019-06-27 08:08:00

Xiao_FD

呃呃呃呃呃呃呃呃呃呃呃呃 不懂

2019-06-28 23:13:00

addc123

我想请问一下对于多模组服务器这种对服务器cpu要求本来就很高的,占用也一直很满可以使用这种优化形式来进行么,不行的话有没有其他的更好的办法,谢谢楼主大大

2019-07-03 13:24:00

wodewode

用ParNewGC和这个一起更舒服

2019-07-07 16:09:00

2313043769

CMD一下就消失了

2019-07-08 11:55:00

简简爱

提示: 作者被禁止或删除 内容自动屏蔽

2019-07-19 19:14:00

贺兰兰

哒哒牛逼233333很不错的教程,表示以后开服参数都用这个
另外大内存分页那个可能会有腐竹听不懂是啥吧,大内存分页的意思应该是指大的虚拟内存

2019-08-02 10:25:00

kilito午夜

好难懂 这些专业名词

2019-11-10 01:16:00

小小周尼玛

请问Linux可以直接用这个参数吗

2019-12-31 10:40:00

Minecraft小橙

提示: 作者被禁止或删除 内容自动屏蔽

2020-01-20 04:40:00

零落Y_

使用上面参数后
我服务器cpu利用率100%  内存利用率100%然后........服务器没了

2020-02-07 19:18:00

稳定c

你这个代码。。。我服务器直接炸了。。。。
阿里云的2H4G,,居然开不起来。。

2020-02-08 04:28:00

Lonely丶独独

感谢分享!

2020-02-10 22:36:00

lfm0719


在脚本最后加入pause可以看到报错是什么

2020-02-13 17:34:00

lfm0719

请问我用64GB的内存,24线程cpu,最佳参数有没有变化?

2020-02-13 17:36:00

fengmowanxiang

使用率100% 真的没问题吗

2020-02-17 06:56:00

武者、年

非常有用!!鞋鞋

2020-02-23 15:16:00

武曲

各位腐竹注意了!java -Xms6G -Xmx6G 这个地方一定要改成自己服务器的使用内存范围内,最好是留出一点非服务器使用的空间;要不然服务器会直接崩溃!,实测4G使用内存使用Xms3G -Xmx3G的话会崩,建议在2G以下,就是2048M。

2020-03-01 11:24:00

Rhythm

这种参数显然是不适用于官服和forge的
会频繁触发gc导致tps大幅度下降

2020-03-13 11:48:00

1430704465

Freez!流年 发表于 2019-5-23 05:46
就感觉有点奇怪。。。内存我给的6G-6G

CPU倒着跑了?!

2020-03-16 21:06:00

猥琐的小王

what ** this ????

2020-03-31 22:36:00

抱枕丶蓝晨

感谢楼主的java参数

2020-04-01 08:39:00

虚伪的悲催


我可能是少打了什么东西

2020-04-05 01:38:00

晴天娃娃_

请问cpu方面如何优化,我这边内存方面占用不到8/1,主要是cpu一核有难8核围观

2020-04-10 13:55:00

GS_LemonAngel

我vps16G 内存分配12G
不知道为什么一开内存占用就100%。。

2020-04-14 23:42:00

随随缘

cat有用嘛

2020-07-21 22:05:00

CrazyPeanut

-XX:ParallelGCThreads
大佬 我看到其他人帖子里面提到这个参数 但你帖子里面没有
是为什么呢 这个东西到底有用没

2020-07-25 01:39:00

洲爸比

MCBBS有你更精彩~

2020-11-09 14:15:00

wunaimzy

谢谢楼主教程

2020-11-27 00:32:00

不正经的取经人

支持支持

2020-11-27 14:52:00

阿莎蕊雅同学

提示: 作者被禁止或删除 内容自动屏蔽

2021-01-03 04:19:00