Archive for the ‘Ciekawostki’ Category
How to create a Memory Leak
Krótki artykuł pokazujący – na podstawie dwóch przykładów – jak łatwo można spowodować wycieki pamięci w Javie. Pierwszy przypadek dotyczy elementów kolekcji, które mają nieprawidłowo zaimplementowane metody equals()
/hashcode()
. Natomiast drugi traktuje o zachowaniu klasy String
w pewnych sytuacjach.
Do You Really Get Classloaders?
Jevgeni Kabanov (ZeroTurnaround) opowiada o niuansach pracy nad JRebel, skupiając się na aspekcie przeładowania kodu aplikacji bez restartu serwera. Mechanizm ładowania klas omawia zarówno od strony JVM jak i programisty. Każdy problem (np. NoClassDefFoundError
, LinkageError
) przedstawia na przykładzie i podaje rozwiązania. Wyjaśnia jak obiekty, klasy i classloadery są ze sobą powiązane.
Read the rest of this entry »
Jak zamienić wartości 2 zmiennych bez zmiennej tymczasowej?
Pamiętacie pewnie z Algorytmów czy Metod Programowania, jak trzeba było zamieniać wartości zmiennych miejscami, np. w algorytmach sortujących. Pisało się wtedy kod w stylu:
tmp = i i = j j = tmp
Poniżej prezentuje znalezione przeze mnie sposoby, jak zamienić wartości dwóch zmiennych bez użycia zmiennej pomocniczej.
Read the rest of this entry »
Innowacje – jakie lekcje możemy wyciągnąć ze starożytności i średniowiecza?
Wojciech Kuśmierek na Barcampie w Warszawie bardzo ciekawie opowiada o innowacjach.
Link do prezentacji.
Scala Tricks by Venkat Subramaniam
Genialny, żartobliwy, pełen energii i pasji Venkat Subramaniam prezentuje sztuczki i kruczki w Scali.
Zagadka z magicznymi Stringami
W związku ze sporym zainteresowaniem i wieloma prośbami, przygotowałem kolejną zagadkę. Tym razem należy napisać kawałek złośliwego kodu, aby „zaczarować” fragment inwokacji tak, by podczas jego wypisywania na ekran, pojawił się zupełnie inny napis.
Oto kod zagadki: Read the rest of this entry »
Zagadka z Java Memory
Ostatnia zagadka okazała się bardzo łatwa. Zatem dziś pora na nieco trudniejszą i ciekawszą.
Oto kod zagadki.
public class JVMPuzzle { private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6); public void go() { { byte[] bytes1 = new byte[dataSize]; } // for (int i = 0; i < 3; i++) { // System.out.println("Barista prosi: JVM zwolnij pamięć!"); // } byte[] bytes2 = new byte[dataSize]; } public static void main(String[] args) { new JVMPuzzle().go(); } }
Po skompilowaniu i uruchomieniu powyższego kodu otrzymujemy java.lang.OutOfMemoryError
:
<barista@javaczyherbata.pl> java JVMPuzzle Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at JVMPuzzle.go(JVMPuzzle.java:14) at JVMPuzzle.main(JVMPuzzle.java:18)
Natomiast jeśli odkomentujemy linie 10-12, skompilujemy i uruchomimy program ponownie, to błąd braku pamięci się nie pojawi.
Jak to jest, że JVM słucha się Baristy? 🙂
Mechanizmy synchronizacji wątków w Javie 6
Jeśli piszesz aplikacje wielowątkowe w Javie, to prędzej czy później zainteresujesz się mechanizmami synchronizacji. Łukasz Dembiński przedstawia trzy najpopularniejsze sposoby synchronizacji wątków w Javie 6 oraz porównuje ich wydajność przy różnych współczynnikach współbieżności. W swoich porównaniach, oprócz wydajności, bierze pod uwagę także zapewnianie funkcjonalności:
- reentrant locking
- timed locking
- lock polling
- condition locking
- shared / exclusive locking
- lock ownership
Zapraszam do lektury.
Zagadka ze Stringami
Stosunkowo prosta lecz ciekawa zagadka dotycząca klasy String
. Dlaczego po uruchomieniu poniższego kodu otrzymujemy:
<barista@javaczyherbata.pl> java StringPuzzle true false