Что для Sun JVM создает экземпляры sun.reflect.DelegatingClassLoader во время выполнения?

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


person Eugen    schedule 28.06.2011    source источник


Ответы (2)


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

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

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

person Nat    schedule 09.01.2012
comment
Предупреждение, это свойство работает в Oracle/OpenJDK и IBM JDK, однако на IBM оно включает инфляцию, на Sun оно сразу же надувается (попробовал это, используя -verbose:class, который возвращает в экземпляре DelegatedClassLoaders, так как код для IBM недоступен ). На обоих значение по умолчанию равно 15, я бы подумал об установке его на 1000 или что-то в этом роде, чтобы уменьшить инфляцию, но все же получить выгоду от ускорения. - person eckes; 08.12.2013

Я не вижу (по крайней мере, для 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 будет работать.

person C. Allain    schedule 16.07.2012
comment
IBM ведет себя по-другому, он отключит его с 0 или 1. (Не уверен, что он делает что-то другое для 0 или 1, но с обоими я не вижу загрузки DelegatingClassLoader). - person eckes; 08.12.2013