运行 Minecraft 服务器时 Java 内存使用量膨胀至所有 RAM

运行 Minecraft 服务器时 Java 内存使用量膨胀至所有 RAM

当我运行 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 中没有延迟或其他错误消息)。以前在这种情况下,它会在几个小时内降级。

相关内容