为什么 Java VM 进程占用的 RAM 比 -Xmx 参数中指定的要多?

evi*_*uin 5 linux memory java centos

我有多台运行 CentOS 5.4 的服务器,只有一个应用程序在 Java VM 上运行。我已经使用以下参数配置了 Java VM:

java -Xmx4500M -server -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:NewSize=1024m  -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote=true
Run Code Online (Sandbox Code Playgroud)

我运行 VM 的机器有 6 GB RAM,没有其他应用程序在运行。过了一会儿,java 进程开始非常努力地访问交换空间,我从top命令中得到了这个信息:

7658 root      25   0 11.7g 3.9g 4796 S 39.4 67.3 543:54.17 java
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我通过 JConsole 连接,它会报告 Java VM 已使用 2.6 GB,已提交 4.6 GB,最大 4.6 GB。

java -version 返回:

java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud)

为什么 Java 虚拟机比分配的堆大小扩展得如此之多?如果 JConsole 中未报告该内存,那么该内存会去哪里?

kma*_*rsh 0

我注意到一些基于 Java 的商业应用程序中存在一个错误,该应用程序在 32 位 Java 中表现良好,但需要额外的(而且大部分是不必要的)1.25GB 才能开始使用 64 位 Java。因此,在 32 位 Java 中需要 256MB 的内容在 64 位运行时需要 1.5GB。

我怀疑 Java 正在报告它认为应用程序正在使用的内容,而不是它自己的运行时开销,特别是在调用此错误的情况下。

您可以尝试在 32 位运行时上运行该应用程序,或者返回供应商的技术支持(可能需要花费 $$)并询问发生了什么。

最终,如果您成功限制了总内存占用量,您只会迫使应用程序更快崩溃,但仍然会遇到问题。