Czym jest garbage collector w Javie?

Jestem nowy w Javie i zdezorientowany o garbage collector w Javie. Co tak naprawdę robi i kiedy wchodzi w życie. Proszę opisać niektóre właściwości garbage collector w Javie.

Author: NullUserException, 2010-09-26

17 answers

The garbage collector to program, który działa na wirtualnej maszynie Javy , która pozbywa się obiektów, które nie są już używane przez aplikację Javy. Jest to forma automatycznego zarządzania pamięcią .

Gdy uruchomiona jest typowa aplikacja Java, tworzy ona nowe obiekty, takie jak StringS I Files, ale po pewnym czasie obiekty te nie są już używane. Na przykład spójrz na następujący kod:

for (File f : files) {
    String s = f.getName();
}

W powyższym kod, String s jest tworzony na każdej iteracji pętli for. Oznacza to, że w każdej iteracji przydziela się trochę pamięci, aby utworzyć obiekt String.

Wracając do kodu, widzimy, że po wykonaniu pojedynczej iteracji, w następnej iteracji, obiekt String, który został utworzony w poprzedniej iteracji, nie jest już używany - obiekt ten jest teraz uważany za"śmieci".

W końcu zaczniemy dostawać dużo śmieci, a pamięć będzie używane dla obiektów, które nie są już używane. Jeśli tak się stanie, w końcu na wirtualnej maszynie Javy zabraknie miejsca na tworzenie nowych obiektów.

Tam wkracza Śmieciarz.

Garbage collector będzie szukał obiektów, które nie są już używane, i pozbywa się ich, uwalniając pamięć, aby inne nowe obiekty mogły z niej korzystać.

W Javie zarządzanie pamięcią zajmuje się garbage collector, ale w innych językach takich jak C, trzeba wykonywać zarządzanie pamięcią na własną rękę za pomocą funkcji takich jak malloc Oraz free. Zarządzanie pamięciąjest jedną z tych rzeczy, które łatwo popełnić błędy, które mogą prowadzić do tak zwanych wycieków pamięci - miejsc, w których pamięć nie jest odzyskiwana, gdy nie są już używane.

Automatyczne systemy zarządzania pamięcią, takie jak garbage collection, sprawiają, że programista nie musi się martwić o problemy z zarządzaniem pamięcią, dzięki temu może skupić się bardziej na rozwijaniu aplikacji, których potrzebuje.

 104
Author: coobird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-26 15:49:00

Uwalnia pamięć przydzieloną obiektom, które nie są już używane przez program - stąd nazwa "garbage". Na przykład:

public static Object otherMethod(Object obj) {
    return new Object();
}

public static void main(String[] args) {
    Object myObj = new Object();
    myObj = otherMethod(myObj);
    // ... more code ...  
}

Wiem, że to jest bardzo wymyślone, ale tutaj po wywołaniu otherMethod() oryginał Object stworzony staje się nieosiągalny - a to "śmieci", które zbierają śmieci.

W Javie GC działa automatycznie, ale można go również wywołać jawnie za pomocą System.gc() i spróbujcie wymusić dużą zbiórkę śmieci. Jako Pascal Thivent zwraca uwagę, że naprawdę nie powinieneś tego robić i może to wyrządzić więcej szkody niż pożytku (zobacz to pytanie).

Aby dowiedzieć się więcej, zobacz wpis na Wikipedii o Garbage collection i Tuning Garbage Collection (od Oracle)

 18
Author: NullUserException,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:32

Obiekt staje się kwalifikowany do Garbage collection lub GC, jeśli nie jest osiągalny z żadnych aktywnych wątków lub przez jakiekolwiek odniesienia statyczne.

Innymi słowy, można powiedzieć, że obiekt kwalifikuje się do zbierania śmieci, jeśli wszystkie jego odwołania są null. Zależności cykliczne nie są liczone jako odniesienia, więc jeśli obiekt A ma odniesienie do obiektu B, A obiekt B ma odniesienie do obiektu A i nie ma żadnego innego odniesienia NA ŻYWO, oba obiekty a i B będą kwalifikowalne do Wywóz śmieci.


