Na portalu javaczyherbata pojawił się dzisiaj do rozwiązania ciekawy problem związany z alokacją pamięci w Java. Chodziło o wyjaśnienie przyczyny działania programu dwukrotnie alokującego tablicę bajtów o rozmiarze większym niż połowa maksymalnego rozmiaru heapa. Alokacja pierwszej tablicy odbywała się w bloku anonimowym, drugiej poza nim, więc teoretycznie mechanizm GC powinien sprzątnąć pierwszą tablicę (gdyż nie jest przetrzymywana do niej silna referencja) a program powinien zakończyć się bez rzucenia wyjątku OutOfMemoryError. Teoretycznie.

Read on →

W dzisiejszym poście chciałbym porównać trzy mechanizmy synchronizacji wątków w Java 6 - monitory, locki oraz semafory. Mechanizmy te umożliwiają tworzenie sekcji krytycznych, czyli modeli przepływu sterowania, które w danym momencie mogą być wykonywane tylko przez jeden wątek. Innymi sposobami na ochronę spójności danych jest oczywiście stosowanie obiektów niemutowalnych lub typów atomowych jednak na potrzeby tego artykuły chciałbym się skupić na porównaniu mechanizmów lockingu. Więcej o współbieżności można poczytać w innym wpisie, zapraszam ;)

Read on →

Błędy w kodzie się zdarzają każdemu bez względu na użytą technologię, język, framework czy posiadane zdolności. Część błędów jest łatwa do zdebugowania i poprawienia, są jednak te mniej przyjemne, trudne do powtórzenia, objawiające się tylko w pewnych warunkach. Na pewno większość z czytających ten tekst deweloperów spędziła niejedną godzinę, zarwała niejedną noc żeby znaleźć błąd czy chociażby próbować go tylko odtworzyć w środowisku deweloperskim. Zapewniam, że nic w tym przyjemnego :)

Read on →

Wpisem tym chciałbym zapoczątkować serię artykułów o technologii OSGi, technologii umożliwiającej wprowadzenie modularności do budowanych aplikacji i systemów na zupełnie nowym poziomie, technologii, która ma szansę odegrać kluczową rolę w świecie oprogramowania w całkiem niedalekiej przyszłości :)

OSGi jest specyfikacją rozwijaną przez OSGi Alliance grupę skupiającą kilkadziesiąt firm z całego świata. Głównym zadaniem grupy jest dostarczanie kolejnych specyfikacji OSGi i certyfikowanie ich implementacji.

Co właściwie znaczy OSGi? Skrót OSGi w pierwszych wersjach specyfikacji rozwijał się do Open Service Gateway initiative jednak w późniejszych wydaniach rozwinięcie to zostało zabronione ze względu na upowszechnienie się specyfikacji w miejscach, których pierwotnie nie przewidywała. Pierwsza wersja specyfikacji wydana w 2000 roku dotyczyła aplikacji sterujących fizycznymi urządzeniami i koncepcji automatycznego ładowania i instalowania sterowników do tych urządzeń. Kolejne wersje nie wiązały już się z konkretnym typem platformy sprzętowej co oczywiście wpłynęło na nieaktualność samego rozwinięcia nazwy. Jest ono więc na chwile obecną @Deprecated, mówiąc językiem developerów a OSGi nie znaczy po prostu nic. To w ramach ciekawostki.

Rozpoczynając dyskusje o OSGi zatrzymajmy się chwilę nad samym pojęciem modularności systemów, na pierwszy rzut oka terminu banalnego.

Read on →

JSR-308 jest to specyfikacja znana także jako Type Annotations Specification. Specyfikacja definiuje nowy typ adnotacji, tzw type annotations. Dzięki temu rozszerzeniu możemy używać adnotacji nie tylko do dekorowania metod, pól, konstruktorów, klas ale także dowolnego użytego w kodzie typu tak jak na przykładzie poniżej:

1
2
3
4
5
private List<@NonNull Object> list;

public @NonNull String getName() {
    return name;
}

Drugą częścią specyfikacji jest tzw checkers framework, framework rozszerzający możliwości kompilatora o mechanizmy statycznej analizy kodu. Analizą kodu zajmują się tzw checkery, realizujące pewne strategie analizy. JSR308 proponuje tutaj pewien zbiór standardowych checker’ów dołączanych jako pluginy do kompilatora. Specyfikacja wymienia i opisuje nastepujące checkery - nulness checker, interning checker, immutability checker, units checker, lock checker itp. Zadaniem każdego checker’a jest analiza kodu pod kątem występowania innych błędów. Po szczegóły odsyłam do specyfikacji - checkers-manual.html.

W chwili obecnej specyfikacja została przeniesiona z Java 7 do Java 8 jednak już dzisiaj można korzystać z jej możliwości w Java 6. Całkiem niedawno, przy okazji studiowania specyfikacji napisałem plugin do Maven 2 upraszczający cały proces podłączania checker’ów do kompilatora. Plugin, w zdefiniowanej w pom.xml fazie budowy, uruchamia wybrane checkery podane w jego konfiguracji. Po więcej informacji zapraszam na stronę domową pluginu gdzie opisałem m.in sposób jego użycia.

Go to JSR-308 checkers plugin site

Zostałem ostatnio zapytany przez pewną osobę co zrobić w przypadku gdy referencja do danego obiektu jest wg nas zbyt silna, tzn chcielibyśmy aby w pewnych przypadkach GC mógł usunąć obiekt, mimo iż wskazuje na niego pewna referencja. W “normalnym” zastosowaniu Javy tak jak to robi większość programistów łącznie ze mną, jest to po prostu niemożliwe - GC nie ma prawa usunąć obiektu, do którego istnieje jakakolwiek referencja. Z pomocą przychodzi jednak pakiet java.lang.ref, któremu postanowiłem się przyjrzeć nieco bliżej. W skład pakietu wchodzą następujące klasy:

  • Reference

  • SoftReference

  • WeakReference

  • PhantomReference

  • ReferenceQueue

Read on →