我一直在家裡為我的孩子們運行本地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