为什么Java VM进程会消耗更多的RAM,然后在-Xmx参数中指定?

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

java -Xmx4500M -server -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:NewSize=1024m -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote=true 

我运行虚拟机的机器有6 GB内存,没有其他应用程序在运行。 过了一会儿,java进程开始非常难以进入交换空间,我从top命令中获得了这个信息:

 7658 root 25 0 11.7g 3.9g 4796 S 39.4 67.3 543:54.17 java 

另一方面,如果我通过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) 

为什么Java VM在分配堆大小之前扩展得太多了? 那么内存在哪里呢,如果在JConsole中没有报告呢?

我注意到一些基于Java的商业应用程序中的一个错误,其中应用程序在32位Java中performance良好,但是需要额外(并且大部分是不必要的)1.25GB才能开始使用64位Java。 那么在32位Java中需要256MB,在64位运行时需要1.5GB。

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

您可以尝试在32位运行时运行应用程序,或者返回供应商的技术支持(可能需要花费$$美元)并询问具体情况。

最终,如果您成功地限制了内存占用总量,那么您只需强制应用程序尽快崩溃,而您仍然有问题。

-Xmx是虚拟机正在使用的堆空间的最大数量。 它不包括加载的类的内存,vm自身或线程栈或用于JIT的内存。 由于第一个数字包含了其他程序使用的共享内存,所以从顶部的行也是误导性的。 第二个数字3.9克是居民的大小,更接近现实。

我的build议:检查你是否真的需要那么多的堆(对象的数量和大小),如果可以的话,减less-Xmx的数量。