2012-04-26 12 views

Odpowiedz

12

Błąd OutOfMemopryError NIE ROZWIĄZUJE JVM.

Jeśli jest nieprzechwycony, kończy się THREAD, od którego wystąpił błąd. Inne wątki działają bez zarzutu, chyba że powodują one również OutOfMemoryErrors.

Dopiero po zakończeniu wszystkich wątków lub gdy wszystkie pozostałe wątki są wątkami demona, maszyna JVM zostaje zakończona.

Nie powoduje zamknięcia JVM, ponieważ nie musi. Kończenie JVM to bardzo ekstremalna operacja i nie jest wykonywana lekko.

Nie będzie próbował odzyskać żadnych zasobów, ponieważ nie ma niczego do odzyskania. Powodem, dla którego rzucono OOME, jest to, że: JVM nie może uzyskać zasobu, ponieważ wszystkie zasoby są pobierane. Zrobił już wszystko, co mógł.

Należy pamiętać, że OOME niekoniecznie jest wrzucane do wątku, który pochłania najwięcej pamięci. Wątek może pochłonąć całą pamięć i przetwarzanie zysku do innego wątku, który próbuje przydzielić "tylko jeden bajt". To oczywiście nie działa, a wątek, który próbował przydzielić jeden bajt, zostaje przerwany przez OOME. Dlatego powracanie do OOM jest prawie niemożliwe.

1

To zależy od tego, czy poradzisz sobie z tym błędem, czy nie. Jeśli tego nie zrobisz, aplikacja i bieżący wątek zostaną usunięte. Jeśli ten wątek jest ostatnim uruchomionym wątkiem (w większości przypadków jest to główny wątek bieżącej aplikacji), JVM również zostanie zakończona (mimo że nadal może wykonać pewne logowanie, utworzyć zrzut pamięci itp. Przed wyjściem).

Jeśli poradzisz sobie z błędem, po prostu spróbuj wykonać trochę czyszczenia, zanim zatrzymasz maszynę JVM. W większości przypadków nie jest dobrym pomysłem, aby spróbować odzyskać od OutOfMemoryError. Aby uzyskać więcej informacji, zobacz tutaj: Can the JVM recover from an OutOfMemoryError without a restart

+0

Nie. Przerywa tylko wątek. Nie cała JVM. – Torben

+0

@Torben wystarczy, zaktualizuję odpowiedź. – Thomas

0

Nie kończy się sama, po prostu powoduje błąd, mówiąc, że nie może utworzyć więcej obiektów, pamięć nie jest dostępna, ale możesz kontynuować kod przez obsługę błędu, ale będziesz musiał przetrwać tylko z aktualnie tworzonymi obiektami, lub możesz uwolnić lub unieważnić te, których już nie potrzebujesz.

PS: ale nie jest to zalecany sposób obsłużyć takich błędów i postępować

4

JVM kończy IFF (jak w przypadku każdego innego wyjątku lub błędu) nie jest złowionych w dowolnym miejscu i nie ma żadnych innych wątków, które są demon nici.

Nie kończy się natychmiast, ponieważ OutOfMemoryError może zostać przechwycony, a aplikacja może próbować wykonać niektóre operacje związane z błędami, poczynając od zarejestrowania błędu aż do odrzucenia tego obliczenia i kontynuacji w normalny sposób.

Ten ostatni jest uważany za ryzykowny, gdy wystąpi błąd, ale często jest to możliwe bez żadnych problemów, ponieważ wiele obiektów może wykraczać poza zakres, w którym wyrzucane jest OutOfMemoryError, gdzie jest przechwytywane, a następnie może zostać zwolnione przez zbieranie śmieci w celu nadania programowi nowej pamięci do pracy. Jeśli wystąpił błąd OutOfMemoryError, ponieważ jedno szczególne obliczenie wymagało więcej pamięci, niż jest dostępne, a aplikacja robi coś innego później, jest to w porządku.

0

Zasadniczo JVM kończy się, gdy ostatni wątek nie będący demonem zostanie zamknięty. Rzucanie OutOfMemoryError lub jakikolwiek inny rodzaj błędu lub wyjątku może spowodować, że ostatni wątek nie będący demonem istnieje, jeśli nie zostanie przechwycony.

Jednakże, jeśli błąd został wychwycony i nie został ponownie zgłoszony lub istnieje inny wątek inny niż demon, maszyna JVM nie kończy pracy. tj. nie ma nic szczególnego w żadnym konkretnym błędzie powodującym zamknięcie programu.

Istnieją dwie kwalifikacje

  • System.exit() spowoduje, że JVM do rozpoczęcia zamykania i nie można go złapać. Posiadanie wielu wątków nie ma znaczenia.
  • Błąd ThreadDeath jest wyjątkowy, ponieważ nie jest drukowany domyślnie. W przeciwnym razie zachowuje się jak każdy inny błąd.
Powiązane problemy