2024-05-23 23:00:57 +08:00
|
|
|
|
---
|
2024-05-23 13:14:07 +08:00
|
|
|
|
sidebar_position: 6
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
# 什么是启动脚本
|
|
|
|
|
|
2024-05-23 23:40:12 +08:00
|
|
|
|
启动脚本主要部分就是设置 Java 参数设置。
|
|
|
|
|
|
|
|
|
|
*对于 Windows 服务器来说,启动脚本是 `.bat` 后缀的文件,对 Linux 服务器而言,启动脚本是 `.sh` 后缀的文件。*
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
|
|
|
|
`sh` 和 `bat` 是两种不同操作系统环境下用于执行脚本的文件扩展名,它们的主要区别在于运行环境、语法的不同:
|
|
|
|
|
|
2024-05-23 23:00:57 +08:00
|
|
|
|
## SH (Shell Script)(Linux)
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
|
|
|
|
* 语法: SH脚本使用Shell命令和控制结构,支持条件判断、循环、函数定义等高级编程特性。
|
|
|
|
|
* 执行方式: 在终端通过 `./script.sh` 或 `sh script.sh` 来执行(确保脚本具有执行权限)。
|
|
|
|
|
|
2024-05-23 23:00:57 +08:00
|
|
|
|
## BAT (Batch File)(Windows)
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
|
|
|
|
* 语法: BAT脚本包含一系列DOS命令和批处理命令,支持简单的条件判断和循环,但相比SH脚本,其功能和灵活性较低。
|
|
|
|
|
* 执行方式: 双击文件或者在命令提示符下输入 `script.bat` 来执行。
|
|
|
|
|
|
|
|
|
|
# 什么是启动参数
|
|
|
|
|
|
|
|
|
|
启动参数(也称 Flag)主要分为3类:
|
|
|
|
|
|
|
|
|
|
* 标准参数(-):所有的 JVM 实现都必须实现这些参数的功能,而且向后兼容;
|
|
|
|
|
* 非标准参数(-X):默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容;
|
|
|
|
|
* 非Stable参数(-XX):此类参数各个 JVM 实现会有所不同,将来可能会随时取消,需要慎重使用;
|
|
|
|
|
|
2024-05-23 22:10:52 +08:00
|
|
|
|
以本人经常使用的基于 Aikar Flag 举个例子,该 Flag 基本是通用的,适用于 4G - 20G 内存,若想更改内存大小只需要更改 Xms 和 Xmx 相同即可:
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
2024-05-23 22:10:52 +08:00
|
|
|
|
java -Xms12G -Xmx12G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -DPaper.printStacktraceOnBadPluginClassAccess=false -Dpaper.alwaysPrintWarningState=false -Duser.timezone=GMT+08 -Dfile.encoding=UTF-8 -Xlog:async --enable-preview --add-opens=java.base/java.lang=ALL-UNNAMED --add-modules=jdk.incubator.vector -jar 核心名.jar --nogui
|
2024-05-23 13:14:07 +08:00
|
|
|
|
```
|
|
|
|
|
|
2024-05-23 22:10:52 +08:00
|
|
|
|
:::warning
|
|
|
|
|
|
|
|
|
|
**不要忘记改最后的“核心名.jar!**
|
|
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
2024-05-24 18:58:42 +08:00
|
|
|
|
:::warning
|
|
|
|
|
|
|
|
|
|
**不要忘记改最后的“核心名.jar!**
|
|
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
2024-05-23 13:14:07 +08:00
|
|
|
|
有点长,但是我会一个个讲解他们的作用
|
|
|
|
|
|
|
|
|
|
## 基础
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
java -Xms12G -Xmx12G -jar 核心名.jar nogui
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
| 参数|说明 |
|
|
|
|
|
| :-----------* | :-----------* |
|
|
|
|
|
| -Xmx[size] | 设置最大内存大小,默认为物理内存的1/4或者1G,需大于2M,可以指定单位K/M/G|
|
|
|
|
|
| -Xms[size] | 设置最小内存大小,默认为物理内存的1/64,需大于1M |
|
|
|
|
|
| -jar | 为 Java 指定需要运行的 Jar 程序 |
|
2024-05-24 18:58:42 +08:00
|
|
|
|
| ----nogui | 关闭服务器 GUI,少量性能提升,大多数人不需要用到 |
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
|
|
|
|
:::info
|
|
|
|
|
|
|
|
|
|
1. 无论什么时候,分配内存时一定要多预留15%左右内存,如服务器还剩余 10G 内存, 不要将 -Xms 设置到大于 9G 的内存,否则会很危险。
|
|
|
|
|
2. 在 G1GC 模式下,尽量保证 Xmx = Xms 因为如果二者不同 JVM 需要更多的内存时候,JVM需要申请更多内存,这个过程的耗时会导致顿卡。
|
|
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
## 性能相关配置
|
|
|
|
|
|
|
|
|
|
我们这里使用的内存回收器为 `G1 (Garbage First)` ,所以我们要在启动参数中加上 `-XX:+UseG1GC` ,这样我们就能使用该回收器了
|
|
|
|
|
|
|
|
|
|
光设置使用该回收器也不行,还要对他进行一些配置,下面就会对配置参数进行讲解,你并不需要完全了解下面参数的意义与说明,可以跟着我的推荐值进行设置。
|
|
|
|
|
|
2024-05-23 22:10:52 +08:00
|
|
|
|
### G1GC 各种参数的说明:
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
2024-05-23 23:40:12 +08:00
|
|
|
|
如果你是新手,或暂时没有性能问题,或者只是不感兴趣,这部分可以不看,但如果你感兴趣的话...
|
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
<summary> 这里有适合好奇宝宝的完整说明 </summary>
|
|
|
|
|
|
2024-05-23 22:10:52 +08:00
|
|
|
|
| 参数 | 说明 |
|
|
|
|
|
| :--------------------------------- | :----------------------------------------------------------- |
|
|
|
|
|
| -XX:+UseG1GC | 使用 G1 GC。 |
|
|
|
|
|
| -XX:G1NewSizePercent | 设置新生代区域大小。由于 Minecraft 拥有大量短期对象,所以需要更多新生代空间,而新一代太小会导致服务器顿卡。 |
|
|
|
|
|
| -XX:G1MaxNewSizePercent | 设置最大新生代区域大小。 |
|
|
|
|
|
| -XX:MaxGCPauseMillis | 设置一个 GC 暂停时间期望目标,这是一个非硬性目标,JVM 会尽可能的保证这个目标。 |
|
|
|
|
|
| -XX:G1HeapWastePercent | 当堆中有超过这个百分比的内存是空闲或可回收的,它会触发一次 Mixed GC,从而尽量避免 Full GC。 |
|
|
|
|
|
| -XX:InitiatingHeapOccupancyPercent | 设置了开始 Mixed GC 时堆的占用率阈值,默认为 45%, 降低该值可以更早地开始回收老年代空间,避免老年代快速增长导致较长的 GC 停顿。 |
|
|
|
|
|
| -XX:G1RSetUpdatingPauseTimePercent | 我们推荐设置为默认值的一半即 5 %,以使更多时间并发以减少暂停持续时间。 |
|
|
|
|
|
| -XX:G1MixedGCLiveThresholdPercent | 调节何时将区域合并至年轻代混合 GC 中,调高该值可以减少 OldGC 发生的频率,而 Mixed GC 不那么消耗资源也不容易导致长时间的卡顿,因此我们推荐设置为 90。 |
|
|
|
|
|
| -XX:G1ReservePercent | Minecraft 新版本内存分配非常快,GC 时候可能缺乏足够空闲内存进行数据迁移。为了保证内存预留,我们推荐设置为默认值的两倍即 20。 |
|
|
|
|
|
| -XX:MaxTenuringThreshold | 通过将其设置为1,限制新生代到老年代的晋升,在不影响性能的前提下,成功规避了新生代的不合理晋升,而长期存活对象的 GC 将在混合 GC 周期中,可有效防止 Minecraft 短期对象过早进入老年代,提高了整体效率。 |
|
|
|
|
|
| -XX:G1MixedGCCountTarget | 设置触发 Full GC 之前,尝试 Mixed GC 的目标次数。默认值为 8。降低该值能降低 GC 开销,将停顿均匀分布减少顿卡。|
|
|
|
|
|
| -XX:G1HeapRegionSize | 设置 G1GC 堆大小。任何此大小的一半(4MB)的内存分配都将划分到老年代。而使用 Java 默认值大多数情况下会太低,这会对象导致被销毁,降低内存利用效率。 |
|
|
|
|
|
| -XX:SurvivorRatio | 由于我们大幅减少了 MaxTenuringThreshold,因此我们将大幅减少幸存者空间的使用。这样可以释放更多区域供 Eden 使用。 |
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
|
|
|
|
### 其他参数
|
|
|
|
|
|
2024-05-23 22:10:52 +08:00
|
|
|
|
下面是关于其他方面的优化的说明:
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
2024-05-24 18:58:42 +08:00
|
|
|
|
**不要忘记改最后的“核心名.jar!**
|
|
|
|
|
**不要忘记改最后的“核心名.jar!**
|
|
|
|
|
**不要忘记改最后的“核心名.jar!**
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
2024-05-23 23:56:27 +08:00
|
|
|
|
### 其他可选的建议设置:
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
2024-05-23 22:10:52 +08:00
|
|
|
|
| 参数 | 说明 |
|
|
|
|
|
| :--------------------------------- | :----------------------------------------------------------- |
|
|
|
|
|
| -Dpaper.alwaysPrintWarningState | Paper 服务器可用 - 将其设置为 `false` 将减少在控制台输出配置不正确、潜在问题或其他非致命但需要注意的警告信息。这意味着只有第一次出现警告时会被打印,之后相同警告不再重复显示,有助于减少日志的冗余。|
|
|
|
|
|
| -Duser.timezone=GMT+08 | 设置 JVM 的默认时区为格林威治标准时间(GMT)加8小时,即中国标准时间(CST)。这会影响到日期和时间相关的操作,确保它们按照预期的时区进行处理。|
|
|
|
|
|
| -Dfile.encoding=UTF-8 | 指定 JVM 文件读写时使用的字符编码为 UTF-8。UTF-8 是一种普遍支持多语言的字符编码格式,可以正确处理各种语言的文字,避免乱码问题。|
|
|
|
|
|
| --enable-preview | 启用 Java 预览功能。Java中的预览特性是即将推出的语言或 API 功能,它们尚未成为最终标准,但可以通过此标志在当前版本的Java中试验和测试。|
|
|
|
|
|
| --add-opens=java.base/java.lang=ALL-UNNAMED | 改变模块系统的访问权限,开放 `java.base` 模块中的` java.lang` 包给所有的未命名模块访问。这对于某些反射操作或在模块系统中需要访问原本受保护的内部API的应用非常有用。|
|
|
|
|
|
| --add-modules=jdk.incubator.vector | 启用 Java incubator 模块。模块包含实验性质的API,比如向量计算 API(Vector API),这些 API 在正式成为标准库的一部分之前,可以通过此选项进行实验和评估。|
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
2024-05-23 23:56:27 +08:00
|
|
|
|
</details>
|
|
|
|
|
|
2024-05-23 22:10:52 +08:00
|
|
|
|
**更多有用的 Paper 服务器可用的参数请查看 [Paper System Properties](https://docs.papermc.io/paper/reference/system-properties)**
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
2024-05-23 22:10:52 +08:00
|
|
|
|
## 如何设置自动重启
|
2024-05-23 13:14:07 +08:00
|
|
|
|
|
2024-05-23 23:50:46 +08:00
|
|
|
|
将前面提到的所有东西集合起来,对于 Windows `start.bat` 可参考的脚本如下(你也可以使用笨蛋脚本自动生成)
|
2024-05-23 23:00:57 +08:00
|
|
|
|
|
2024-05-23 13:14:07 +08:00
|
|
|
|
对于 Windows `start.bat` 可参考的脚本如下:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
@ECHO OFF
|
|
|
|
|
:start
|
2024-05-24 18:58:42 +08:00
|
|
|
|
<<<<<<< HEAD
|
2024-05-23 22:10:52 +08:00
|
|
|
|
java -Xms12G -Xmx12G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -DPaper.printStacktraceOnBadPluginClassAccess=false -Dpaper.alwaysPrintWarningState=false -Duser.timezone=GMT+08 -Dfile.encoding=UTF-8 -Xlog:async --enable-preview --add-opens=java.base/java.lang=ALL-UNNAMED --add-modules=jdk.incubator.vector -jar 核心名.jar --nogui
|
2024-05-24 18:58:42 +08:00
|
|
|
|
=======
|
2024-05-23 23:59:15 +08:00
|
|
|
|
java ..... -jar 核心名.jar --nogui
|
2024-05-24 18:58:42 +08:00
|
|
|
|
>>>>>>> e063a2051d6b8981ee20588d13a9b6870ea6758d
|
2024-05-23 13:14:07 +08:00
|
|
|
|
goto start
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
对于 Linux `start.bat` 可参考的脚本如下:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
while [ true ]; do
|
2024-05-24 18:58:42 +08:00
|
|
|
|
<<<<<<< HEAD
|
2024-05-23 22:10:52 +08:00
|
|
|
|
java -Xms12G -Xmx12G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -DPaper.printStacktraceOnBadPluginClassAccess=false -Dpaper.alwaysPrintWarningState=false -Duser.timezone=GMT+08 -Dfile.encoding=UTF-8 -Xlog:async --enable-preview --add-opens=java.base/java.lang=ALL-UNNAMED --add-modules=jdk.incubator.vector -jar 核心名.jar --nogui
|
2024-05-24 18:58:42 +08:00
|
|
|
|
=======
|
2024-05-23 23:59:15 +08:00
|
|
|
|
java ..... -jar 核心名.jar --nogui
|
2024-05-24 18:58:42 +08:00
|
|
|
|
>>>>>>> e063a2051d6b8981ee20588d13a9b6870ea6758d
|
2024-05-23 13:14:07 +08:00
|
|
|
|
echo 服务器自动重启中
|
|
|
|
|
echo 同时按下 CTRL + C 关服.
|
|
|
|
|
done
|
2024-05-23 23:00:57 +08:00
|
|
|
|
```
|