2016-04-15 17 views
0

Ich bin mir bewusst, dass wir mit dem Flag verbose: class den jvm abmelden können, wenn eine Klasse geladen wird und von wo. Ich möchte jedoch einige zusätzliche Informationen sehen - welcher Klassenlader die Klasse geladen hat und im Idealfall die Klasse, die ausgeführt wurde, die das Laden verursacht hat. (Nicht ganz sicher, dass der letzte Teil sogar Sinn macht!)Java Klassen laden - welcher Klassenlader und/oder welche Klasse hat geladen?

Gibt es eine Möglichkeit, den jvm diese Informationen zu protokollieren, oder irgendwelche anderen Vorschläge, wie man es bekommt? Dank

Antwort

0

können Sie sehen, was eine Klasse Last in einigen Fällen ausgelöst, wenn Sie -XX:+TraceClassLoading verwenden und -XX:+TraceClassResolution Sie eine Sammlung von Loading Nachrichten angezeigt werden (wenn das .class- Bytes erhalten geladen) und anschließende RESOLVE Nachrichten, wenn die Klassen selbst gelöst bekommen . Indem Sie herausfinden, welche Nachrichten Sie sehen, sollten Sie in der Lage sein zu bestimmen, welche Klasse eine abhängige Klasse lädt.

Leider sagt Ihnen das nichts über Ihre Klassenlader. Obwohl die JAR-Datei, von der sie geladen wird, trotzdem ausgedruckt wird, ist es unter Umständen nicht möglich, die Frage mithilfe von Standardwerkzeugen zu beantworten, wenn dies Ihren Klassenlader nicht eindeutig identifiziert. Wenn Sie jedoch eine eingebettete Engine wie Tomcat oder OSGi verwenden, die ihre eigenen Klassenladeprogramme bereitstellen, können zusätzliche Debugging-Flags vorhanden sein, die Sie aktivieren können, um zu ermitteln, welche Classloader-Instanz verwendet wird.

0

Wenn Ihr Problem das Debuggen von Classloading ist, würde ich einen Debugger verwenden.

Mit Intelli konnte ich einen Breakpoint im Url-Classloader setzen. Sie können diesen Haltepunkt so konfigurieren, dass er eine benutzerdefinierte Nachricht protokolliert, anstatt zu brechen.

Wenn Sie dies in der Produktion einschalten möchten, könnten Sie natürlich Ihren eigenen Classloader schreiben.

Dies ist nicht schwierig, aber Sie müssen herausfinden, wie Sie sich in das Logging-Framework einloggen, ohne das Laden des Loading-Frameworks zu protokollieren. Ich denke, der einfachste Weg wäre, einige vordefinierte Pakete beim Loggen zu ignorieren. Wenn Sie diese Route wählen, kann ich Ihnen wahrscheinlich eine Shell einer Lösung bieten. Fragen Sie einfach.