有了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)的信息?
是的,但這不能幫助我*編程*獲取有關GC線程的信息。但當然,您提到的詳細輸出可以在事後進行分析,當然。 – Eddie 2010-10-16 02:56:48
使用JRockit,您可以通過各種方式獲得的線程列表包括GC線程,然後可以使用JMX獲取單個GC線程所消耗的CPU時間。使用Sun JVM,GC線程似乎不包含在任何線程列表中。 – Eddie 2010-10-16 03:38:35