سؤال

With JRockit, you can get the full list of threads by any means, and all of these means include information about the Garbage Collection Thread(s):

1) Asking the Thread class for the information:

Thread.getAllStackTraces();

2) Using ThreadGroup to get that information:

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

3) Using JMX to get the list:

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

4) CTRL-BREAK

However, using the Sun JVM -- at least recent Java 6 releases -- only CTRL-BREAK seems to include the Garbage Collection threads and the VM Periodic Task thread. I find it useful to monitor CPU used by the GC threads so my application can detect and log when GC is using most of the CPU time. Without this information, you only know when GC exceeds certain set thresholds.

If I can even just find out the Thread ID of the GC threads, then JMX will probably give the rest of the information I need (unless there is something different about these Threads). For example, using the method:

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

Does anyone know how -- or if it is known to be not possible -- to get information about the garbage collection Thread(s) using the Sun JVM?

هل كانت مفيدة؟

المحلول

This is specific to the Java 1.5+ Sun (HotSpot) JVM. Register the MBean sun.management.HotspotInternal in the MBeanServer you are looking to monitor from. This will trigger the registration of these HotSpot internal mbeans:

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

The HotspotThreading MBean has an attribute called InternalThreadCpuTimes which is a map of HotSpot's internal threads.The GC threads are identifiable by name. For example, in the JVM I am running right now, they are called:

  • GC task thread#1 (ParallelGC)
  • GC task thread#0 (ParallelGC)

The value of the map is the CPU time for each thread.

The HotSpotMemory MBean also has an attribute called InternalMemoryCounters which has a few additional bits of information about GC.

نصائح أخرى

A first step is to use verbosegc: java -verbose:gc -XX:+PrintGCDetails, which will give you some information about (wall clock) time consumed in GC operations, and the type of operation (full or incremental). Your question seems to be asking whether you can get it programmatically -- probably can get some info via the management I/F.

Edited to add: Some of this is available via the MemoryMXBean, but not the specifics of GC time. Sorry...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top