/ / Czy możemy bezpośrednio wywołać Garbage Collector? [duplikat] - java, odśmiecanie

Czy możemy nazwać Garbage Collectora jawnie? [duplicate] - java, zbieranie śmieci

Moja aplikacja ma wiele iteracji. Do tej pory nie napotykałem żadnych problemów z pamięcią. Ale z poziomu kodu mogę podejrzewać, że jest kilka miejsc, które powodują wycieki pamięci i problem braku pamięci. Myślę o ręcznym wywołaniu modułu odśmiecania. Czy dobrą praktyką jest wywoływanie modułu odśmiecania ręcznie?

Odpowiedzi:

26 dla odpowiedzi nr 1

Możesz zadzwonić do Garbage collectora używając:

System.gc();

Ale to nie znaczy, że zostanie ono wykonane natychmiast. JVM decyduje, kiedy go wykonać. Ogólnie rzecz biorąc, czy JVM ma zamiar rzucić OutOfMemoryError, dzwonienie System.gc() nie da się tego uniknąć. Lepiej sprawdź, dlaczego wyciekają tak dużo pamięci i posprzątaj po drodze.

JavaDoc:

Wywołanie metody gc sugeruje, że JavaWydatki na maszynę wirtualną wysiłek w kierunku recyklingu nieużywanych przedmiotów w celu stworzenia pamięci obecnie zajmują dostępne do szybkiego ponownego użycia. Kiedy kontrola powróci po wywołaniu metody Java Virtual Machine dołożyła wszelkich starań aby odzyskać miejsce ze wszystkich odrzuconych obiektów


8 dla odpowiedzi № 2

Czy dobrą praktyką jest ręczne wywoływanie aplikacji Garbage Collector?

Nie, zdecydowanie nie jest to dobra praktyka.

Możesz użyć System.gc(). Zauważ, że nie ma gwarancji, że zadzwoni on do modułu wyrzucania elementów bezużytecznych - to tylko podpowiedź dla systemu, że dobrym pomysłem może być wyrzucanie elementów bezużytecznych.

Moduł wyrzucania elementów bezużytecznych w JVM firmy Oracle zawiera wiele wyrafinowanych elementów logicznych, które pozwalają określić, kiedy i co należy wyczyścić. Dostrajanie go wymaga wiedzy o szczegółach jego działania. System.gc() gdzieś w twoim programie raczej nie pomoże, a może nawet pogorszyć sprawę.

Widzieć Java SE 6 HotSpot Virtual Tuning Garbage Collection Tuning szczegółowe informacje na temat dostrajania funkcji wyrzucania elementów bezużytecznych za pomocą Java SE 6.


6 dla odpowiedzi nr 3

Możesz bezpośrednio wywołać Garbage Collector, ale JVM decyduje, czy przetworzyć połączenie, czy nie. Idealnie, nigdy nie powinieneś pisać kodu zależnego od wywołania śmietnika.

JVM wewnętrznie korzysta z pewnego algorytmu, aby zdecydować, kiedy wykonać to wywołanie. Kiedy wykonujesz połączenie za pomocą System.gc (), to tylko prośba do JVM a JVM może w dowolnym momencie zdecydować o jego zignorowaniu.


5 dla odpowiedzi № 4

Tak, możesz jawnie wywołać moduł czyszczenia pamięci za pomocą

System.gc();

Ale dzieje się tak, że nie można nakazać JVM natychmiastowego wyrzucania elementów bezużytecznych. JVM sam decyduje, kiedy należy wyrzucać elementy bezużyteczne. Dlatego nie jest dobrym pomysłem wywoływanie go ręcznie.

Ponadto w odniesieniu do OutOfMemoryException ręczne usuwanie śmieci nie pomożezapobiec wyjątkowi, ponieważ JVM zgłasza ten wyjątek po odzyskaniu całej dostępnej pamięci. Ma kilka bardzo wyrafinowanych algorytmów do określania, kiedy i jak wykonać odśmiecanie. Sugeruję więc, że jeśli dostajesz OutOfMemoryException następnie ponownie sprawdź program, aby zwiększyć jego wydajność lub zwiększyć przestrzeń sterty.


3 dla odpowiedzi № 5

Niezależnie od tego, czy można ręcznie uruchomić moduł wyrzucania elementów bezużytecznych (i różne poziomy zbierania), i jaki ma to wpływ na wydajność (co w rzeczywistości jest temat wart dyskusji), nie zapobiegnie OutOfMemoryErrors, ponieważkiedy w maszynie JVM zabraknie pamięci, i tak wykonuje najbardziej dokładną kolekcję. Tylko jeśli po tej kolekcji nie będzie wystarczającej ilości pamięci, wystąpi błąd. Nawet jeśli sam uruchomisz kolekcję wcześniej, wynik (ilość odzyskanej pamięci) jest taki sam.

Wycieków pamięci nie można naprawić, uruchamiając częściej czyszczenie pamięci.

Muszą zostać naprawione w twoim programie (stopodwoływanie się do rzeczy, których nie potrzebujesz już wcześniej) lub (w najgorszym przypadku, jeśli jest to „prawdziwy” wyciek) w JVM lub samej bibliotece wykonawczej (ale prawdziwe błędy zarządzania pamięcią nie powinny już istnieć po tylu latach pracy).


2 dla odpowiedzi № 6

Wywołanie System.gc () nie gwarantuje żadnej GC. Śmieci są gromadzone, jeśli istnieje rzeczywista potrzeba pamięci.
Tutaj możesz zobaczyć różne śmieciarki.
http://javarevisited.blogspot.in/2011/04/garbage-collection-in-java.html

Możesz dołączyć dowolny z tych GC do parametrów wiersza poleceń zgodnie ze swoimi potrzebami.