Что для Sun JVM создает экземпляры sun.reflect.DelegatingClassLoader во время выполнения? - PullRequest
17 голосов
/ 28 июня 2011

Анализируя дамп кучи с использованием jhat, я наблюдал множество созданных случаев DelegatingClassLoader, хотя они не были явно вызваны в коде.Я ожидаю, что это будет своего рода механизм оптимизации отражения.Кто-нибудь знает детали?

Ответы [ 2 ]

17 голосов
/ 09 января 2012

Да, это, вероятно, оптимизация отражения.

В Sun JVM отражательный доступ к свойствам и методам первоначально осуществляется путем вызова через JNI в реализацию JVM. Если JVM замечает, что метод или поле доступны посредством отражения, она сгенерирует байт-код, чтобы сделать то же самое - механизм, который он называет «инфляцией». Это имеет начальную скорость удара, но после этого работает примерно в 20 раз быстрее. Большая победа, если вы много размышляете.

Этот байт-код находится в классах, созданных экземплярами DelegatingClassLoader. Следите за этим: эти классы могут оказывать давление на пространство permgen и вызывать страшные ошибки «java.lang.OutOfMemoryError: PermGen space». Если это проблема, вы можете отключить инфляцию, установив системное свойство sun.reflect.inflationThreshold в 0 (ноль).

3 голосов
/ 16 июля 2012

Я не вижу (по крайней мере, для Hotspot), когда смотрю на код

http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/reflect/ReflectionFactory.java.html

и

http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/reflect/NativeMethodAccessorImpl.java.html

что установка нуля отключит функцию. Мне кажется, только большое значение для sun.reflect.inflationThreshold сделает эту работу.

...