2

我有以下服务器:

  • 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?

4

2 回答 2

1

您的 -Xmx2500M 是您的 java 应用程序中可用的最大堆大小。运行 JVM 和管理该堆中的对象的开销通常多 50%,但可能是堆大小的两倍。Linux top命令将在虚拟内存使用情况中显示这一点。

可以在此处链接的演示文稿中找到关于非堆内存使用的很好的讨论。这里有关于这个主题的另一个 SO 线程

您可以在 ubuntu 上使用 OpenJDK 进行的一项快速检查是运行jps以查看它是哪个进程 ID,然后运行​​jconsole,选择内存选项卡,然后选择非堆内存使用情况。

如果您尝试在没有交换的情况下运行,我猜您将需要尝试不同的堆大小以查看您的应用程序可以运行的场景。.

于 2013-10-11T09:33:31.197 回答
1

尽量-Xmx2500M不要-Xmx=2500M

您不需要 =,-X 选项不同于 -Dkey=value 系统属性,其中使用 =

http://javahowto.blogspot.co.uk/2006/06/6-common-errors-in-setting-java-heap.html

于 2013-10-10T10:48:08.547 回答