从 0 开始的我的世界 Java 版开服教程
启动脚本的编写
启动脚本的格式
文件的解释器声明
在文件的开头,我们应当指明系统所该使用的bash shell解释器,该指示器在/bin/bash路径下,在前面加上可执行文件标识符#!,就完成了解释器声明,即:
#!/bin/bash
该内容也被称为释伴(shebang)
环境变量的声明
在简幻欢中,已经有预设的jdk,而系统不知道你要用的jdk在什么路径,因而需要声明变量及其路径,预设jdk的声明如下:
#!/bin/bash
openjdk8="/usr/bin/jdk/jdk1.8.0_361/bin/java"
openjdk11="/usr/bin/jdk/jdk-11.0.18/bin/java"
openjdk17="/usr/bin/jdk/jdk-17.0.6/bin/java"
openjdk19="/usr/bin/jdk/jdk-19.0.2/bin/java"
openjdk21="/usr/bin/jdk/jdk-21.0.2/bin/java"如果你自行导入了新的jdk或jre,也应当声明专门的环境变量,或直接对路径引用,引用必须直接引用到./bin/java。
自定义变量
为了使用方便,我们会尽可能用简短的变量来代替冗长的内容,简化代码,提高可读性和可维护性,启动脚本也是如此。
在简幻欢的启动脚本中,有这样的一个变量:
maxmem=$((SERVER_MEMORY - 1000))它的含义是:
maxmem是一个自定义变量,变量继承自SERVER_MEMORY - 1000 的值。
在书写变量时,要注意等号两侧没有空格,括号是成对出现的。
主命令
主命令就是直接启动服务器的命令,包括java路径、java参数、启动资源路径、其它参数。
这里给出一个主命令的例子:
JAVA_PATH -jar -Xms1024M -Xmx${maxmem}M server-release.jar "$@" noguiJAVA_PATH 是自定义的java路径变量,-jar是告诉java要运行JAR包文件,-Xms是初始内存,当前设定为1024MB,-Xmx是最大占用内存,当前设定为maxmem变量的值,运行的JAR包文件是server-release.jar,"$@"是指传递给脚本的所有命令行参数(保留原始格式),nogui指以纯命令行形式启动,减少占用。
部分高版本的Forge和NeoForge则有所不同,不依赖于JAR包文件启动,而是依靠于一个TXT文件,主命令示例如下:
JAVA_PATH -Xms1024M -Xmx${maxmem}M @libraries/net/neoforged/neoforge/20.6.136/unix_args.txt "$@" nogui请注意:以TXT作为启动入口的不需要加-jar参数,实际的JAR包名称需要自行判断
启动参数
JVM 内存管理优化
-XX:NewRatio=3 #调整新老生代GC比例减小老生代GC压力,一般不用
-XX:SurvivorRatio=4 #调整生命周期,Eden区:Survivor区
-XX:LargePageSizeInBytes=2m #使用2MB大页内存(减少内存碎片,需系统支持)垃圾回收(GC)优化
-XX:+UnlockExperimentalVMOptions # 解锁实验性选项
-XX:+UseG1GC # 使用G1垃圾收集器
-XX:G1HeapRegionSize=32m # 每个Region大小32MB(根据堆大小调整,1-32m)
-XX:MaxGCPauseMillis=50 # 目标最大GC停顿时间50ms(减少卡顿)
-XX:G1NewSizePercent=20 # 新生代最小占比20%
-XX:G1MaxNewSizePercent=40 # 新生代最大占比40%
-XX:G1RSetUpdatingPauseTimePercent=5 # 更新RSet的停顿时间占比
-XX:G1ReservePercent=15 # 预留15%内存防止OOM性能与卡顿优化
-XX:-UseBiasedLocking #禁用偏向锁(减少同步开销)
-XX:+AggressiveOpts # 启用激进优化(Java 8及以下有效)
-XX:+UseAESIntrinsics # 启用AES硬件加速
-XX:+UseFastAccessorMethods # 优化原始类型访问网络与 I/O 优化
-Dnet.ipv4.tcp_keepalive=1 # 启用TCP保活机制
-Dnetty.maxDirectMemory=0 # 禁用Netty直接内存限制(避免网络缓冲区不足)
-XX:+UseAsyncGCThreads # 异步执行GC的文件I/O操作(减少停顿),读写优化模组 / 插件兼容优化
-Dfml.ignoreInvalidMinecraftCertificates=true # 忽略无效的Minecraft证书(模组加载用)
-Dfml.ignorePatchDiscrepancies=true # 忽略模组补丁差异(避免启动失败)无头优化(你也可以用nogui参数)
-Djava.awt.headless=true # 强制无头模式(无GUI,节省资源)