Загрузчики классов в Java - коллекция граблей
-
Upload
anton-arhipov -
Category
Technology
-
view
2.229 -
download
2
description
Transcript of Загрузчики классов в Java - коллекция граблей
Загрузчики классов в Java КОЛЛЕКЦИЯ ГРАБЛЕЙ
Докладчик
Антон Архипов @antonarhipov
Что бы сделать JRebel, нам потребовалось …
Внедриться в процесс загрузки классов
Потребовалось …
проинтегрировать решение со всевозможными* серверами приложений (JBoss, Glassfish, итд)
* -‐ На данный момент в тестовой среде установлено 60 разных версий серверов
и …
решить 100500 проблем связанных с загрузчиками классов
Полезное чтиво • Vijay Saraswat, Java is not type-‐safe, 1997 • Sheng Liang and Gilad Bracha, Dynamic Class Loading in the Java Virtual Machine in Proc. of the ACM Conf. on Object-‐Oriented Programming, Systems, Languages and Applicaqons, October 1998.
План захвата галактики
Основы загрузки классов Коллекция граблей Как загрузчики «утекают»
public abstract class ClassLoader { public Class loadClass(String name) protected Class defineClass(byte[] b) public URL getResource(String name) public Enumeration getResources(String name) public ClassLoader getParent()}
public class A { public void doSmth() { B b = new B(); b.doSmthElse(); }}
Эквивалентно A.class.getClassLoader().loadClass(“B”);
Модель делегирования
У каждого загрузчика есть загрузчик-‐«родитель»
Загрузчик 1
Загрузчик 2
Модель делегирования
«родитель» обычно опрашивается первым позволяет избежать излишней загрузки классов
Загрузчик 1
Загрузчик 2
МойКласс.class
Модель делегирования
Загрузчик расширений
Системный загрузчик
Базовый загрузчик
Пользовательский загрузчик
Модель делегирования
Загрузчик расширений
Системный загрузчик
Базовый загрузчик
Пользовательский загрузчик
Пользовательский загрузчик
Пользовательский загрузчик
Модель делегирования
Сюрприз!
В окружении Java EE, загрузчик web-‐модуля опрашивается первым
Модель делегирования
На каждый WAR выделяется
отдельный загрузчик
Позволяет изолировать приложения в рамках одного контейнера
Делегирование в Java EE
h�p://docs.oracle.com/cd/E19501-‐01/819-‐3659/beadf/index.html
Sun Java System Applicaaon Server Pladorm Ediaon 9 Developer's Guide
Класс не найден • Разновидности:
ClassNotFoundExcepqon NoClassDefFoundError
• В помощь: Поиск в IDE (Ctrl+Shi�+T / Ctrl + N) find *.jar -‐exec jar -‐A '{}' \; | grep MyClass URLClassLoader.getUrls() Логи!
Найден, но не тот • Варианты:
IncompaqbleClassChangeError AbstractMethodError NoSuch(Method|Field)FoundError
ClassCastExcepqon, IllegalAccessError • В помощь:
-‐verbose:class ClassLoader.getResource() javap -‐private MyClass
Найдено более одного • Варианты: LinkageError (loader constraint violaqon) ClassCastExcepqon, IllegalAccessError
• В помощь -‐verbose:class ClassLoader.getResource()
Найдено более одного
Util3 u = (Util3) Factory3.instanceUntyped();
Factory3.instanceUntyped(); new Util3()
Утечки в загрузчиках
Статические поля
Статические поля
Статические поля
Утечки в загрузчиках
WebAppFactory WebAppFactory WebAppFactory
Leak Leak Leak
Запомнить!
В случае решений проблем с загрузчиками проверяйте свои
гипотезы!
Запомнить!
Чтобы произошла утечка загрузчика, достаточно утечки одного объекта, класс которого был загружен через данный
загрузчик.
Вопросы?
• @antonarhipov • [email protected] • h�p://www.jrebel.com