2010-10-16 51 views
5

有了JRockit的,你可以通過任何手段獲取線程的完整列表,而所有這些手段包括對垃圾收集線程(S)的信息:使用最近的Sun JVM(1.6),是否可以獲取GC線程信息?

1)問計於Thread類的信息:

Thread.getAllStackTraces(); 

2)使用ThreadGroup來獲取信息:

ThreadGroup root = Thread.currentThread().getThreadGroup(); 
while (root.getParent() != null) { 
    root = root.getParent(); 
} 
Thread[] list = new Thread[root.activeCount() + 5]; 
root.enumerate(list, true); 

3)使用JMX以獲取列表:

ThreadMXBean THREAD_MX_BEAN = ManagementFactory.getThreadMXBean(); 
long[] tids = THREAD_MX_BEAN.getAllThreadIds(); 
ThreadInfo[] tinfos = THREAD_MX_BEAN.getThreadInfo(tids); 

4)CTRL-BREAK

然而,使用Sun JVM - 至少最新的Java 6的版本 - 只CTRL-BREAK似乎包括垃圾收集線程和VM週期性任務的線程。我發現監視GC線程使用的CPU非常有用,因此我的應用程序可以在GC使用大部分CPU時間時檢測和記錄日誌。沒有這些信息,只有當GC超過某些設定的閾值時才知道。

如果我甚至可以找到GC線程的線程標識,那麼JMX可能會提供我需要的其餘信息(除非這些線程有些不同)。例如,使用方法:

long threadId = tids[0]; 
long cpuTime = THREAD_MX_BEAN.getThreadCpuTime(threadId); 

有誰知道 - 或者,如果它被稱爲是不可能的 - 以獲得有關使用Sun JVM的垃圾收集線程(S)的信息?

回答

2

這是特定於Java 1.5+ Sun(HotSpot)JVM。 在您要監控的MBeanServer中註冊MBean sun.management.HotspotInternal。這將觸發這些熱點內部MBean的註冊:

  • sun.management:type=HotspotClassLoading
  • sun.management:type=HotspotCompilation
  • sun.management:type=HotspotMemory
  • sun.management :類型= HotspotRuntime
  • sun.management:type=HotspotThreading

HotspotThrea ding MBean有一個叫做的屬性InternalThreadCpuTimes它是HotSpot內部線程的映射.GC線程可以通過名稱來標識。例如,在JVM我運行,現在,他們被稱爲:

  • GC任務線程#1(ParallelGC)
  • GC任務線程#0(ParallelGC)

的價值該映射是每個線程的CPU時間。

HotSpotMemory的MBean也有一個屬性,叫做InternalMemoryCounters其具有約GC信息的幾個其他位。

1

第一步是使用verbosegc: java -verbose:gc -XX:+PrintGCDetails,它會給你一些關於GC操作中消耗的(掛鐘)時間以及操作類型(完整或增量)的信息。你的問題似乎在問你是否可以通過編程獲得它 - 可能可以通過管理I/F獲得一些信息。

編輯添加:其中一些是可以通過MemoryMXBean,但不是GC時間的細節。對不起...

+0

是的,但這不能幫助我*編程*獲取有關GC線程的信息。但當然,您提到的詳細輸出可以在事後進行分析,當然。 – Eddie 2010-10-16 02:56:48

+0

使用JRockit,您可以通過各種方式獲得的線程列表包括GC線程,然後可以使用JMX獲取單個GC線程所消耗的CPU時間。使用Sun JVM,GC線程似乎不包含在任何線程列表中。 – Eddie 2010-10-16 03:38:35

相關問題