以jsvc身份运行的Java应用程序使用的内存比Heap + PermGen多

时间:2013-10-10 10:38:40

标签: java memory heap openjdk jsvc

我有以下服务器:

  • Ubuntu Server 12.04 LTS 64Bit
  • 没有GUI,只是命令行
  • 4GB RAM
  • 2个核心
  • 除了Nagios NRPE和Webmin
  • 之外没有其他任何东西在运行
  • vm.swappiness = 0

这里没什么特别的,运行Java应用程序:

  • 使用jsvc
  • 作为守护程序全天候运行
  • -Xmx2500M
  • -XX:+UseConcMarkSweepGC
  • 未制作其他设置
  • 使用OpenJDK 7
  • 启用JMX服务器,并通过nagios检查每分钟

但是,这不应该耗尽所有内存并导致java应用程序无法通过JMX回应nagios。

为什么这会占用我所有的记忆并创建SWAP?

2 个答案:

答案 0 :(得分:1)

尝试-Xmx2500M而非-Xmx=2500M

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

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

答案 1 :(得分:1)

您的-Xmx2500M是Java应用程序中可用的最大堆大小。运行JVM和管理该堆中的对象的开销通常会增加50%,但可以是堆大小的两倍。 Linux top 命令将在虚拟内存使用中显示此信息。

可以在链接here的演示文稿中找到关于非堆内存使用情况的良好讨论。 关于此主题here

还有另一个SO主题

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

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

相关问题