[英]Java Runtime.maxMemory incorrect?
我運行以下方法Runtime.getRuntime()。maxMemory()並給出了85196800。
但是,然后我從命令行運行了top,它顯示了
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8672 root 20 0 1284m 156m 4296 S 0.3 60.9 0:33.35 java
那不是顯示使用了156M的內存嗎? 有什么想法嗎?
從文檔中
maxMemory()-返回Java虛擬機將嘗試使用的最大內存量。
“頂部”僅顯示系統已分配給進程的(虛擬)內存量-您在詢問Java在最壞的情況下可以嘗試使用多少內存。
通常,查詢JVM和/或系統以獲取有關實際使用的內存的信息是不可靠的。 例如,top的數字可能包括已分配但未使用或未調出的內存。 它還可以包括共享庫之類的東西,其中一個10MB的庫可能會計入兩個進程的分配,但內存中只有一個物理副本。 (例如)
你想做什么?
該方法的Javadocs是錯誤的,或者至少是非常誤導的。 此Sun錯誤報告說明。
另一點是,顯示為RES的156Mb是當前的“駐留集”大小。 即當前歸因於應用程序的物理RAM的數量。 此數字可能會增加和減少,具體取決於機器上運行的系統服務/守護程序和應用程序對虛擬內存的需求。 JVM聲稱要報告的數字是JVM的虛擬內存分配。
可以說這一切都像泥一樣清澈,可能不值得您花力氣設法弄清楚。 如果您真的很在意,請注意top
, vmstat
等告訴您的內容,而忽略JVM號。
Runtime.getRuntime()。maxMemory()返回最大堆大小的估計值,而不是整個進程將消耗的內存總量。 本機內存,本機庫等將有助於進程大小,但不會影響maxMemory()。
如果您試圖了解為什么top顯示的內存消耗比jvm中設置的要多。
這是我過去的經驗
我們已經看到TOP和其他類似的實用程序顯示的內存消耗比我們最初在JVM params中設置的要多。
在我們的例子中,環境是:AIX / Websphere Application Server。
原因是:我們在類路徑中定義了一個共享庫,供我們在應用程序中使用。 這個特定的庫(PureedgeAPI) 實際上跨另一個進程或進行JNI調用 。 (為了清楚起見,很少有.SO庫)在幾次不正確的調用之后-我的意思是不通過調用Objects.destroy()來破壞它,而不僅僅是將其設置為NULL。 我們已經看到在具有2gb(最大設置)的jvm上,內存增加到30GB的水平
從OS的角度來看 :由於JAVA是原始進程,因此此JNI調用的所有子實例也記錄為使用它的同一JAVA父進程。
我沒有方便的命令-但我實際上會看到此特定進程的樹(這可能產生了另一個進程(在您的情況下為java))。
謝謝,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.