Stos odpadów -

Obiekty Javy są tworzone w Heap i Heap Są podzielone na trzy części lub generacje ze względu na zbieranie śmieci w Javie, nazywa się je jako Młode (nowe) pokolenie, dzierżawione (stare) pokolenie i obszar Perm ze sterty.

Java Heap Space Nowa generacja jest dalej podzielona na trzy części znane jako Eden space, Survivor 1 i Survivor 2 miejsce. Kiedy obiekt po raz pierwszy utworzony w stercie, zostaje utworzony w nowej generacji wewnątrz przestrzeni Eden, a po kolejnym drobnym zbiorze śmieci, jeśli obiekt przetrwa, zostaje przeniesiony do survivor 1, a następnie survivor 2, zanim major garbage collection przeniósł ten obiekt do starej lub dzierżawionej generacji .

Przestrzeń Perm W Java Heap jest miejscem, w którym JVM przechowuje metadane o klasach i metodach, pulę łańcuchów i szczegóły poziomu klas.

Sterta do zbierania śmieci

Zobacz tutaj więcej: wywóz śmieci


Nie możesz zmusić JVM do uruchomienia Garbage Collection, ale możesz złożyć żądanie za pomocą metody System.gc() lub Runtime.gc().

W Javie.lang.System

public static void gc() {
    Runtime.getRuntime().gc();  
}

W Javie.lang.Runtime

public native void gc();  // note native  method

Mark and Sweep Algorithm -

Jest to jeden z najpopularniejszych algorytmów używanych przez Garbage collection. Każdy algorytm garbage collection musi wykonać 2 podstawowe operacje. Po pierwsze, powinno być w stanie aby wykryć wszystkie nieosiągalne obiekty, a po drugie, musi odzyskać przestrzeń stosu używaną przez obiekty śmieci i ponownie udostępnić ją programowi.

Powyższe operacje wykonywane są przez algorytm Mark i Sweep w dwóch fazach:

  1. Faza znakowa
  2. Faza zamiatania

Przeczytaj tutaj, aby uzyskać więcej szczegółów - Mark and Sweep Algorithm

 9
Author: roottraveller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-09 13:41:13

Garbage collector zakłada, że obiekty, które nie są już potrzebne przez program, są "śmieciami" i mogą zostać wyrzucone.

 6
Author: Nik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-26 15:26:36

Garbage Collector jest częścią JRE, która zapewnia, że obiekt, do którego nie odwołujemy się, zostanie uwolniony z pamięci.
Zwykle działa, gdy aplikacja skończy się pamięć. AFAIK posiada wykres, który przedstawia powiązania między obiektami i izolowane obiekty mogą być uwolnione.
Aby zapisać wydajność bieżące obiekty pogrupowane w generacje, za każdym razem GC skanuje obiekt i stwierdza, że nadal odnosi się do jego liczby generacji zwiększonej o 1 (do pewnej maksymalnej wartości, 3 lub 4 myślę, że) , a nowa generacja jest skanowana jako pierwsza (im najkrótszy obiekt w pamięci, tym bardziej prawdopodobnie nie jest już potrzebny) , więc nie wszystkie obiekty są skanowane za każdym razem, gdy GC działa.
przeczytaj to , aby uzyskać więcej informacji.

 6
Author: Itay Karo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-26 15:31:59

Garbage collector pozwala komputerowi symulować komputer z nieskończoną pamięcią.Reszta to tylko mechanizm.

Robi to, wykrywając, kiedy kawałki pamięci nie są już dostępne z kodu, i zwracając te kawałki do wolnego sklepu.

EDIT: tak, link jest do C#, ale C# i Java są pod tym względem identyczne.

 3
Author: Billy ONeal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-26 15:34:50

