Java Pamięć: Heap Przestrzeń i Garbage Collector

Dowiedz się, jak Java zarządza pamięci w przestrzeni sterty i zbierania śmieci. Zrozumienie alokacji pamięci może pomóc uniknąć wycieku pamięci w programach Javy.

A+ A-

Niedawno napisałem aplikację Java, które po uruchomieniu, wymaga sporo pamięci i zacząłem uzyskać OutOfMemory błąd:

 Błąd: java.lang.OutOfMemoryError: przestrzeń sterty Java 

To się często zdarza, gdy musimy uruchamiać programy z pamięcią obżarstwo. Oto kilka sposobów na rozwiązanie tych problemów.

Czym jest przestrzeń sterty Java?

Przede wszystkim, pozwala zrozumieć, czym jest przestrzeń sterty. Dobrze, Java używa pamięci głównie w aranżacji sterty i stosu . Java przechowuje parametry, które są przekazywane z metodą wywołującego do wywoływanego sposobu , w postaci konstrukcji stosu (tj parametry są popychane i pojawiło się w stos według potrzeby). Z drugiej strony, stos jest pamięć swobodnego dostępu, gdzie Java tworzy i utrzymuje przedmioty. Java tworzy obiekt w obrębie tej przestrzeni sterty gdziekolwiek znajdzie wystarczająco dużo miejsca aby pomieścić obiekt. Tak więc, podczas tworzenia nowego obiektu (np nowe String () ;) obiekt zostanie utworzony w przestrzeni sterty i zajmuje pamięć, która może pasować do. Podczas zbierania śmieci, Java uwalnia przestrzeń sterty tych obiektów, które nie są już odwołuje. Ale jeśli liczba odniesienia (czyli "wymagane") obiekty stale wzrasta, a my ich nie poważanie -the JVM zabraknie przestrzeni sterty.

Ilość pamięci, że klasa będzie wymagać zależy od liczby i rodzaju jej członków danych.

  1. Sama klasa wymaga minimum 8 bajtów
  2. Każdy członek danych wymaga 4 bajtów (długa i podwójna wymaga 8 bajtów). Nawet zmienna logiczna jest użyć 4 bajty choć potrzebuje tylko jednego bitu, aby przechowywana.
  3. Ilość pamięci używanej rośnie w kawałki 8 bajtów
Optymalizacja programów Java

Pierwszym krokiem, aby uzyskać wokół tego problemu należy przejść do programu i zobaczyć, jak to może być zmodyfikowany tak, aby korzystać z mniejszą pamięć. Od dawna koszt pamięci była bardzo niska w porównaniu z tym, co było w 1960 roku. A programiści stały się dość ekstrawagancki pod względem diety pamięci do swoich programów. Jednak nadal, częściej niż nie, musimy pisać programy, które wymagają większej ilości pamięci niż jest dostępna. Oszczędność w kontekście wykorzystania pamięci jest zawsze dobra, ponieważ nie tylko zmniejsza prawdopodobieństwo awarii programu, ale także czasami zwiększa szybkość wykonania.

Należy ustawić obiekty, aby być zerowy, gdy nie są już potrzebne w kodzie. Jest to tym bardziej ważne, jeśli jest uruchomiony pętlę, w której tworzy obiekt (-y), ale potem nie odrzucić je, gdy nie są one wymagane.

Wykorzystaj metody śmieciarza Java

Drugim krokiem w kierunku optymalizacji wykorzystania pamięci może być jawnie wywołać metodę gromadzenia śmieci. Java automatycznie wywołuje tę metodę, jak i kiedy wymagane i zwalnia miejsce w pamięci, która zawiera obiekty, które nie są już odwołują. Ale można też wywołać tę metodę jawnie w kodzie (na przykład po "wielkim zadaniem" jest spełnione, a następny "wielkiego zadania" ma się rozpocząć). Aby połączyć się z śmieciarza, należy:

 Runtime.getRuntime () GC (.); 

Można monitorować stan pamięci przed i po metodą GC () jest wywoływana.

 System.out.println ( "nnCalling śmieci Collectornn");
System.out.println ( "Wolna pamięć PRZED:" + Runtime.getRuntime () freeMemory ().);
Runtime.getRuntime () GC (.);
System.out.println ( "Wolna pamięć PO". + Runtime.getRuntime () freeMemory ());
System.out.println ( "nnGarbage kolekcji finishednn"); 

Metoda freememory () zwraca ilość wolnej pamięci dostępnej mierzona w bajtach. W przypadku innych metod dostarczonych przez klasę Runtime patrz Java API

Daj więcej pamięci JVM

Wysiłki zmierzające do optymalizacji zużycia pamięci Niezależnie od tego, czasami JVM faktycznie potrzebuje więcej pamięci. W takich przypadkach możemy powiedzieć JVM poprzez linię poleceń, aby użyć określonej ilości pamięci:

 java -Xms2000m -Xmx3500m 

-Xms I -Xmx przełącza określić ilość przestrzeni wymiany (pamięci wirtualnej), że JVM można używać w komputerze.

-Xms Określa minimum (tj początkowa) ilość pamięci

-Xmx Określa maksymalną ilość pamięci, która JVM może wykorzystać.

Te wartości pamięci powinna być określona w megabajtach.

Tak, to było około Java zarządza pamięci w przestrzeni sterty i mechanizm zbierania śmieci. Są inteligentne wybory i każdy programista Java powinien mieć jasne zrozumienie, jak Java obsługuje pamięć. Tylko będziesz w stanie skutecznie działać na pamięci intensywnych programów.