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

时间:2011-06-29 20:53:29

标签: java memory

使用以下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,因为它不可用而失败。

2 个答案:

答案 0 :(得分:5)

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

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

  

直接缓冲区的内容可以   居住在正常范围之外   垃圾收集堆,等等   对内存占用的影响   申请可能并不明显。

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

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

答案 1 :(得分:3)

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