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

vah*_*idg 7 java memory

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

JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxPermSize=256m -Djava.awt.headless=true "
Run Code Online (Sandbox Code Playgroud)

但是我发现在启动之后它会快速吞噬我虚拟服务器上可用的大部分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
Run Code Online (Sandbox Code Playgroud)

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

irr*_*ble 5

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

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

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

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

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


jos*_*row 3

Tomcat 总内存消耗应计算为不少于Xmx + XX:MaxPermSize(在您的情况下为 768MB),但我确实记得在某个地方看到过它可以超过这个值。Xmx只是堆空间,并且PermGen位于堆之外(某种程度)。

  • 堆 + permgen + jvm 开销(未指定数量) (4认同)