С недавними JVM Sun (1.6) возможно ли получить информацию о потоке GC? - PullRequest
5 голосов
/ 16 октября 2010

С помощью JRockit вы можете получить полный список потоков любыми способами, и все эти средства включают информацию о потоках сбора мусора:

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

4CTRL-BREAK

Однако при использовании JVM Sun - по крайней мере, в последних выпусках Java 6 - только CTRL-BREAK включает потоки сборки мусора и поток периодических задач VM.Я считаю полезным следить за процессором, используемым потоками GC, чтобы мое приложение могло определять и регистрировать, когда GC использует большую часть процессорного времени.Без этой информации вы узнаете только, когда GC превысит определенные установленные пороговые значения.

Если я даже смогу просто узнать идентификатор потока потоков GC, то JMX, вероятно, выдаст остальную информацию, которая мне нужна (есличто-то другое в этих темах).Например, используя метод:

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

Кто-нибудь знает, как - или если известно, что это невозможно - получить информацию о Потоке (ах) сбора мусора с помощью Sun JVM?

Ответы [ 2 ]

2 голосов
/ 06 ноября 2010

Это характерно для Java 1.5+ JVM Sun (HotSpot).Зарегистрируйте MBean sun.management.HotspotInternal на сервере MBeanServer, с которого вы хотите вести мониторинг.Это инициирует регистрацию этих внутренних mbans-компонентов HotSpot:

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

MBean HotspotThreading имеет атрибутназываемый InternalThreadCpuTimes , который является картой внутренних потоков HotSpot. Потоки GC идентифицируются по имени.Например, в JVM, которую я сейчас запускаю, они называются:

  • Поток задачи GC # 1 (ParallelGC)
  • Поток задачи GC # 0 (ParallelGC)

Значением карты является время ЦП для каждого потока.

HotSpotMemory MBean также имеет атрибут с именем InternalMemoryCounters , который имеет несколькодополнительные биты информации о GC.

1 голос
/ 16 октября 2010

Первым шагом является использование verbosegc: java -verbose:gc -XX:+PrintGCDetails, который даст вам некоторую информацию о (настенных часах) времени, затраченного на операции GC, и типе операции (полная или инкрементная).Ваш вопрос, кажется, спрашивает, можете ли вы получить это программно - возможно, можете получить некоторую информацию через I / F управления.

Отредактировано, чтобы добавить: Часть этого доступна через MemoryMXBean, но не спецификаВремя GC.Извините ...

...