Java使用的内存超过了分配的内存

7
使用以下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

总消耗内存(堆+PermGen)不应该超过使用-Xmx指定的内存限制吗?这会导致一个问题,即我无法使用关闭脚本关闭服务器,因为它尝试使用256MB内存生成JVM,但由于内存不可用而失败。


也许通过JNI或直接分配的ByteBuffer进行了一些本地内存分配。 - Steve
@Steve Tayor 或许吧...我不太熟悉Confluence的情况,无法确定它是否会这样做。我已在Confluence论坛上发布了一个问题,但还没有得到答案。 - vahidg
2个回答

5

3

Tomcat的总内存消耗应该不低于Xmx + XX:MaxPermSize(在您的情况下为768MB),但我记得在某个地方看到它可以超过这个值。Xmx仅是堆空间,而PermGen位于堆之外(有点类似)。


4
堆、永久代和虚拟机开销(未指定数量)。 - Konstantin Komissarchik
@Wesho:嗯,它可以在512MB内运行,你只需要相应地调整所有设置。也许 Xms256m,XX:MaxPermSize=128m 就可以了。 - josh.trow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接