Загрузчики классов в Java - коллекция граблей
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 2,103 views

 

Statistics

Views

Total Views
2,103
Views on SlideShare
2,103
Embed Views
0

Actions

Likes
3
Downloads
4
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • Загрузчики  классов  в  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  Developers  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  • anton@zeroturnaround.com  • hƒp://www.jrebel.com