簡體   English   中英

Java Runtime.maxMemory不正確?

[英]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的虛擬內存分配。

可以說這一切都像泥一樣清澈,可能不值得您花力氣設法弄清楚。 如果您真的很在意,請注意topvmstat等告訴您的內容,而忽略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.

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