Linux

為什麼 Java VM 程序消耗的 RAM 比 -Xmx 參數中指定的更多?

  • July 16, 2010

我有多台伺服器執行 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

我執行 VM 的機器有 6 GB RAM,沒有其他應用程序在執行。過了一會兒,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 中表現良好,但需要額外的(而且大部分是不必要的)1.25GB 才能開始使用 64 位 Java。因此,在 32 位 Java 中佔用 256MB 的空間在 64 位執行時佔用了 1.5GB。

我懷疑 Java 正在報告它認為應用程序正在使用的內容,而不是它自己的執行時成本,特別是在呼叫此錯誤的情況下。

您可以嘗試在 32 位執行時執行應用程序,或者返回供應商的技術支持(可能花費 $$)並詢問發生了什麼。

最終,如果你成功地限制了總記憶體佔用,你只是迫使應用程序更快地崩潰,你仍然會遇到問題。

引用自:https://serverfault.com/questions/141026