簡體   English   中英

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();

jpsjstat命令的組合真的足夠強大,可以跟蹤你的 java 內存細節。

使用jps命令獲取您的 java 進程的 pid 並使用jstat $pid獲取您的 java 程序的詳細信息。 現在您可以循環運行它們並密切監視 Java 程序的內存詳細信息。

你可以在github上找到這個想法的 bash 實現。 這個腳本的一大優點是你可以啟動這個腳本,然后運行你的java程序。 您將能夠從一開始就看到程序的內存詳細信息。

暫無
暫無

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

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