我有以下服务器:
- Ubuntu 服务器 12.04 LTS 64 位
- 没有 GUI,只有命令行
- 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 命令会显示虚拟内存的使用情况。
有关非堆内存使用的详细讨论可以在链接 here 的演示文稿中找到。 。 关于这个主题还有另一个线程 here
您可以在 ubuntu 上使用 OpenJDK 进行的一项快速检查是运行 jps 以查看它是哪个进程 ID,然后运行 jconsole,选择内存选项卡,然后选择非堆内存使用。
如果您尝试在没有交换的情况下运行,我的猜测是您将需要尝试不同的堆大小,以了解您的应用程序可以运行的场景。 。
关于作为 jsvc 运行的 Java 应用程序使用的内存比 Heap+PermGen 更多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19293499/