当我运行 Minecraft 服务器时,随着时间的推移(几小时到几天),Java 的内存使用量会膨胀,占用所有可用的计算机内存,然后服务器性能会下降:延迟,玩家失去连接,并且 minecraft 显示类似“[服务器线程/警告]:跟不上!系统时间是否更改,或者服务器是否超载?落后 3126 毫秒,跳过 62 个刻度”的消息
除了每次出现这种情况时停止并重新启动 Minecraft 服务器之外,有没有办法可以防止这种情况发生?
感谢您的帮助。
背景:
操作系统:Ubuntu 12.04.3 LTS 服务器
服务器:HP ProLiant DL360 G5,2 Xeon E5420 @ 2.50 GHz,16 GB RAM
Java 版本“1.6.0_27”
OpenJDK 运行环境(IcedTea6 1.12.6)(6b27-1.12.6-1ubuntu0.12.04.4)
OpenJDK 64 位服务器 VM(版本 20.0-b12,混合模式)
运行 Minecraft我使用以下方法,但我尝试了不同的 -Xmx -Xms 限制,但出现了同样的问题
java -Xmx2048M -Xms2048M -jar minecraft_server.jar nogui
使用 top 监控内存使用情况,一开始内存使用量很低,并且一段时间内一切正常:
Tasks: 139 total, 1 running, 138 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.5%us, 0.0%sy, 0.0%ni, 97.4%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16433112k total, 1420264k used, 15012848k free, 10220k buffers
Swap: 16773116k total, 51980k used, 16721136k free, 107432k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5025 tom 20 0 5095m 1.0g 11m S 20 6.5 5:57.76 java
5437 tom 20 0 17344 1300 952 R 0 0.0 0:00.03 top
1 root 20 0 24332 660 112 S 0 0.0 0:01.21 init
2 root 20 0 0 0 0 S 0 0.0 0:00.05 kthreadd
但最终,它会膨胀到用尽几乎所有的内存(16GB 的 97%),RES 变为 15g,VIRT 变为 ~19g:
Tasks: 139 total, 1 running, 138 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.5%us, 0.2%sy, 0.0%ni, 97.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16433112k total, 16284172k used, 148940k free, 1104k buffers
Swap: 16773116k total, 952160k used, 15820956k free, 33824k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5025 tom 20 0 19.5g 15g 4292 S 20 97.1 27:20.76 java
1 root 20 0 24332 0 0 S 0 0.0 0:01.21 init
2 root 20 0 0 0 0 S 0 0.0 0:00.05 kthreadd
答案1
将默认 Java 版本更改为版本 7 似乎已解决问题;Minecraft 服务器已运行约一天,现在没有出现 Java 内存泄漏问题。看来 Minecraft 1.7.2 与 Java 版本 6 配合使用效果不佳。我之前按照论坛上另一篇帖子的建议安装了 Java 7,使用:
sudo apt-get install openjdk-7-jre-headless
但是我没有意识到,当运行 java 时,这并没有自动成为默认版本。要更改 java 的默认版本:
sudo update-alternatives --config java
然后;
There are 2 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 auto mode
1 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 manual mode
* 2 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1051 manual mode
Press enter to keep the current choice[*], or type selection number:
我选择了“2”,即 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 作为默认值。重新启动 Minecraft 服务器后,Java 内存使用量在大约一天内一直稳定在 1.1g 左右,有许多玩家在玩该游戏(Minecraft 中没有延迟或其他错误消息)。以前在这种情况下,它会在几个小时内降级。