2009-01-11 71 views
7

我試圖找出編程的最大permgen和最大堆大小與我的程序的JVM已被調用,而不是他們目前可用。如何從JVM獲取堆和permgen的最大大小?

有沒有辦法做到這一點?

我熟悉Java運行時對象中的方法,但不清楚它們實際上提供了什麼。

另外,有沒有辦法問Eclipse爲這兩個分配了多少?

回答

7

試試這個的:

MemoryMXBean mem = ManagementFactory.getMemoryMXBean(); 
mem.getHeapMemoryUsage().getUsed(); 
mem.getNonHeapMemoryUsage().getUsed(); 

但他們只提供快照數據,而不是cummulated值。

+1

請注意,非堆內存還包含代碼緩存,它與Permanent Generation分開。 (至少在Sun的JVM中) – 2010-01-07 21:50:34

0

至於日食,嘗試尋找一個分析工具。我認爲NetBeans默認有一個。

+0

我試圖從程序中這樣做,所以我可以給用戶一個警告,如果他們使用少於我的插件將需要。 – Uri 2009-01-11 19:34:40

+0

我誤解了你的問題。我認爲這是一個更好的答案。 – pek 2009-01-11 19:57:56

8

嘗試這樣的事情了最大燙髮根:

public static long getPermGenMax() { 
    for (MemoryPoolMXBean mx : ManagementFactory.getMemoryPoolMXBeans()) { 
     if ("Perm Gen".equals(mx.getName())) { 
      return mx.getUsage().getMax(); 
     } 
    } 
    throw new RuntimeException("Perm gen not found"); 
} 

對於最大堆,可以從運行時得到這個,但你也可以使用適當的MemoryPoolMXBean。