Java使用的内存比分配的内存多

使用以下Java选项启动Apache Tomcat(Atlassian Confluence)实例:

JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxPermSize=256m -Djava.awt.headless=true " 

但是我发现在启动之后它会快速吞噬我的虚拟服务器上可用的大部分1GB内存。

  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 6082 root 19 0 1105m 760m 16m S 0.7 74.2 5:20.51 java 

整体消耗的内存(heap + PermGen)是否应该保持在使用-Xmx指定的内存之下? 这导致的问题之一是我无法使用关闭脚本关闭服务器,因为它尝试生成具有256MB内存的JVM,因为它不可用而失败。

总的Tomcat内存消耗应该计算在不低于Xmx + XX:MaxPermSize (在你的情况下,768MB),但我记得在某个地方可以看到它。 Xmx只是堆空间,而PermGen在堆外(有点)。

例如,本机库可以轻松地在Java堆外部分配内存。

Direct ByteBuffer也这样做: http : //docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html

直接缓冲区的内容可能位于正常的垃圾收集堆之外,因此它们对应用程序的内存占用量的影响可能并不明显。

分配巨大的直接ByteBuffers有充分的理由。

http://ehcache.org/documentation/offheap_store.html