Mit dem jüngsten Sun JVMs (1.6) ist es möglich, GC-Thread Informationen zu bekommen?
-
08-10-2019 - |
Frage
Mit JRockit, können Sie die vollständige Liste der Themen mit allen Mitteln bekommen, und alle diese Mittel umfassen Informationen über die Garbage Collection Thread (s):
1) Asking die Thread
Klasse für die Informationen:
Thread.getAllStackTraces();
2) Mit ThreadGroup
diese Informationen zu bekommen:
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 über die Liste bekommen:
ThreadMXBean THREAD_MX_BEAN = ManagementFactory.getThreadMXBean();
long[] tids = THREAD_MX_BEAN.getAllThreadIds();
ThreadInfo[] tinfos = THREAD_MX_BEAN.getThreadInfo(tids);
4) CTRL-BREAK
Um jedoch die Sun JVM mit - zumindest den letzten Java 6 Releases - nur CTRL-BREAK scheint die Garbage Collection-Threads und den VM Periodic Task-Thread zu schließen. Ich finde es nützlich CPU durch die GC-Threads verwendet, zu überwachen, so kann meine Anwendung erkennen und melden, wenn GC wird der größte Teil der CPU-Zeit. Ohne diese Informationen nur wissen, wenn GC bestimmte Schwellenwerte überschreitet.
Wenn ich auch nur die Thread-ID der GC-Threads finden, dann JMX wird wahrscheinlich den Rest der Informationen, die ich Notwendigkeit geben (es sei denn, etwas anderes zu diesen Themen ist). Zum Beispiel mit der Methode:
long threadId = tids[0];
long cpuTime = THREAD_MX_BEAN.getThreadCpuTime(threadId);
Wer weiß, wie - oder wenn bekannt ist, nicht möglich zu sein - Informationen über die Garbage Collection Thread (s) mit der Sun JVM zu erhalten
Lösung
Dies ist spezifisch für die Java 1.5+ Sun (HotSpot) JVM. Registrieren Sie die MBean sun.management.HotspotInternal in der MBeanServer Sie aus zu überwachen suchen. Dadurch wird die Registrierung dieser HotSpot internen MBeans auslösen:
- sun.management:type=HotspotClassLoading
- sun.management:type=HotspotCompilation
- sun.management:type=HotspotMemory
- sun.management:type=HotspotRuntime
- sun.management:type=HotspotThreading
Die HotspotThreading MBean ein Attribut namens InternalThreadCpuTimes , die eine Karte von HotSpot internen threads.The GC-Threads ist namentlich identifizierbar sind. Zum Beispiel in der JVM leite ich jetzt, werden sie genannt:
- GC Aufgabe Thread # 1 (ParallelGC)
- GC Aufgabe Thread # 0 (ParallelGC)
Der Wert der Karte ist die CPU-Zeit für jeden Thread.
Die HotSpotMemory MBean hat auch ein Attribut namens InternalMemoryCounters , die ein paar zusätzlichen Bits an Informationen über GC hat.
Andere Tipps
Ein erster Schritt ist verbosegc zu verwenden:
java -verbose:gc -XX:+PrintGCDetails
, die Ihnen einige Informationen über (Wanduhr) Zeit in GC-Operationen verbraucht geben, und die Art der Operation (vollständige oder inkrementelle). Ihre Frage scheint, ob zu fragen Sie es programmatisch bekommen -. Wahrscheinlich einige Informationen über das Management die ich bekommen kann / F
Edited hinzuzufügen: Ein Teil davon über die MemoryMXBean vorhanden ist, aber nicht die Besonderheiten der GC Zeit. Sorry ...