Frage

Ich versuche, einige Unit-Tests für einen alten Rahmen zu implementieren. Ich versuche, die Datenbank-Ebene zu verspotten. Leider ist unser Rahmen ein wenig alt und nicht ganz Best Practices mit so gibt es keine klare Trennung von Bedenken ist. Ich bin etwas besorgt, dass die Datenbankschicht zu verspotten versuchen könnte die JVM eine große Anzahl von Klassen machen laden, die nicht einmal verwendet wird.

Das verstehe ich nicht wirklich Klassenlader, der gut so ist dies kein Problem sein könnte. Gibt es eine Möglichkeit, einen Peak bei allen Klassen ein bestimmtes Klassenladeprogramm geladen ist zu ergreifen, um zu beweisen, was unter der Haube ist hier los?

War es hilfreich?

Lösung

, dass die Verwendung gewarnt

java -verbose

Wird eine enorme Menge an Output erzeugen. Melden Sie sich die Ausgabe in eine Datei und dann grep verwenden. Wenn Sie die T-Stück der "Filter haben Sie könnten versuchen, diese:

java -verbose | tee classloader.log
grep class classloader.log

Andere Tipps

Sie können Ihre eigenen Classloader erstellen und dass während des Unit-Tests zu laden verwenden. Haben Sie Ihre eigenen Classloader Ausdruck, was es tut.

Oder wenn Sie wollen einfach nur wissen, welche Klassen geladen werden, zu tun:

java -verbose:class

Ich bin nicht sicher. Aber es gibt einen Weg, ich sehe es getan werden könnte. Es ist vielleicht overrly obwohl lächerlich. Sie können Aspekte versuchen, einen pointcut für loadclass setzen. Vielleicht auch das JVM-Argument -verbose vielleicht hilfreich.

Als ein alternativer Weg für eine bestimmte Klasse-Lader wie Sie erwähnt haben, können Sie diesen Code-Schnipsel verwenden. Ändern Sie einfach Wert von obj Variable, wenn Sie wollen.

Object obj = this;
ClassLoader classLoader = obj.getClass().getClassLoader();
File file = new File("classloderClasses.txt");
if (file.exists()) {
    file.delete();
}
if (classLoader != null) {
    try {
        Class clClass = classLoader.getClass();
        while (clClass != ClassLoader.class) {
            clClass = clClass.getSuperclass();
        }
        java.lang.reflect.Field classesField = clClass.getDeclaredField("classes");
        classesField.setAccessible(true);
        Vector classes = (Vector) classesField.get(classLoader);
        FileOutputStream fos = new FileOutputStream("classloderClasses.txt", true);
        fos.write(("******************** " + classLoader.toString() + " ******************** " + "\n").getBytes());
        fos.write(Arrays.toString(classes.toArray()).getBytes());
        fos.close();
    } catch (Exception exception) {
        exception.printStackTrace();
        // TODO
    }
}

Sie verwenden die -Xlog Option zu konfigurieren oder aktivieren mit der Java Virtual Machine (JVM) Unified Logging-Framework Protokollierung. Der Vorteil ist, dass Sie die Ergebnisse in einer Textdatei schreiben

Überblick

-Xlog[:[what][:[output][:[decorators][:output-options [,...]]]]]
  

In Unified Logging-Syntax -verbose:class gleich -Xlog:class+load=info

Zum Beispiel

java -Xlog:class+load=info:classloaded.txt

Ocarle doc

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top