• Nie Znaleziono Wyników

Pamięć w Javie

N/A
N/A
Protected

Academic year: 2021

Share "Pamięć w Javie"

Copied!
3
0
0

Pełen tekst

(1)

Pamięć w Javie

Marcin Orchel

1 Wstęp

Zmienna typu prostego przechowuje wartość odpowiedniego typu. Zmienna typu klasowe- go T może przechowywać referencje pustą (null) lub referencje do instancji klasy T lub dowolnej podklasy T . Zmienna typu interfejsowego może przechowywać referencję pustą lub referencję do dowolnej instancji dowolnej klasy, która implementuje interfejs. Jeśli T jest typem prostym, wtedy zmienna typu tablica T może przechowywać referencję pustą lub referencję do dowolnej tablicy typu tablica T . Jeśli T jest typem referencyjnym, to zmienna typu tablica T może przechowywać referencję pustą lub referencję do dowolnej tablicy typu tablica S, gdzie S jest podklasą T lub podinterfejsem T .

Zmienna typu Object[] może przechowywać referencję do tablicy dowolnego typu referencyjnego.

Zmienna typu Object może przechowywać referencję pustą lub referencję do dowol- nego obiektu, czy to instancji klasy, czy tablicy.

Zmienna parametryczna tworzona przy wywołaniu metody jest inicjalizowana odpo- wiadającą wartością argumentu z wywołania metody.

1.1 Wykonanie programu

JVM może wykonywać wiele wątków jednocześnie. Każdy wątek JVM ma własny rejestr pc, czyli licznik programu. W każdym momencie każdy wątek JVM wykonuje kod poje- dynczej metody, tzw. aktualnej metody dla tego wątku. Jeśli to nie jest metoda natywna rejestr pc zawiera adres instrukcji JVM aktualnie wykonywanej. Dla metod natywnych jest niezdefiniowany.

Każdy wątek JVM ma prywatny stos JVM (JVM stack), utworzony w tym samym czasie co wątek. Stos JVM przechowuje ramki. Stos JVM jest analogiczny do stosu kon- wencjonalnego języka, jak C: przechowuje lokalne zmienne, częściowe rezultaty i uczest- niczy częściowo w wywołaniu metody i powrocie. Stos JVM może być modyfikowany za pomocą operacji dodawania i usuwania ramek. Ramki mogą być alokowane też na ster- cie. Pamięć dla stosu nie musi być obszarem ciągłym. Przy uruchomieniu Javy możemy użyć parametru -Xss do ustawienia rozmiaru stosu. Kiedy wykonanie wątku wymaga więcej pamięci niż jest dozwolone, JVM wyrzuca StackOverflowError.

Ramka jest używana do przechowywania danych i częściowych rezultatów, a także do dynamicznego linkowania, zwracania wartości przez metodę i do przekazywania wy- jątków. Ramka jest tworzona podczas wywołania metody. Jest niszczona podczas zakoń-

1

(2)

czenia metody. Każda ramka posiada własną tablicę zmiennych lokalnych, stos wywołań i referencję do puli stałych klasy w której znajduje się metoda. Podczas działania wątku tylko jedna ramka jest aktywna, jest to aktualna ramka, a metoda zwana jest aktualną metodą, a klasa aktualną klasą.

JVM ma stertę (heap), która jest dzielona między wszystkie wątki JVM. Sterta to obszar danych wykonawczych w którym jest alokowana pamięć dla instancji klas i ta- blic. Sterta jest utworzona podczas startu JVM. Przydzielaniem pamięci dla obiektów zajmuje się odśmiecacz pamięci (garbage collector), obiekty nigdy nie są bezpośrednio dealokowane. Pamięć dla sterty nie musi być obszarem ciągłym. Możemy ustawiać mini- malną pamięć dla sterty za pomocą -Xms rozmiar sterty startowy, -Xmx rozmiar sterty maksymalny.

JVM posiada obszar metod dzielony przez wszystkie wątki. Jest on logiczną częścią sterty. Jest on tworzony podczas uruchomienia JVM. Przechowywane są w nim pula stałych, dane klas i pól klas, kod metod i konstruktorów. Nie musi to być obszar cią- gły. Każda klasa, interfejs posiada swoją pulę stałych. Pula stałych jest konstruowana podczas utworzenia klasy lub interfejsu. W HotSpot istnieje obszar zwany permanent generation, w którym znajduje się obszar metod, można ustawić jego rozmiar za pomocą -XX:MaxPermSize.

2 Zadania

2.1 Zadania na laboratorium

• Ściągnąć za pomocą Eclipse z pluginem egit ze strony github.com kod do zajęć importując projekt z adresuJTP2.

• Zapoznać się i uruchomić w ancie plik build.xml.

• Uruchomić program Hello World z wiersza poleceń w katalogu program.

• Zapoznać z się z slf4j i logback.

• Napisać program, który wyrzuca StackOverflowError.

• Napisać programy, które wyrzucają OutOfMemoryError: Java heap space oraz OutOfMemoryError: PermGen space.

2.2 Zadania dodatkowe

1. • Napisać metodę, która co jakiś czas zwalnia część zajętej pamięci i wywołu- je garbage collector za pomocą System.gc(). Sprawdzać pamięć za pomocą freeMemory() z Runtime.

• Monitorować spadek zużycia pamięci za pomocą jconsole i jvisualvm, opis jconsole.

• Przetestować działanie parametru Xmx.

2

(3)

2. • Utworzyć zrzut pamięci z zadania na 4.0 za pomocą jmap, a następnie prze- analizować zrzut za pomocą jhat.

3

Cytaty

Powiązane dokumenty

księgowości oraz numer faksu, a także NIP i REGON szkoły. Szkoła funkcjonuje w formie jednostki budżetowej, pokrywa swoje wydatki bezpośrednio z budżetu Miasta

Porównać efektywność oby dwóch wariantów (czas działania, rozmiar kodu, czas napisania programu).. Wnioski dołączyć

Wiązanie typu pi powstaje w wyniku nakładania się bocznego orbitali typu p, które leży poza płaszczyzną. Występuje ono wtedy, gdy cząsteczka zawiera wiązanie wielokrotne,

Troczka-Pawelec, Continuity of superquadrqtic set-valued functions, Scientific Issues Jan Długosz University in Cz¸estochowa, Mathematics XVII, 2012.

§ 11.. Za zdrowie i bezpieczeństwo dzieci odpowiada nauczyciel pełniący obowiązki zawodowe w danym czasie do momentu przekazania ich prawnym opiekunom lub osobom

Delegat Meczowy oraz Obserwator jest upoważniony jest do kontrolowania prawidłowej organizacji zawodów (w tym do kontroli list osób uprawnionych do przebywania na

c) wypełnienie zobowiązań zawartych w złożonej przez siebie deklaracji. Członek wspierający będący osobą prawną działa w Stowarzyszeniu za pośrednictwem

Wszystkie akcje serii F, których cena równa jest wartości nominalnej zostały pokryte wkładem niepieniężnym w postaci: wierzytelności stanowiącej wartość