niedziela, 10 marca 2013

Zjedz tę żabę, Brian Tracy

A zatem pierwsza reguła połykania żab brzmi: Jeśli musisz połknąć dwie żaby, zacznij od tej, która budzi w tobie większą odrazę.
Druga reguła połykania żab brzmi: Jeśli musisz połknąć żywą żabę, nie warto siedzieć i przyglądać się jej zbyt długo.

Tytuł tej książki natychmiast zwrócił moją uwagę. Za każdym razem gdy wychodzę poza swoją strefę komfortu, czuję, jakbym połykała żywą, obślizgłą, podskakującą w gardle żabę. I muszę przyznać, że wyobrażenie sobie tej żaby pomaga.

Zawartość książki jest przewidywalna: Pytaj i naśladuj ludzi, którym się udało. Wyobraź sobie, że osiągnąłeś swój cel. Zidentyfikuj najważniejsze zadania i skup się na nich. Twórz sztuczne terminy i ich dotrzymuj. Myśl z ołówkiem w ręku. Twórz listy zadań i celów.
Wszystko prawdziwe, wszystko skuteczne, wszystko powtarzane po wielokroć w każdej podobnej książce.

poniedziałek, 4 marca 2013

Here is a ClassLoader. He is a little bit shy.

Jevgeni Kabanov, Do You Really Get ClassLoaders? (JavaOne Rock Star 2012)

Jevgeni Kabanov jest założycielem ZeroTurnaround - firmy odpowiedzialnej za takie produkty jak JRebel i LiveRebel. Prezentacja jest lekka i przystępna. Najistotniejsze informacje:

1. Każdy ClassLoader ma rodzica (ClassLoader WAR ClassLoader < EAR ClassLoader < Container ClassLoader). ClassLoader wpierw zapyta rodzica, czy ten nie może załadować klasy, a dopiero później spróbuje sam to zrobić. Za wyjątkiem ClassLoaderów WAR-a - te wpierw spróbują załadować klasę, a dopiero później przekażą zadanie rodzicowi.

2. Diagnozując problem z ClassLoaderami (ClassNotFoundException, NoClassDefFoundError, NoSuchMethodError, AbstractMethodError, ClassCastException, IllegalAccessError, LinkageError, ...) warto wyświetlić wyniki poniższych wywołań: Można też użyć argumentu jvm -verbose:class.

3. Obiekt posiada referencję do klasy, klasa posiada referencję do ClassLoadera, ClassLoader posiada referencję do załadowanych przez siebie klas, klasy posiadają referencje do swoich statycznych pól.

Prezentacja przedstawia, jak może to doprowadzić do wycieku pamięci przy redeployu. Tworzymy nowy ClassLoader, ładujemy klasy od nowa, kopiujemy jakiś stan, przy czym jedna z kopii zachowuje referencję do swojego oryginału - i w pamięci pozostają stare klasy, przykładowo z pokaźnymi statycznymi mapami robiącymi za cache.

Co za tym idzie - na produkcji robimy restarty a nie redeploye.