2016-07-24 15 views
2

Gibt es eine Möglichkeit, die aktuellen jvm-Statistiken wie geladene Klassen oder aktuelle Heap-Größe aus C++ programmgesteuert abzurufen? Ich weiß, dass es viele Tools dafür gibt, aber ich möchte das mit einer anderen Anwendung integrieren, die diese Statistiken von Zeit zu Zeit lesen würde.Monitor-JVM-Heap-Größe von C++

+0

also von C++ diese anderen Tools ausführen und Ausgabe sammeln? (wenn Sie in normalen * NIX-Welt sind) (nicht beantworten, nur Workaround möglich) – Ped7g

+0

Die meisten Tools sind GUI-basiert mit keine Befehlszeilenoptionen. Sie scheinen in Java mit Swing oder so gebaut zu sein. –

+1

['jstat'] (https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html) ist ein Befehlszeilentool zur Überwachung von Heap-, GC-, Klassenlade- und JIT-Kompilierung . ['jcmd'] (https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html)" PerfCounter.print "kann ebenfalls helfen. – apangin

Antwort

0

Sie können sich JVMTI und JNI ansehen.

JVMTI können Sie einen nativen Agenten auf eine Java-Anwendung befestigen, mit Lasten von Low-Level-Funktionen wie Heap-Überquerungen, usw. Es ist auch „Garbage Collection Start“ & „Garbage Collection Finish“ Ereignisse enthält, die geeignet sind, als Startpunkte verwendet werden.

JNI können Sie Java-Funktionen von nativem Code (und umgekehrt) aufrufen. Ich könnte mir vorstellen, dass Sie diese Technik verwenden könnten, um Informationen von ManagementFactory oder einer ähnlichen Java-Klasse zu erhalten, die die benötigten Informationen liefert. This post enthält ein vollständiges Beispiel, wie man statische Java-Methoden über JNI aufruft, was ein guter Ausgangspunkt sein sollte.

+0

Der JVMTI-Agent muss vom JVM geladen werden. Es scheint nicht möglich, es später an den jvm anzuhängen. Verwendet nicht Java-Code, um Informationen aus dem JVM ein wenig albern zu bekommen? Sie fügen mehr Dinge für den jvm hinzu, um sie dann zu laden. Sie überwachen dann intrusiv? –

+0

@LL .: Sie können einen JVMTI-Agenten an eine laufende JVM mit 'com.sun.tools.attach.VirtualMachine' über tools.jar anhängen, schauen Sie hier nach: http://docs.oracle.com/javase/6 /docs/jdk/api/attach/spec/com/sun/tools/attach/VirtualMachine.html. Das Problem ist, dass Sie ein anderes Java-Programm benötigen, um Ihren nativen Agenten an die laufende JVM anzuhängen. Sie haben noch keine Lösung gefunden, um eine JVM direkt aus dem systemeigenen Code zu erstellen. –

+0

Auf [eine meiner eigenen Fragen] (http://stackoverflow.com/questions/38588632/attach-native-application-via-jni-to-already-running-jvm-on-linux), schlug Apangin nur mir seine vor Projekt [jattach] (https://github.com/apangin/jattach), das vielversprechend aussieht, um eine laufende JVM aus nativem Code anzuhängen. –