作为jsvc运行的Java应用程序比Heap+PermGen使用更多的内存



我有以下服务器:

  • 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