我有以下服务器:
- Ubuntu Server 12.04 LTS 64Bit
- 没有图形用户界面,只有命令行
- 4GB 内存
- 2 核
- 除了Nagios NRPE和Webmin之外,没有其他任何东西在运行
- vm.swappiness = 0
这里没有什么特别的,运行一个 Java 应用程序:
- 使用 JSVC 作为守护程序运行 24/7
-
-Xmx2500M
-
-XX:+UseConcMarkSweepGC
- 不进行其他设置
- 使用 OpenJDK 7
- 启用JMX服务器,并通过nagios每分钟检查一次
但是,这不应该耗尽所有内存,并导致 java 应用程序无法通过 JMX 响应 nagios。
为什么这会耗尽我所有的内存并创建 SWAP?
-Xmx2500M 是 Java 应用程序中可用的最大堆大小。运行 JVM 和管理该堆中的对象的开销通常要多 50%,但可能是堆大小的两倍。Linux top 命令将在虚拟内存使用情况中显示此信息。
有关非堆内存使用情况的良好讨论,请参阅此处链接的演示文稿。这里有另一个关于这个主题的 SO 线程
您可以在 ubuntu 上使用 OpenJDK 进行的一个快速检查是运行 jps 以查看它是哪个进程 ID,然后 jconsole,选择内存选项卡,然后选择非堆内存使用情况。
如果您尝试在不交换的情况下运行,我的猜测是您需要尝试不同的堆大小,以查看您的应用程序可以运行什么场景。
尝试-Xmx2500M
不要-Xmx=2500M
您不需要 =、-X 选项与 -Dkey=value 系统属性不同,其中使用 =
http://javahowto.blogspot.co.uk/2006/06/6-common-errors-in-setting-java-heap.html