Was für Sun JVM erstellt Instanzen der Sonne.reflektieren.DelegatingClassLoader zur Laufzeit?
Während der Analyse einen heap-dump mit jhat habe ich beobachtet, dass viele Instanzen von DelegatingClassLoader erstellt, obwohl Sie waren nicht explizit im code. Ich erwarte, dass dies eine Art der Reflexion optimization mechanism. Weiß jemand die details?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist wahrscheinlich eine Reflexion Optimierung.
Auf die Sun JVM, reflektierende Zugriff auf Eigenschaften und Methoden zunächst erfolgt durch Berufung durch JNI in der JVM-Implementierung. Wenn die JVM merkt, dass eine Methode oder Feld zugegriffen wird, die durch Reflexion eine Menge, wird es generieren von bytecode zu tun, die gleiche Sache-ein Mechanismus, der es fordert, "die inflation". Dies hat eine anfängliche Geschwindigkeit schlagen, aber danach läuft etwa 20 mal schneller. Eine große gewinnen, wenn Sie tun eine Menge der Reflexion.
Dass bytecode lebt in Klassen erstellt durch DelegatingClassLoader Instanzen. Halten Sie ein Auge auf Sie: diese Klassen kann Druck auf den permgen-Speicherplatz und verursachen das gefürchtete "java.lang.OutOfMemoryError: PermGen space" - Fehler. Wenn es ein problem ist, können Sie drehen Sie die inflation aus, durch die Einstellung der system-property sun.reflektieren.inflationThreshold auf 0 (null).
Sehe ich nicht (zumindest für Hotspot), wenn man bei code
http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/reflect/ReflectionFactory.java.html
und
http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/reflect/NativeMethodAccessorImpl.java.html
dass eine Einstellung von null wird das feature deaktivieren. Scheint mir nur einen großen Wert für die Sonne.reflektieren.inflationThreshold wird die Arbeit machen.