2013-07-11 10 views
6

Beim Debuggen von Spring-driven AspectJ LTW (unter Verwendung von -verbose: class) habe ich festgestellt, dass eine der zu beratenden Klassen vom Klassenlader geladen wird, bevor Spring die Verbindung zum AspectJ herstellt Weber.Referenzklassen für das Laden von Java-Klassen

Wenn man bedenkt, dass Java das Laden einer Klasse verschiebt, bis es nicht mehr verzögert werden kann, muss es einen Grund geben, warum diese bestimmte Klasse so bald geladen wird.

Ist es möglich, den "references stack" zu erhalten, der das Laden einer Klasse in die JVM zu einem bestimmten Zeitpunkt provoziert (so kann ich versuchen, seine Verwendung zu verschieben)? Wenn ja, wie kann ich es tun?

+0

Könnte eine gute Idee sein, überprüfen Sie Ihren Klassenpfad, der die Klasse enthalten könnte und geladen wird, bevor tatsächlich Frühling die Möglichkeit erhält, zu beraten. – Shailendra

Antwort

2

Wie Sie bereits bemerkt haben, lädt Java (oder eigentlich die VM, auf der der Code ausgeführt wird) die Klassen zu dem Zeitpunkt, zu dem sie benötigt werden. Dies führt normalerweise auch zu einem Anstoßeffekt für mehrere Klassen. Es besteht offensichtlich eine hohe Wahrscheinlichkeit, dass die Klassen, die den Webcode nicht enthalten, vor den Spring-Klassen geladen werden. Die Java HotSpot-VM (die typische VM, wenn Oracle Java installiert ist) kann beim Starten in vielerlei Hinsicht configured sein. Eine dieser Optionen ist "-XX: + TraceClassLoading" (beachten Sie das Pluszeichen; der oben genannte Link dokumentiert leider ein Minuszeichen für diese Option). Es gibt auch eine andere Option, die die geladenen Klassen in Referenzreihenfolge verfolgt.

Damit sollten Sie das Problem eingrenzen können. Wenn nicht, könnte ein Beispielcode hilfreich sein. Obwohl ich befürchte, dass das ein bisschen zu groß wäre.

+1

Das - bedeutet, die Option zu deaktivieren, das +, um es zu aktivieren, es wird dort angezeigt, weil es der Standardwert ist. – Jacopofar

+0

Sie haben Recht, aber wie oft Sie die Option nur kopieren/einfügen und fragen, warum es keine Wirkung zeigt? Das passiert mir regelmäßig. :-) – Seelenvirtuose

+0

Danke für deinen Vorschlag, aber dieser Modifikator gibt mir nur die gleiche Ausgabe wie -verbose: class, d. H. Drucken, wenn eine Klasse geladen ist. Dies ist nützlich, um lineare und einfache Klassenabhängigkeiten zu identifizieren (durch Betrachten der vorherigen geladenen Klassen), aber nicht so sehr für komplexe Klassen. – andresp