Spigot(Bukkit)Java启动选项无需调整太多


如标题所述。这是我在VPS上运行Spigot时执行各种Java启动选项的故事。

根据官方Wiki,引导选项通常是可以的

启动脚本是在Spigot Installation中编写的。
下面以Linux版本为例。

start.sh

1
2
#!/bin/sh
java -Xms1G -Xmx1G -XX:+UseConcMarkSweepGC -jar spigot.jar

内存池的1GB初始分配大小对应于-Xms1G,而1GB的最大分配大小对应于-Xmx1G。
但是,这仅限于具有足够内存的环境。

在内存有限的环境中执行

如果使用VPS等部署具有1GB内存的存储盒,则内存将被系统吸收数百MB。实际上,Spigot可能无法与上述启动脚本一起使用,因此自然分配虚拟内存并交换Windows中调用的虚拟内存。 (*本节假定基于Linux的操作系统。)
首先,大约4GB就足够了,如果有必要,您可以稍后添加它。使用VPS,磁盘容量有限,因此我认为该区域是安全的。
但是,构建工具可能不适用于OutOfMemoryError。由于我的环境是如此,所以我乖乖地在本地构建它。

我通过将内存分配给Maven解决了它。

build.sh

1
2
3
#!/bin/sh
export MAVEN_OPTS="-Xmx2G -XX:+UseG1GC"
java -Xmx2G -XX:+UseG1GC -jar BuildTools.jar

效率较低

如果内存池的初始分配大小为1GB,将使用交换内存。就像我在上面写的那样,我认为系统将使用大约数百MB,其余大约700 MB左右。
如果初始分配大小为1GB,剩余的700MB,则将使用约300MB的交换内存。

使用交换内存意味着对磁盘进行读写。
如果延迟写入,可能会导致延迟或倒带。

如果可能,请删除初始分配选项-Xms *,或者使用一半-Xms512M以及大约512MB的初始分配来观察情况。

顺便说一句,在我的环境中,磁盘的读写受到抑制。
vps_4_1.png

可以关闭(擦除)或减小

-Xms *,但这不是问题。
如果先保留内存,则可以更快地使用内存(在程序中创建实例等时),但这不是必需的选项。如果您有足够的内存,则没有理由将其关闭。

垃圾收集可以保留为CMS吗?

垃圾收集的简要说明是释放不再需要的内存。这是清理内存的地方。

参考:

  • 垃圾收集如何在5分钟内起作用| geechs杂志-关于垃圾收集,本文非常容易理解。
  • 整理Java VM垃圾收集
  • 如何检查OutOfMemoryError --Qiita

中,CMS是并发标记扫描的缩写,并且是垃圾收集算法之一。
这也是一种清洁方法。我们将通过称为CMS的清理方法释放内存。

顺便说一句,上面编写的启动脚本具有-XX:UseConcMarkSweepGC作为使用此CMS的选项。

似乎CMS没什么问题,但是我担心Full GC在我的环境中会发生一些。 OutOfMemoryError尚未发生,但可能会膨胀。

实际上,CMS将来可能无法使用。
请阅读续页以获取详细信息。

CMS不应过季

不要使用增量模式(-XX:CMSIncrementalMode)。

CMS收集器可以在并发阶段为增量的模式下使用。如前所述,垃圾回收器线程在并发阶段正在使用一个或多个处理器。增量模式旨在通过定期停止并发阶段并使处理器返回到应用程序来减轻长期并发阶段的影响。

由于该"定期停止",可能发生了滞后等。
宁可

增量模式已在Java SE 8中弃用,并且在以后的主要版本中可能会删除。

因为它说

,所以我不使用增量模式。

来源:https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/cms.html

黑风访问G1GC

垃圾第一垃圾收集器,简称G1GC。
这也是垃圾收集算法之一。但是,这是一个新人!

它是从Java7(java7u4)正式实现的,并且被Java9用作标准。 CMS已弃用。

垃圾优先(G1)垃圾收集器旨在替代CMS的大多数用法。

将来是否有可能通过更换CMS删除CMS?

来源:

  • Java SE 7 Update 4发行说明
  • Java平台,标准版Oracle JDK 9,新功能,版本9

设置有些困难,因此默认设置很好,但是

参考:

  • 垃圾首先清理垃圾收集器
  • JVM调整:如何使用G1GC和从CMS GC迁移

G1 GC是一种自适应垃圾回收器,可以在不更改默认值的情况下有效使用和工作。

首先,请看一下情况,不要添加任何内容,因为它是"有效的"。

摘要:不要使用要求"优化"或"加速"的启动脚本

只要分配了足够的内存池,Java VM就会自动完成其余的工作。伟大的!

JVM对于垃圾收集器,堆大小和运行时编译器具有不同的特定于平台的默认选择。这些选择无需太多命令行调整即可满足不同应用程序的需求。此外,基于行为的调整会动态调整堆大小,以适合您的应用程序的特定行为。

来源:人体工程学

处理速度不会超出机器的规格范围。而是,该文章告诉您,在不了解Java启动选项的情况下添加奇怪的Java启动选项会导致效率低下,从而导致延迟和倒带。

另外,要使用的是CMS还是G1GC,取决于环境。
就像我在上面写的,CMS在Java 9中已被弃用,因此转移到G1GC可能是一个好主意。
但是,在低规格的环境中,G1GC感到有些刺耳(因为G1GC的CPU使用率比CMS高)。请阅读以下参考文章,以了解原因!

参考:

  • 主要是并发收集器
  • Java垃圾收集-软件工程-Torutk

使用G1GC时,请使用以下选项。在Java 9及更高版本中,这只是一个咒语。

start.sh

1
2
#!/bin/sh
java -Xms1G -Xmx1G -XX:+UseG1GC -jar spigot.jar

G1GC的功能之一是"暂停时间目标"。
默认值为200毫秒,这非常低,但是在我的环境中,我认为可以通过将其更改为50毫秒并设置较小的延迟来最小化延迟。

start.sh

1
2
#!/bin/sh
java -Xms1G -Xmx1G -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -jar spigot.jar

如果要调整,最好将其保持在此水平。感觉有一点安慰剂有效。但是,如果它太小则不好,因此,如果有问题,请尝试增加它。
当前,在我们的环境中不会发生Full GC。

既然有各种各样的事情,如果有任何错误,我欢迎Tsukkomi。
忽略其他"我该怎么办?"请注意。