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.

Memory Leak

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

Read the rest of this entry »

Refaktoryzacja jest jak seks!

Dlaczego?
Oto kilka powodów:
Read the rest of this entry »