Wiele osób uważa, że garbage collection zbiera i odrzuca martwe przedmioty.
W rzeczywistości Java garbage collection robi odwrotnie! Żywe obiekty są śledzone, a Wszystko inne oznaczone jako śmieci.

Gdy obiekt nie jest już używany, garbage collector odzyskuje podstawową pamięć i wykorzystuje ją ponownie do przyszłej alokacji obiektów. Oznacza to, że nie ma wyraźnego usunięcia i Żadna pamięć nie jest zwracana do systemu operacyjnego. Aby określić, które obiekty nie są już używane, JVM z przerwami uruchamia to, co bardzo trafnie nazywa się algorytmem mark-and-sweep.

Sprawdź to, aby uzyskać więcej informacji: http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx

 3
Author: VedX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-05 09:47:15

Garbage Collection w Javie (i innych językach/platformach) jest sposobem na ponowne wykorzystanie pamięci z obiektów java, które nie są już potrzebne. W uproszczeniu, gdy JRE początkowo się uruchamia, prosi System Operacyjny (O/S) o pewną ilość pamięci. Ponieważ JRE uruchamia Twoje aplikacje, używa tej pamięci. Kiedy aplikacja jest wykonywana przy użyciu tej pamięci, pojawia się "Garbage Collector" JRE i odzyskuje tę pamięć do użytku przez różne części istniejących aplikacji. "Garbage Collector" JRE jest zadaniem w tle, które jest zawsze uruchomione i próbuje wybrać czasy, gdy system jest bezczynny, aby przejść do jego śmieci.

Analogią z prawdziwego świata byłby Śmieciarz, który przychodzi do Twojego domu i odbiera Twoje śmieci nadające się do recyklingu... w końcu jest ponownie używany w inny sposób przez Ciebie i / lub innych ludzi.

 0
Author: Al Dass,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-26 15:45:31

Garbage collector może być postrzegany jako menedżer liczenia referencji. jeśli obiekt zostanie utworzony, a jego odniesienie zostanie zapisane w zmiennej, jego liczba odniesień zostanie zwiększona o jeden. w trakcie wykonywania, jeśli zmienna jest przypisana z NULL. liczba referencji dla tego obiektu jest zmniejszana. bieżąca liczba referencji dla obiektu wynosi 0. Teraz po wykonaniu Garbage collector sprawdza obiekty z liczbą referencji 0. i uwalnia środki przeznaczone na to.

wywołanie Garbage collector jest kontrolowane przez zasady zbierania śmieci.

Tutaj możesz pobrać kilka danych. http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

 0
Author: bala sreekanth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-26 15:51:28

Garbage collector jest składnikiem jvm.

Służy do zbierania śmieci, gdy cpu jest wolny.

Tutaj garbage oznacza nieużywane obiekty uruchamiane w tle głównego programu

Aby monitorować stan głównego programu.

 0
Author: Pulipati Prasadarao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-20 14:05:58

Automatyczne usuwanie śmieci to proces przeglądania pamięci sterty, identyfikowania, które obiekty są używane, a które nie, oraz usuwania nieużywanych obiektów. Obiekt używany lub obiekt odniesienia oznacza, że pewna część programu nadal utrzymuje wskaźnik do tego obiektu. Nieużywany lub nieuregulowany obiekt nie jest już odwoływany przez żadną część programu. Tak więc pamięć użyta przez nieuregulowany obiekt może zostać odzyskana.

W języku programowania takim jak C, przydzielanie i dealokacja pamięci jest procesem ręcznym. W Javie proces dealokacji pamięci jest obsługiwany automatycznie przez garbage collector. Sprawdź link, aby lepiej zrozumieć. http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

 0
Author: Shashank Shankaranand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-22 00:15:37

Garbage collection odnosi się do procesu automatycznego zwalniania pamięci na stercie poprzez usuwanie obiektów, które nie są już dostępne w programie. Sterta jest pamięcią, która jest określana jako wolny sklep, reprezentuje dużą pulę nieużywanej pamięci przydzielonej do aplikacji Java.

 0
Author: Aamir Meman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-16 09:48:08

