我一直在家里为我的孩子们运行本地 Minecraft 服务器,随着越来越多的人加入,延迟已成为一个问题……最近,实际的游戏崩溃了(当单个游戏“tick”需要超过 60 秒时,游戏就会崩溃)自动关闭 JVM)。
尝试一些推荐的 JVM 标志会导致内核自动(并且默默地!)停止后台 java 进程,我不确定为什么。
主机是四核 i7(8 线程),具有 32GB RAM,运行 Fedora 31。
Java 是 Oracle 的 SE 运行时:
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
最初,有效的游戏启动命令字符串是:
java -Xms2G -Xmx4G -server -XX:+UseG1GC -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false -jar minecraft_server.1.15.2.jar nogui &
添加推荐的 JVM 标志以优化性能会导致操作系统默默地停止后台 java 进程:
java -Xms10G -Xmx10G -server -XX:+UseG1GC -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=8 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=true -Daikars.new.flags=true -jar minecraft_server.1.15.2.jar nogui &
我通过使用我原来的 JVM 标志集独立测试它们来验证 XMS/XMX 更改不是负责任的。
执行此命令会导致 JVM 启动并且游戏服务器开始初始化,然后突然停止。操作系统报告:[1] 已停止
我可以手动将它带到前台,它会正常恢复执行(当我在前台启动它时它也可以正常工作)。任何将其返回后台的尝试都会导致该过程再次自动停止。
但是,如果我使用运行相同的命令字符串诺哈普,那么进程的行为就如预期的那样...也就是说,游戏的java进程实际上在后台运行。
因此,我对任何内核和/或 Java 专家的问题是,我的 JVM 标志中的什么导致操作系统在后台启动时停止进程?
编辑 - 附加信息
解析通过nohup.out文件中,我确实看到了在前台启动 jvm 进程时不会发生的错误。
[04:12:38] [Server thread/INFO]: Starting minecraft server version 1.15.2
[04:12:38] [Server thread/INFO]: Loading properties
[04:12:38] [Server thread/INFO]: Default game type: SURVIVAL
[04:12:38] [Server thread/INFO]: Generating keypair
[04:12:38] [Server console handler/ERROR]: Exception handling console input
java.io.IOException: Bad file descriptor
at java.io.FileInputStream.readBytes(Native Method) ~[?:1.8.0_231]
at java.io.FileInputStream.read(FileInputStream.java:255) ~[?:1.8.0_231]
at java.io.BufferedInputStream.read1(BufferedInputStream.java:284) ~[?:1.8.0_231]
at java.io.BufferedInputStream.read(BufferedInputStream.java:345) ~[?:1.8.0_231]
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[?:1.8.0_231]
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[?:1.8.0_231]
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:1.8.0_231]
at java.io.InputStreamReader.read(InputStreamReader.java:184) ~[?:1.8.0_231]
at java.io.BufferedReader.fill(BufferedReader.java:161) ~[?:1.8.0_231]
at java.io.BufferedReader.readLine(BufferedReader.java:324) ~[?:1.8.0_231]
at java.io.BufferedReader.readLine(BufferedReader.java:389) ~[?:1.8.0_231]
at wd$2.run(SourceFile:110) [minecraft_server.1.15.2.jar:?]
[04:12:38] [Server thread/INFO]: Starting Minecraft server on *:25512
[04:12:38] [Server thread/INFO]: Using epoll channel type