Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Загрузчики классов в Java - коллекция граблей

Загрузчики классов в Java - коллекция граблей

Загрузчики классов в Java - коллекция граблей

Anton Arhipov

April 24, 2013
Tweet

More Decks by Anton Arhipov

Other Decks in Technology

Transcript

  1. Что  бы  сделать  JRebel,   нам  потребовалось  …    

    Внедриться  в  процесс     загрузки  классов  
  2. Потребовалось  …     проинтегрировать  решение     со  всевозможными*

     серверами   приложений  (JBoss,  Glassfish,  итд)   *  -­‐  На  данный  момент  в  тестовой  среде   установлено  60  разных  версий  серверов  
  3. Полезное  чтиво   •  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.    
  4. 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() }  
  5. public class A { public void doSmth() { B b

    = new B(); b.doSmthElse(); } }   Эквивалентно   A.class.getClassLoader().loadClass(“B”);  
  6. Модель  делегирования   «родитель»  обычно   опрашивается  первым    

    позволяет  избежать     излишней  загрузки     классов   Загрузчик  1   Загрузчик  2   МойКласс.class  
  7. Модель  делегирования   Загрузчик  расширений   Системный  загрузчик   Базовый

     загрузчик   Пользовательский  загрузчик   Пользовательский  загрузчик   Пользовательский  загрузчик  
  8. Модель  делегирования   Сюрприз!       В  окружении  Java

     EE,  загрузчик  web-­‐ модуля  опрашивается  первым  
  9. Модель  делегирования     На  каждый  WAR  выделяется   отдельный

     загрузчик     Позволяет  изолировать  приложения     в  рамках  одного  контейнера  
  10. Класс  не  найден   •  Разновидности:   ClassNotFoundExcepqon   NoClassDefFoundError

      •  В  помощь:   Поиск  в  IDE  (Ctrl+Shi•+T  /  Ctrl  +  N)   find  *.jar  -­‐exec  jar  -­‐A  '{}'  \;  |  grep  MyClass   URLClassLoader.getUrls()   Логи!  
  11. Найден,  но  не  тот   •  Варианты:   IncompaqbleClassChangeError  

    AbstractMethodError   NoSuch(Method|Field)FoundError   ClassCastExcepqon,  IllegalAccessError   •  В  помощь:   -­‐verbose:class   ClassLoader.getResource()   javap  -­‐private  MyClass  
  12. Найдено  более  одного   •  Варианты:   LinkageError  (loader  constraint

     violaqon)   ClassCastExcepqon,  IllegalAccessError   •  В  помощь   -­‐verbose:class   ClassLoader.getResource()  
  13. Запомнить!   Чтобы  произошла  утечка   загрузчика,  достаточно  утечки  

    одного  объекта,  класс  которого   был  загружен  через  данный   загрузчик.