Podstawowe zasady zbierania śmieci to znajdowanie obiektów danych w programie, do którego nie można uzyskać dostępu w przyszłości, oraz odzyskiwanie zasobów używanych przez te obiekty. https://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29

Zalety

1) zapisuje przed błędami, które występują, gdy kawałek pamięci jest zwolniony, gdy są jeszcze wskaźniki do niego, a jeden z tych wskaźników jest dereferenced. https://en.wikipedia.org/wiki/Dangling_pointer

2) Podwójne wolne błędy, które występują, gdy program próbuje zwolnić obszar pamięci, który został już uwolniony, a być może został już ponownie przydzielony.

3) zapobiega pewnym rodzajom wycieków pamięci, w których program nie zwalnia pamięci zajmowanej przez obiekty, które stały się nieosiągalne, co może prowadzić do wyczerpania pamięci.

Wady

1) zużywanie dodatkowych zasobów, wpływ na wydajność, możliwe przerwy w realizacji programu i niezgodność z ręcznym zarządzaniem zasobami. Garbage collection zużywa zasoby obliczeniowe decydując, która pamięć ma zostać zwolniona, nawet jeśli programista mógł już znać te informacje.

2) moment, w którym śmieci są faktycznie zbierane, może być nieprzewidywalny, powodując przerwy (pauzy do przesunięcia/wolnej pamięci) rozproszone w całej sesji. Nieprzewidywalne stragany mogą być niedopuszczalne w środowiskach w czasie rzeczywistym, w przetwarzaniu transakcji lub w programach interaktywnych.


Oracle tutorial http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

Garbage collection to proces identyfikujący, które obiekty są używane, a które nie, oraz usuwający nieużywane obiekty.

W językach programowania takich jak C, C++ przydzielanie i zwalnianie pamięci jest procesem ręcznym.

int * array = new int[size];
processArray(array); //do some work.
delete array; //Free memory

Pierwszy krok w procesie nazywa się znakowanie. W tym miejscu moduł garbage collector identyfikuje, które fragmenty pamięci są używane, a które nie.

Krok 2a. zwykłe usunięcie usuwa obiekty nieuregulowane, pozostawiając obiekty odniesienia i Wskaźniki na wolnej przestrzeni.

Aby poprawić wydajność, chcemy usunąć obiekty nieuregulowane, a także skompaktować pozostałe obiekty odwołujące się. Chcemy trzymać obiekty odniesienia razem, więc będzie szybciej przydzielać nową pamięć.

Jak wspomniano wcześniej, konieczność znakowania i zagęszczania wszystkich obiektów w JVM jest nieefektywna. W miarę przydzielania coraz większej liczby obiektów lista obiektów rośnie i rośnie, co prowadzi do dłuższego i dłuższego czasu zbierania śmieci.

Kontynuuj czytanie tego samouczka, a dowiesz się, jak GC podejmuje to wyzwanie.

W skrócie, istnieją trzy regiony sterty, YoungGeneration dla obiektów o krótkim życiu, OldGeneration dla obiektów o długim okresie i PermanentGeneration dla obiektów o długim okresie życia które żyją w czasie życia aplikacji, na przykład klasy, biblioteki.

 0
Author: Yan Khonski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 12:28:02

Ponieważ obiekty są przydzielane dynamicznie przez operator new, możesz zapytać, w jaki sposób te obiekty są niszczone i jak zwalnia się zajętą pamięć. W innych językach, takich jak C++, Musisz zwolnić ręcznie przydzielane obiekty dynamicznie przez operatora delete. Java ma inne podejście; automatycznie obsługuje dealokację. Technika ta jest znana jako Garbage Collection .

Działa to tak: gdy nie ma odniesień do obiektu, zakłada się, że ten obiekt nie dłużej potrzebne i można odzyskać pamięć zajmowaną przez obiekt. Nie jest konieczne jawne niszczenie obiektów jak w C ++. Usuwanie śmieci występuje sporadycznie podczas wykonywania programu; nie dzieje się tak po prostu dlatego, że istnieje jeden lub więcej obiektów, które nie są już używane. Ponadto kilka implementacji Java runtime ma różne podejścia do zbierania śmieci, ale większość programistów nie musi się martwić o pisanie programów

 0
