簡體   English   中英

JVM 進程與 JVM 堆 memory 用法

[英]JVM Process vs JVM Heap memory usage

我已經通讀了這個過程 Memory Vs Heap -- JVM並且我有同樣的問題。

jvm 進程 memory 的使用量不斷增加且從未減少。我在 linux 服務器上進行了檢查。 應用程序正在將作業調度到集群(使用 Quartz + Sun Java DRMAA API)

java 堆空間在應用程序生命周期內保持在限制范圍內,但 jvm 進程顯示 memory 使用率穩步攀升,並且從未下降。

這是 memory 泄漏嗎? 如果是這樣,為什么堆空間在限制范圍內。 有人可以解釋一下嗎。

更新:當我通過 jconsole 跟蹤時,我有 -Xmx1600m -Xms1600m,我可以看到堆空間在 450m 左右的這個限制范圍內,但頂部命令顯示進程使用超過 900m。

使用的總虛擬 memory 是最大堆 + 線程堆棧 + 直接 memory + perm gen + 共享庫的總和。 這永遠不會縮小。

實際使用的主 memory 取決於虛擬 memory 已被占用多少。 共享庫是共享的,因此擁有多個 JVM 不會導致 memory 加倍等。

JVM 從不向操作系統發布 memory,但是如果主 memory 長時間不使用,如果需要,可以將其換出。

實際的 memory 消耗量大於您使用 Xmx 等設置的量,這是正常的。 “java將為其他事情分配memory,包括每個線程的堆棧。VM的總memory消耗超過-Xmx的值並不罕見。”

參數 -Xmx1600m -Xms1600m 告訴 JVM 至少分配 1600MB 的 memory 和 1600MB 的 ZCD69B4957F090CD8191ZBFD3。 所以 JVM 應該在啟動時分配 1600MB 並且永遠不會釋放它。

如果您希望 JVM 將 memory 釋放回操作系統,那么 -Xms 應該盡可能低,您可能必須使用 Java 1.7 和新的垃圾收集器。 stefankrause.net/wp/?p=14。

使用 Mac OS X 10.8 和 Java 1.7 和 -Xms32m -Xmx256m -XX:+UseG1GC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 memory 是在系統發布后運行。

在堆中,Java 虛擬機 (JVM) 存儲由 Java 應用程序創建的所有對象,例如通過使用“new”運算符。 Java 垃圾收集器 (gc) 可以在邏輯上將堆分成不同的區域,以便 gc 可以更快地識別可以刪除的對象

新對象的 memory 在運行時在堆上分配。 實例變量位於聲明它們的 object 中。

堆棧是存儲方法調用和局部變量的地方。 如果一個方法被調用,那么它的棧幀被放到調用棧的頂部。 堆棧幀保存方法的 state,包括正在執行的代碼行以及所有局部變量的值。 堆棧頂部的方法始終是該堆棧的當前運行方法。 線程有自己的調用棧。

如前所述 Java 對象是在堆中創建的。 編程語言不提供讓程序員決定是否應在堆棧中生成對象的可能性。 但在某些情況下,最好在堆棧上分配 object,因為堆棧上的 memory 分配比 memory 分配更便宜,堆中的堆棧分配由運行時有效地管理,釋放堆棧。

因此,JVM 使用內部轉義分析來檢查 object 是否僅與線程或方法一起使用。 如果 JVM 識別到這一點,它可能會決定在堆棧上創建 object,從而提高 Java 程序的性能。 (http://www.ibm.com/developerworks/java/library/j-nativememory-linux/)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM