2013-03-27 15 views
7

Jak dokładnie JVM określa, czy powinien to być Garbage Collector? Czy istnieje sposób ograniczenia JVM, aby nie wywoływać GC?Ograniczanie JVM, aby nie wywoływać GC

+8

Nie bezpośrednio, nie. Jaki jest faktyczny problem, który próbujesz rozwiązać? – NPE

+1

Może mógłbyś kupić maszynę z nieskończoną pamięcią, ale są one trudne do znalezienia :-) i nieskończenie kosztowne :-) –

+1

@VishalK link nie działa –

Odpowiedz

4

Nie można powiedzieć JVM, aby nie wywoływała GC, ale można nakazać JVM, aby ignorowała połączenia z numerem System.gc() przez -XX:+DisableExplicitGC.

3

Zazwyczaj JVM decyduje się uruchomić cykl zbierania śmieci, gdy jeden z obszarów sterty bliski jest wypełnienia. Zauważ, że ostatecznie decyzja należy do JVM.

Aby instruować JVM, aby nie wykonywała GC przez jakiś czas, nie ma niezawodnego i przenośnego sposobu, aby to zrobić (oprócz unikania alokacji sterty w ogóle).

Jeśli próbujesz zminimalizować przerwy w GC, książka Java Performance ma dobry materiał.

5

Jak dokładnie JVM ustala, czy powinien to być Garbage Collector?

To zależy.

  • Jeśli używasz kolektor przeładunkową, a następnie uruchamia JVM GC, gdy nie może przydzielić nowy obiekt w przestrzeni (lub w jednym z pomieszczeń), gdzie musi zostać przydzielone.

  • Jeśli korzystasz z kolektora o niskiej pauzie, wówczas JVM wyzwala GC, gdy stosunek wolnej przestrzeni spadnie poniżej konfigurowalnego poziomu.

Czy istnieje jakiś sposób, aby ograniczyć JVM nie powołać GC?

Nie. Jeśli JVM zdecyduje, że musi uruchomić GC, uruchomi go. Jedyne, co możesz zrobić, to powiedzieć JVM, aby ignorowała wywołania kodu aplikacji do System.gc().

1

To naprawdę zależy od implementacji maszyny wirtualnej.

W innej strony:

Jawne wnioski o wywóz śmieci są wodzirej wskazujące prawdopodobne problemy z wydajnością.

Code Correctness: Call to System.gc()

apeluje do System.gc(), Runtime.getRuntime().gc() i System.runFinalization() nie są zalecane. Kod powinien zachowywać się tak samo, niezależnie od tego, czy usuwanie śmieci jest wyłączone przy użyciu opcji -Xdisableexplicitgc, czy też nie. Co więcej, "nowoczesne" jvms wykonują bardzo dobrą robotę przy zbieraniu śmieci. Jeśli problemy z używaniem pamięci niezwiązane z wyciekami pamięci pojawiają się w aplikacji, powinny być rozpatrywane w opcjach JVM, a nie w samym kodzie.

PMD Rule DoNotCallGarbageCollectionExplicitly

0

Generalnie GC działa tylko wtedy, kiedy musi. Wyjątkiem, współbieżne przeciąganie znaczników rozpocznie się przedwcześnie, aby uniknąć konieczności zatrzymania aplikacji.

IMHO, Najprostszym/najlepszym rozwiązaniem jest nie tworzyć tak dużo śmieci. Możesz użyć profilera pamięci, aby zmniejszyć ilość śmieci, które produkujesz. Pozwoli to zmniejszyć rozmiar Twoich kolekcji i częstotliwość ich występowania. W skrajnych przypadkach można uniknąć zbierania w ciągu dnia lub nawet przez cały tydzień.

Zaletą zmniejszania ilości śmieci jest zmniejszenie ilości pamięci podręcznej procesora z odpadami. Twoja pamięć podręczna L3 to tylko kilka MB i utworzysz kilka MB śmieci, które skutecznie wypchnęłyby przydatne informacje, spowalniając działanie aplikacji.