NitWikit/docs/准备工作/基础知识/什么是启动脚本.md

143 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
sidebar_position: 6
---
# 什么是启动脚本
启动脚本主要部分就是设置 Java 参数设置。
*对于 Windows 服务器来说,启动脚本是 `.bat` 后缀的文件,对 Linux 服务器而言,启动脚本是 `.sh` 后缀的文件。*
`sh``bat` 是两种不同操作系统环境下用于执行脚本的文件扩展名,它们的主要区别在于运行环境、语法的不同:
## SH (Shell Script)Linux)
* 语法: SH脚本使用Shell命令和控制结构支持条件判断、循环、函数定义等高级编程特性。
* 执行方式: 在终端通过 `./script.sh``sh script.sh` 来执行(确保脚本具有执行权限)。
## BAT (Batch File)(Windows)
* 语法: BAT脚本包含一系列DOS命令和批处理命令支持简单的条件判断和循环但相比SH脚本其功能和灵活性较低。
* 执行方式: 双击文件或者在命令提示符下输入 `script.bat` 来执行。
# 什么是启动参数
启动参数(也称 Flag主要分为3类
* 标准参数(-):所有的 JVM 实现都必须实现这些参数的功能,而且向后兼容;
* 非标准参数(-X默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容;
* 非Stable参数-XX此类参数各个 JVM 实现会有所不同,将来可能会随时取消,需要慎重使用;
以本人经常使用的基于 Aikar Flag 举个例子,该 Flag 基本是通用的,适用于 4G - 20G 内存,若想更改内存大小只需要更改 Xms 和 Xmx 相同即可:
```bash
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
```
:::warning
**不要忘记改最后的“核心名.jar!**
:::
有点长,但是我会一个个讲解他们的作用
## 基础
```bash
java -Xms12G -Xmx12G -jar 核心名.jar nogui
```
| 参数|说明 |
| :-----------* | :-----------* |
| -Xmx[size] | 设置最大内存大小默认为物理内存的1/4或者1G需大于2M可以指定单位K/M/G|
| -Xms[size] | 设置最小内存大小默认为物理内存的1/64需大于1M |
| -jar | 为 Java 指定需要运行的 Jar 程序 |
| --nogui | 关闭服务器 GUI少量性能提升大多数人不需要用到 |
:::info
1. 无论什么时候分配内存时一定要多预留15%左右内存,如服务器还剩余 10G 内存, 不要将 -Xms 设置到大于 9G 的内存,否则会很危险。
2. 在 G1GC 模式下,尽量保证 Xmx = Xms 因为如果二者不同 JVM 需要更多的内存时候JVM需要申请更多内存这个过程的耗时会导致顿卡。
:::
## 性能相关配置
我们这里使用的内存回收器为 `G1 (Garbage First)` ,所以我们要在启动参数中加上 `-XX:+UseG1GC` ,这样我们就能使用该回收器了
光设置使用该回收器也不行,还要对他进行一些配置,下面就会对配置参数进行讲解,你并不需要完全了解下面参数的意义与说明,可以跟着我的推荐值进行设置。
### G1GC 各种参数的说明:
如果你是新手,或暂时没有性能问题,或者只是不感兴趣,这部分可以不看,但如果你感兴趣的话...
<details>
<summary> 这里有适合好奇宝宝的完整说明 </summary>
| 参数 | 说明 |
| :--------------------------------- | :----------------------------------------------------------- |
| -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 使用。 |
### 其他参数
下面是关于其他方面的优化的说明:
| 参数 | 说明 |
| :--------------------------------- | :----------------------------------------------------------- |
| -XX:+UnlockExperimentalVMOptions | 以下某些选项需要开启。 |
| -XX:+UnlockDiagnosticVMOptions | 以下某些选项需要开启。 |
| -XX:+DisableExplicitGC | 许多 “优化” 插件会尝试 GC从而触发大规模的延迟峰值使用该 Flag 可以禁用插件调用这个方法。 |
| -XX:AlwaysPreTouch | 在进程启动时获取内存设置和保留,这提高了操作系统内存访问速度,确保其连续性从而提高其效率。 |
| -Xlog:async | 让 log 记录时跑在异步线程上,在 log 刷屏的时候能减少服务端受到的影响。 |
</details>
## 其他可选的建议设置:
| 参数 | 说明 |
| :--------------------------------- | :----------------------------------------------------------- |
| -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比如向量计算 APIVector API这些 API 在正式成为标准库的一部分之前,可以通过此选项进行实验和评估。|
**更多有用的 Paper 服务器可用的参数请查看 [Paper System Properties](https://docs.papermc.io/paper/reference/system-properties)**
## 如何设置自动重启
将前面提到的所有东西集合起来,对于 Windows `start.bat` 可参考的脚本如下(你也可以使用笨蛋脚本自动生成)
对于 Windows `start.bat` 可参考的脚本如下:
```bash
@ECHO OFF
:start
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
goto start
```
对于 Linux `start.bat` 可参考的脚本如下:
```bash
while [ true ]; do
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
echo 服务器自动重启中
echo 同时按下 CTRL + C 关服.
done
```