2010-05-21 74 views
7

我想計算我的應用程序的堆使用情況。我想得到堆尺寸只有的procent值。如何在Java中獲得免費的堆大小(不是堆棧/方法mem)?

如何獲取當前運行應用程序的代碼值?

編輯

有一個upvoted答案,這是不完全/正確。這些方法返回的值也包括堆棧和方法區域,我只需要監視堆大小。
與該代碼我HeapError異常,當我達到了43%,所以我不能使用這些方法來監測只是堆

Runtime.getRuntime().totalMemory() 

回答

2

dbyme的答案是不準確的 - 這些運行時調用給你的內存量由JVM使用,但此內存不僅僅包含堆,還有堆棧和方法區域,例如

+0

這是事實。當我達到43%的使用率時,我會遇到堆內存錯誤。 – Pentium10 2010-05-21 20:03:44

+0

良好的通話。我現在很想知道正確的答案。 – dbyrne 2010-05-21 21:06:27

1

此信息通過JMX管理界面公開。如果您只是想查看它,JConsole或visualvm(安裝在JAVA_HOME/bin中的JDK的一部分)可以顯示JVM內存使用情況的良好圖表,並可選擇分解到各種內存池中。

該接口也可以以編程方式訪問;見MemoryMXBean

+0

由於我在Android上,因此無法訪問這些內容。 – Pentium10 2010-05-21 21:19:45

+0

然後嘗試直接使用接口。我添加了一個鏈接讓你開始。 – meriton 2010-05-21 21:30:21

0

實在沒有很好的答案,因爲JVM多少堆內存提供免費是不一樣的多少堆內存操作系統有免費,這兩者都是沒有多少堆內存相同可以分配給您的應用程序

這是因爲JVM和OS堆是不同的。當JVM內存不足時,它可能會運行垃圾收集,對自己的堆進行碎片整理,或者從操作系統請求更多的內存。由於未使用的非垃圾回收對象仍然存在,但技術上「免費」,因此它們使得空閒內存的概念有點模糊。

另外,堆內存碎片;如何/何時/如何對內存進行碎片整理取決於JVM/OS的實現。例如,操作系統堆可能有100MB的可用內存,但由於碎片,最大可用連續空間可能爲2MB。因此,如果JVM請求3MB,即使100MB仍然可用,它也可能會出現內存不足錯誤。 JVM不可能提前知道操作系統將無法分配3MB。

+0

您如何檢測到您的應用程序處於危急情緒,達到該級別? – Pentium10 2010-05-21 21:36:29

+0

@ Pentium10:[用大堆啓動Java](http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html#0.0.0.%20Total%20Heap|outline),那麼當你想要檢查,手動運行垃圾收集器,然後檢查可用空間。我會說任何低於40%的東西都是壞的,但是正如你所看到的那樣,可能會導致內存消耗甚至更多的空閒內存。另外,手動運行垃圾回收器的速度非常慢,並且不是您想要在任何實際應用程序中執行的操作。你爲什麼做這個? – 2010-05-21 21:43:44

+0

我有一種在Android移動設備上運行的回溯生成過程,我無法用大堆堆啓動Java。我必須在太遲之前停止生成過程。 – Pentium10 2010-05-21 21:45:18

1

MemoryMXBean bean = ManagementFactory.getMemoryMXBean(); bean.getHeapMemoryUsage()。getUsed();