Author: Amarildo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-02 20:30:08

Obiekt staje się kwalifikowany do Garbage collection lub GC, jeśli nie jest osiągalny z żadnych aktywnych wątków lub przez jakiekolwiek odniesienia statyczne.

Innymi słowy, można powiedzieć, że obiekt kwalifikuje się do zbierania śmieci, jeśli wszystkie jego odwołania są null. Zależności cykliczne nie są liczone jako odniesienia, więc jeśli obiekt A ma odniesienie do obiektu B, A obiekt B ma odniesienie do obiektu A i nie ma żadnego innego odniesienia NA ŻYWO, oba obiekty a i B będą kwalifikowalne do Wywóz śmieci.


Sterty do zbierania śmieci -

Obiekty Javy są tworzone w Heap i Heap Są podzielone na trzy części lub generacje ze względu na zbieranie śmieci w Javie, nazywa się je jako Młode (nowe) pokolenie, dzierżawione (stare) pokolenie i obszar Perm ze sterty.

Java Heap Space Nowa generacja jest dalej podzielona na trzy części znane jako Eden space, Survivor 1 i Survivor 2 space. Kiedy obiekt utworzony najpierw w stercie its zostaje utworzony w nowej generacji wewnątrz przestrzeni Eden, a po kolejnym drobnym zbiorze śmieci jeśli obiekt przetrwa jego zostaje przeniesiony do survivor 1, a następnie survivor 2, zanim major garbage collection przeniósł ten obiekt do starej lub dzierżawionej generacji .

Przestrzeń Perm Java Heap jest miejscem, w którym JVM przechowuje metadane o klasach i metodach, pulę łańcuchów i szczegóły poziomu klas.

Sterta do zbierania śmieci

 0
Author: roottraveller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-10 10:23:20

Mówiąc najprościej, nawet nie programista może zrozumieć, że gdy program przetwarza dane, tworzy dane pośrednie i przestrzeń dyskową (zmienne, tablice, pewne metadane obiektów itp.) za te dane.

Gdy te obiekty są dostępne między funkcjami lub w określonym rozmiarze, są one przydzielane z centralnej sterty. Wtedy, gdy nie są już potrzebne, trzeba je oczyścić.

W Internecie jest kilka bardzo dobrych artykułów o tym, jak to działa, więc Omówię tylko podstawową definicję.

GC jest w zasadzie funkcją, która wykonuje to czyszczenie. Aby to zrobić, wyczyść wpisy tabeli, do których nie odwołują się żadne aktywne obiekty, skutecznie usuwając obiekty, a następnie kopiując i zagęszczając pamięć. To trochę bardziej skomplikowane, ale masz pomysł.

Duży problem polega na tym, że niektóre części tego procesu często wymagają tymczasowego zatrzymania całej maszyny wirtualnej Java, tak samo jak cała ta Proces jest bardzo obciążony przepustowością procesora i pamięci. Różne opcje GCS i opcje strojenia dla każdego z nich są zaprojektowane tak, aby zrównoważyć te różne problemy z całym procesem GC.

 0
Author: Robert Wm Ruedisueli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-04 01:56:03

Automatyczne usuwanie śmieci jest procesem, w którym JVM pozbywa się lub przechowuje pewne punkty danych w pamięci, aby ostatecznie zwolnić miejsce dla uruchomionego programu. Pamięć jest najpierw wysyłana do pamięci sterty, czyli tam gdzie garbage collector (GC) wykonuje swoją pracę, a następnie zostaje przerwana lub zachowana. Java zakłada, że programiście nie zawsze można ufać, więc kończy rzeczy, które uważa za niepotrzebne.

 -2
Author: Lopes_CP_2579,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-30 17:40:35