![](/img/trans.png)
[英]How does maximum heap size xmx influence the memory allocation / used heap in Java?
[英]How can a Java program keep track of the maximum actual heap size used during its run?
我正在運行某個 Java 程序,它的-Xmx
高於-Xms
,即它的堆可以增長。 執行結束時的堆大小是 (IIRC) 不是運行期間使用的最大值。
獲取當前堆大小:
public static long getHeapSize(){
int mb = 1024*1024;
//Getting the runtime reference from system
Runtime runtime = Runtime.getRuntime();
return ((runtime.totalMemory() - runtime.freeMemory()) / mb);
}
如果要從程序本身檢查它,請使用Runtime類的方法:
Runtime.getRuntime().freeMemory()
Runtime.getRuntime().maxMemory()
如果您可以從程序外部檢查堆大小,則應該使用 JVisualVM。 您可以在 JDK 的 bin 文件夾中找到它。 只需啟動它,並附加到您的 Java 程序以深入了解您的程序堆使用情況。 它將顯示您的堆使用情況圖,從而可以輕松找到程序運行的最大堆大小。
// 獲取當前堆的大小(以字節為單位)
long heapSize = Runtime.getRuntime().totalMemory();
// 以字節為單位獲取堆的最大大小。 堆不能超過這個大小。// 任何嘗試都將導致 OutOfMemoryException。
long heapMaxSize = Runtime.getRuntime().maxMemory();
// 以字節為單位獲取堆內的空閑內存量。 // 在垃圾收集之后,這個大小會增加,並隨着新對象的創建而減少。
long heapFreeSize = Runtime.getRuntime().freeMemory();
其他答案提供了通過 Runtime.getRuntime().totalMemory() 和 maxMemory() 執行的機制,但要非常小心 - 給出的答案僅在給定時刻為真。 GC 之后,totalMemory() 將改變(向下!)。 您無法始終完全准確地了解“系統中有多少活動對象”——因為這正是 GC 計算的內容,而且成本很高。
使用 JMX(參見 GC bean 等)將有助於輪詢,但同樣,它是一個隨着時間推移的示例。
所以我不確定你真正想在這里解決什么問題......
查看運行時信息:
Runtime.getRuntime().maxMemory();
Runtime.getRuntime().totalMemory();
Runtime.getRuntime().freeMemory();
jps
和jstat
命令的組合真的足夠強大,可以跟蹤你的 java 內存細節。
使用jps
命令獲取您的 java 進程的 pid 並使用jstat $pid
獲取您的 java 程序的詳細信息。 現在您可以循環運行它們並密切監視 Java 程序的內存詳細信息。
你可以在github上找到這個想法的 bash 實現。 這個腳本的一大優點是你可以啟動這個腳本,然后運行你的java程序。 您將能夠從一開始就看到程序的內存詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.