启动脚本讲解

This commit is contained in:
Radiation_pi 2024-05-23 13:14:07 +08:00
parent 95f90c111d
commit d95dc50f90
5 changed files with 126 additions and 4 deletions

View File

@ -0,0 +1,122 @@
sidebar_position: 6
---
# 什么是启动脚本
启动脚本主要部分就是设置 Java 参数设置。对于 Windows 服务器来说,启动脚本是 `.bat` 后缀的文件,对 Linux 服务器而言,启动脚本是 `.sh` 后缀的文件。
`sh``bat` 是两种不同操作系统环境下用于执行脚本的文件扩展名,它们的主要区别在于运行环境、语法的不同:
## SH (Shell Script)
* 语法: SH脚本使用Shell命令和控制结构支持条件判断、循环、函数定义等高级编程特性。
* 执行方式: 在终端通过 `./script.sh``sh script.sh` 来执行(确保脚本具有执行权限)。
## BAT (Batch File)
* 语法: BAT脚本包含一系列DOS命令和批处理命令支持简单的条件判断和循环但相比SH脚本其功能和灵活性较低。
* 执行方式: 双击文件或者在命令提示符下输入 `script.bat` 来执行。
# 什么是启动参数
启动参数(也称 Flag主要分为3类
* 标准参数(-):所有的 JVM 实现都必须实现这些参数的功能,而且向后兼容;
* 非标准参数(-X默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容;
* 非Stable参数-XX此类参数各个 JVM 实现会有所不同,将来可能会随时取消,需要慎重使用;
以本人经常使用的基于 Aikar Flag 举个例子:
```bash
@ECHO OFF
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
pause
```
有点长,但是我会一个个讲解他们的作用
## 基础
```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` ,这样我们就能使用该回收器了
光设置使用该回收器也不行,还要对他进行一些配置,下面就会对配置参数进行讲解,你并不需要完全了解下面参数的意义与说明,可以跟着我的推荐值进行设置。
下面是G1 GC的所有的开关选项的列表
| 参数 | 说明 |
| :----------------------------------- | :----------------------------------------------------------- |
| -XX:+UseG1GC | 使用 G1 GC |
| -XX:UnlockExperimentalVMOptions | 以下某些选项需要开启 |
| -XX:G1NewSizePercent | 这些是重要的。在 CMS 和其他世代中,调整 New Generation 会导致 FIXED SIZE New Gen并且通常通过使用 -Xmn 进行显式大小设置来完成。现在,您可以为新一代产品指定总体所需范围的百分比。通过这些设置,我们告诉 G1 不要对新一代使用默认的 5%,而是给它 40%Minecraft 具有极高的内存分配率,在 800 名玩家的服务器上每秒至少 30 兆字节这主要是短期对象块位置现在这意味着MC REALLY需要更多地关注新一代才能支持这种分配率。如果你的新一代太小你将每秒运行1-2+次新一代集合,这真的很糟糕。您将有如此多的暂停,以至于 TPS 有遭受损失的风险,并且服务器将无法跟上 GC 的成本。然后结合对象现在会更快地升级的事实,从而导致您的旧一代增长得更快。给定更多的 NewGen我们能够减慢 Young Gen 集合的间隔,从而为短寿命对象提供更多时间英年早逝,并且总体上更有效的 GC 行为。 |
| -XX:MaxGCPauseMillis=n | 设置一个暂停时间期望目标这是一个软目标JVM 会近可能的保证这个目标 |
| -XX:+ParallelRefProcEnabled | 优化 GC 进程,使用多个线程进行弱引用检查。 |
| -XX:G1RSetUpdatingPauseTimePercent=5 | 默认值为暂停更新 Rset 期间花费的时间的 10%,将其减少到 5%,以使更多时间并发以减少暂停持续时间。 |
| -XX:G1MixedGCLiveThresholdPercent | 控制何时将混合 GC 中的区域包含在 Young GC 集合中,从而保持 Old Gen 整洁,而无需执行正常的 Old Gen GC 集合。当您的记忆力低于此百分比时,旧一代甚至不会包含在“混合”集合中。混合不像完整的旧集合那么重,因此对旧集合进行小的增量清理可以减少内存使用量。默认值为 65 到 85具体取决于 Java 版本,我们将设置为 90以确保我们尽可能快地回收旧代中的垃圾以保留尽可能多的可用区域。我的旧旗帜集在 35 时有这个,这是一个错误。我把这面旗帜颠倒过来的意图,因为我认为 35 就是 65 的作用。您不应该将 35 用于此数字。 |
| -XX:G1ReservePercent=20 | MC最新版本中的内存分配率真的很疯狂。我们冒着可怕的“太空耗尽”的风险没有足够的可用内存来移动数据。这样可以确保等待使用更多内存进行此操作。默认值为 10因此我们再给它 10 个。 |
| -XX:MaxTenuringThreshold=1 | Minecraft的内存分配率非常高。在那段记忆中大部分是在伊甸园一代中恢复的。但是瞬态数据将溢出到幸存者中。最初玩完全删除幸存者并取得了不错的结果但确实导致瞬态数据进入旧数据这并不好。Max Tenuring 1 确保我们不会将瞬态数据提升到老一代,但任何在垃圾回收 2 次传递中幸存下来的数据都将被视为寿命更长。这样做可以大大减少 Young Collections 中的暂停时间,因为在 Survivor 空间中为永久对象复制数据最多 15 次确实需要大量时间才能获得实际的旧内存。理想情况下GC 引擎将跟踪对象的平均年龄并更快地保留数据,但这不是它的工作方式 |
| -XX:AlwaysPreTouch | 在进程启动时获取内存设置和保留,确保其连续性,从而进一步提高其效率。这提高了操作系统内存访问速度。强制使用透明大页面 |
| -XX:+DisableExplicitGC | 许多插件认为他们知道如何控制内存,并尝试调用垃圾回收。执行此操作的插件会触发完整的垃圾回收,从而触发大规模的延迟峰值。此标志禁止插件尝试执行此操作,从而保护您免受其错误代码的侵害。 |
| -XX:G1MixedGCCountTarget=4 | 默认值为 8。因为我们的目标是收集速度较慢使用旧代使用量较少所以尽量更快地回收旧代内存以避免用完旧内存。 |
| -XX:G1HeapRegionSize=8M | 默认值为自动计算。对于 Minecraft 来说超级重要,尤其是 1.15因为在内存不足的情况下默认计算在大多数情况下会太低。任何此大小的一半4MB的内存分配都将被视为“巨大”并直接提升到老一代并且更难释放。如果你允许 java 使用默认值,你将被销毁,你的内存中有很大一部分被视为 Humongous。 |
| -XX:SurvivorRatio=32 | 由于我们大幅减少了 MaxTenuringThreshold因此我们将大幅减少幸存者空间的使用。这样可以释放更多区域供 Eden 使用。 |
### 其他参数
## 配置好的启动参数
**不要忘记改最后的“核心名.jar!**
**不要忘记改最后的“核心名.jar!**
**不要忘记改最后的“核心名.jar!**
重要的事情说三遍xd
建议使用下面的脚本,将`-Xms`与`-Xmx`的大小设置相同
```bash
@ECHO OFF
java -server -Xms8g -Xmx8g -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseG1GC -XX:SurvivorRatio=6 -XX:G1ReservePercent=15 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=1 -XX:InitiatingHeapOccupancyPercent=40 -jar 核心名.jar
pause
```
#### 如何设置自动重启
对于 Windows `start.bat` 可参考的脚本如下:
```bash
@ECHO OFF
:start
java ...... -jar 核心名.jar
goto start
```
对于 Linux `start.bat` 可参考的脚本如下:
```bash
while [ true ]; do
java ...... -jar 核心名.jar
echo 服务器自动重启中
echo 同时按下 CTRL + C 关服.
done
```

View File

@ -1,5 +1,5 @@
---
sidebar_position: 6
sidebar_position: 5
---
# 什么是插件?

View File

@ -1,5 +1,5 @@
---
sidebar_position: 5
sidebar_position: 4
---
# 什么是模组?

View File

@ -1,5 +1,5 @@
---
sidebar_position: 5
sidebar_position: 3
---
# 如何评判服务器卡顿