Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,833 views

Published on

Published in: Technology
  • Be the first to comment

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

  1. 1. Загрузчики  классов  в  Java  КОЛЛЕКЦИЯ  ГРАБЛЕЙ  
  2. 2. Докладчик  Антон  Архипов  @antonarhipov  
  3. 3. Что  бы  сделать  JRebel,  нам  потребовалось  …    Внедриться  в  процесс    загрузки  классов  
  4. 4. Потребовалось  …    проинтегрировать  решение    со  всевозможными*  серверами  приложений  (JBoss,  Glassfish,  итд)  *  -­‐  На  данный  момент  в  тестовой  среде  установлено  60  разных  версий  серверов  
  5. 5. и  …    решить  100500  проблем  связанных  с  загрузчиками  классов  
  6. 6. Полезное  чтиво  •  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.    
  7. 7. План  захвата  галактики  Основы  загрузки  классов  Коллекция  граблей  Как  загрузчики  «утекают»  
  8. 8. 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() }  
  9. 9. public class A { public void doSmth() { B b = new B(); b.doSmthElse(); } }  Эквивалентно  A.class.getClassLoader().loadClass(“B”);  
  10. 10. Модель  делегирования  У  каждого  загрузчика  есть  загрузчик-­‐«родитель»  Загрузчик  1  Загрузчик  2  
  11. 11. Модель  делегирования  «родитель»  обычно  опрашивается  первым    позволяет  избежать    излишней  загрузки    классов  Загрузчик  1  Загрузчик  2  МойКласс.class  
  12. 12. Модель  делегирования  Загрузчик  расширений  Системный  загрузчик  Базовый  загрузчик  Пользовательский  загрузчик  
  13. 13. Модель  делегирования  Загрузчик  расширений  Системный  загрузчик  Базовый  загрузчик  Пользовательский  загрузчик  Пользовательский  загрузчик  Пользовательский  загрузчик  
  14. 14. Модель  делегирования  Сюрприз!      В  окружении  Java  EE,  загрузчик  web-­‐модуля  опрашивается  первым  
  15. 15. Модель  делегирования    На  каждый  WAR  выделяется  отдельный  загрузчик    Позволяет  изолировать  приложения    в  рамках  одного  контейнера  
  16. 16. Делегирование  в  Java  EE  
  17. 17. hƒp://docs.oracle.com/cd/E19501-­‐01/819-­‐3659/beadf/index.html  Sun  Java  System  Applicaaon  Server  Pladorm    Ediaon  9  Developers  Guide  
  18. 18. Класс  не  найден  •  Разновидности:  ClassNotFoundExcepqon  NoClassDefFoundError  •  В  помощь:  Поиск  в  IDE  (Ctrl+Shi•+T  /  Ctrl  +  N)  find  *.jar  -­‐exec  jar  -­‐A  {}  ;  |  grep  MyClass  URLClassLoader.getUrls()  Логи!  
  19. 19. Найден,  но  не  тот  •  Варианты:  IncompaqbleClassChangeError  AbstractMethodError  NoSuch(Method|Field)FoundError  ClassCastExcepqon,  IllegalAccessError  •  В  помощь:  -­‐verbose:class  ClassLoader.getResource()  javap  -­‐private  MyClass  
  20. 20. Найдено  более  одного  •  Варианты:  LinkageError  (loader  constraint  violaqon)  ClassCastExcepqon,  IllegalAccessError  •  В  помощь  -­‐verbose:class  ClassLoader.getResource()  
  21. 21. Найдено  более  одного  Util3 u = (Util3) Factory3.instanceUntyped(); Factory3.instanceUntyped();  new Util3()  
  22. 22. Утечки  в  загрузчиках  Статические  поля  Статические  поля  Статические  поля  
  23. 23. Утечки  в  загрузчиках  WebAppFactory   WebAppFactory   WebAppFactory  Leak   Leak   Leak  
  24. 24. Запомнить!    В  случае  решений  проблем  с  загрузчиками  проверяйте  свои  гипотезы!    
  25. 25. Запомнить!  Чтобы  произошла  утечка  загрузчика,  достаточно  утечки  одного  объекта,  класс  которого  был  загружен  через  данный  загрузчик.  
  26. 26. Вопросы?  • @antonarhipov  • anton@zeroturnaround.com  • hƒp://www.jrebel.com    

×