2010-10-16 4 views
5

С JRockit, вы можете получить полный список потоков с помощью любых средств, и все эти средства включают в себя информацию о Garbage Collection Тема (ы):С недавними 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, поэтому мое приложение может обнаруживать и регистрировать, когда GC использует большую часть процессорного времени. Без этой информации вы знаете только, когда GC превышает определенные пороговые значения.

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

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

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

ответ

2

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

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

Значение карта - это время процессора для каждого потока.

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

1

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

Отредактировано для добавления: некоторые из них доступны через MemoryMXBean, но не для определения времени GC. Извините ...

+0

Да, но это не помогает мне * программно * получить информацию о потоках GC. Но, конечно, подробный вывод, на который вы ссылаетесь, может быть проанализирован после факта, конечно. – Eddie

+0

С помощью JRockit список тем, которые вы можете получить различными способами, включает в себя потоки GC, и вы можете использовать JMX для получения времени процессора, потребляемого отдельными потоками GC. С помощью Sun JVM потоки GC, по-видимому, не включены ни в какие списки потоков. – Eddie