Pokazywanie postów oznaczonych etykietą java. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą java. Pokaż wszystkie posty

wtorek, 19 lutego 2008

Z archiwum X

Każdy kto na poważnie zajmuje się programowaniem w Javie zetknął się z przełącznikami, które można ustawiać przy wywołaniu wirtualnej maszyny. Naturalnie w większości przypadków wystarczają trzy:
  • -jar do wskazywania archiwum Jar zamiast pojedynczego pliku klasy
  • -cp (lub -classpath) do ustawiania ścieżki klas
  • -Xmx do ustawiania maksymalnej wielkości stosu (przydatne zwłaszcza przy pracy ze środowiskami typu Eclipse czy Netbeans)
Ten ostatni to tak naprawdę tylko jeden skromny przedstawiciel bardzo płodnej rodziny przełączników X. JVM od Suna posiada ich mnóstwo, a implementacje od IBM czy Bea również posiadają swoje zestawy. Jak się w tym połapać? Na szczęście jest strona która zbiera wszystkie przełączniki w jednym miejscu (chociaż tylko z implementacji Sunowskiej) - "A Collection of JVM Options". Podane są przełączników nazwy, wartości, wersje JVM które je obsługują, a spora część z nich jest całkiem dobrze opisana (chociaż nie znalazłem tam np. niekiedy cennej informacji że przełącznik -client jest zawsze domyślnie włączony w JVM dla systemów Windows).

Od teraz będę już wiedzieć jak sprawić żeby JVM zauważył że jest w środowisku 64-bitowym (-d64), włączyć zapisywanie do pliku logu akcji odśmiecania pamięci (-Xloggc), wymusić użycie maksymalnej dostępnej pamięci (-XX:+AggressiveHeap) czy wyświetlić ilość użytej pamięci stosu (-XX:+PrintHeapUsageOverTime). Masa innych trików czeka jednak na swoich odkrywców, a więc do dzieła!

piątek, 24 sierpnia 2007

Producent-Konsument w Javie 5

Całkiem niedawno, przeglądając dokumentację API dla Java 1.5, odkryłem że pojawił się tam całkiem ciekawy mechanizm upraszczający rozwiązanie odwiecznego problemu Producenta - Konsumenta.

Interfejs BlockingQueue, bo o nim mowa, reprezentuje typ synchronizowanej kolejki o zadanej pojemności. Udostępnia bardzo wygodne w użyciu metody wstawiania (add / offer / put) i pobierania obiektów (poll / take). Ich wygoda polega na ich różnorodności:
  • put wstawia obiekt, czekając jeśli trzeba na zwolnienie miejsca w kolejce
  • offer próbuje wstawić obiekt i zwraca true / false jako odpowiedź czy operacja się udała
  • add wstawia obiekt do kolejki "na siłę" i ewentualnie rzuca IllegalStateException jeśli kolejka jest już pełna
  • take pobiera obiekt z kolejki, czekając jeśli trzeba na pojawienie się obiektu w kolejce
  • poll pobiera obiekt z kolejki lub null, jeśli upłynie określona ilość czasu a kolejka jest pusta
Korzystając z powyższych metod, przykładowa implementacja klas producenta i konsumenta może wyglądać tak (wg oficjalnej dokumentacją Javy):

class Producer implements Runnable {
private final BlockingQueue queue;

Producer(BlockingQueue q) { queue = q; }

public void run() {
try {
while(true) { queue.put(produce()); }
} catch (InterruptedException ex) { ... }
}

Object produce() { ... }
}

class Consumer implements Runnable {
private final BlockingQueue queue;

Consumer(BlockingQueue q) { queue = q; }

public void run() {
try {
while(true) { consume(queue.take()); }
} catch (InterruptedException ex) { ... }
}

void consume(Object x) { ... }
}