poniedziałek, 5 września 2011

JAVA 7 - czyli kilka drobnych nowości.

Na nową odsłonę JSE trzeba było poczekać nam około pięciu lat. Java Standard Edition 7 jest to pierwsze wydanie od czasu przejęcia Sun przez Oracle. Nowa wersja nie jest rewolucyjna jeśli chodzi o nowe zmiany. Jest to kolejna ewolucja JSE opatrzona  numerem - 7. Termin upublicznienia nowej wersji był nie raz zmieniany, powodem tego było pewnie przejęcie Sun'a przez Oracle'a.








Na stronie: http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html możemy zobaczyć szczegółową listę zmian.

Do najważniejszych zmian w nowej edycji JSE możemy zaliczyć między innymi :
  • Garbage First - nowy udoskonalony garbage collector w maszynie wirualnej HotSpot
  • Dla maszyn o architekturze 64-bitowej "skompresowany" 64-bitowy wskaźnik
  • Biblioteka Fork/Join czyli lepsza obsługa procesorów wielordzeniowych i wielowątkowości
  • Projekt Coin - udogodnienia na poziomie składniowej języka(zmniejszenie objętości kodu). Kompilator automatycznie zamyka pliki, gniazda itp.
  • Poprawiona obsługa operacji I/O.
  • Udoskonalone wsparcie dla języków dynamicznych


      Garbage Collector zarządza pamięcią w JAVIE. Jest to mechanizm, który zwalnia pamięć z nieużywanych obiektów. Działa on niejawnie czyli w tle aplikacji. Jest on nie raz częstą przyczyną spowolnienia naszych programów. Strojenie tego mechanizmu jest bardzo trudne, ponieważ istnieje około 200 parametrów GC. W związku z tym w wydaniu JDK 6 update 14 mamy dostępny nowy eksperymentalny Garbage First. Jest on przeznaczony według twórców do systemów serwerowych, wielowątkowych używających duże ilości pamięci. Nowy mechanizm tak jego poprzednicy jest równoległy, współbieżny i pokoleniowy. Wyróżnia go kompaktowanie sterty, czyli mała fragmentacja pamięci.Sterta podzielona jest na obszary o rozmiarze 1MB. Możemy, także "powiedzieć mu" przez jaki okres czasu ma działać. Jest łatwiejszy w użyciu.
      W poprzednich wersjach GC obszary pamięci, w których są obiekty młode i stare mają stałą wielkość. W nowym Garbage Collector regiony na które jest podzielona pamięć mogą wchodzić w skład pokolenia młodego lub starego i jest to dynamicznie zmieniane w czasie działania aplikacji.
      W maszynach 32-bitowych do dyspozycji mamy 2^32 = 4GB przestrzeni adresowej, a maksymalny rozmiar sterty zależy od systemu operacyjnego. W 64- bitowej maszynie wirtualnej rozmiar ten jest tak duży, że praktycznie możemy nie przejmować się nagłym brakiem dostępnej pamięci. Wadą 64-bitowej maszyny wirtualnej jest zwiększenie zużycia pamięci. Wynika to ze zwiększenia nagłówków obiektów, większego rozmiaru wskaźników do innych obiektów. Garbage First oferuje nam skompresowany 64-bitowy wskaźnik, dzięki temu różnica w zużyciu pamięci między 32-bitową, a 64-bitową platformą staje się dużo mniejsza. Skompresowany wskaźnik jest 32-bitowym offsetem od początku sterty, dlatego w przypadku sterty większej niż 32Gb maszyna wirtualna używa "pełnych" 64-bitowych wskaźników.


      Framework fork/join jest implementacją interfejsu ExecutorService. ExecutorService jest rozszerzeniem interfejsu Executor, zarządza on cyklem życia wątków, a także śledzi postęp wykonywanego zadania. Fork/Join ma  pomóc programiście w wykorzystaniu wielu procesorów. Jest zaprojektowany dla zadań, które możemy podzielić na mniejsze kawałki. Framework ten dystrybuuje zadania do działających wątków w puli wątków. Używa on algorytmu wykradania zadań (work-stealing). Działające wątki, którym zabraknie zadań, mogą je "ukraść" od innych, które są w tym czasie zajęte. Centralną częścią frameworka jest klasa ForkJoinPool rozszerzająca abstrakcyjną klasę AbstractExecutorService. Klasa implementuje algorytm wykradania zadań i może wykonać ForkJoinTasks(są to "lekkie wątki ").

     Zasada działania użycia tego frameworka jest bardzo prosta. Jeśli nasz kod wykonuje jakieś zadanie, ze względu na jego duży rozmiar możemy go podzielić na mniejsze kawałki. Przykład ze strony Oracle'a jest prosty. Mamy za zadanie wykonać rozmycie obrazy tzw. blur. Obraz jest reprezentowany przez tablicę liczb, gdzie każda liczba zawiera składowe koloru pojedynczego pixela. Obraz rozmyty będzie, także reprezentowany w takiej samej postaci. Poniższy kod przedstawia realizację rozmycia obrazu:



Teraz pora na implementację abstrakcyjnej metody compute(), która wykonuje rozmycie obrazu bezpośrednio lub dzieli go na dwa mniejsze zadania. Od tego czy zadanie będzie podzielone zależy rozmiar tablicy.




Na poziomie samego języka mamy kilka udogodnień. Java 7 wprowadza literały binarne. Pozwalają na zapisywanie typów takich jak: byte, short, int i long za pomocą systemu binarnego.



Nowością jest możliwość użycia znaku podkreślenia.



Dla wygody zaimplementowana została możliwość użycia String w konstrukcji switch-case:



Diamond. Nie musimy dwukrotnie podawać typu elementu w klasach wykorzystujących typy ogólne - generics.



Łapanie kilku wyjątków w jednym bloku catch:



Automatyczne zarządzanie zasobami. Dzięki niemu zasoby zdefiniowane w bloku try będą dostępne, a po jego zakończeniu zostaną automatycznie zamknięte. Java 7 oferuje interfejs AutoCloseable, posiada on metodę close(), która odpowiada za zamknięcie zasobu.



Klasa java.io.File nie dawała nam takich metod, które odpowiedzialne były by za kopiowanie lub przenoszenie plików. Poza tym miała problemy z wydajnością przy obsłudze "dużych" katalogów. Java 7 wprowadza udoskonalone API dostępu do systemu plików. Nowe pakiety java.nio.file, java.nio.file.attribute oferują nam więcej możliwości. Być może opisze je następnym razem.

Reakcje:

0 komentarze:

Prześlij komentarz