Po awarii OutOfMemoryError JVM się kończy? Jeśli nie, to dlaczego? Czy spróbuje odzyskać zasoby? Czy jest jakiś inny powód?Czy JVM kończy działanie po OutOfMemoryError
Odpowiedz
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.
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
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ć
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.
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.
- 1. Foreman natychmiast kończy działanie
- 2. PhantomJS kończy działanie po błędzie składni podczas wykonywania testów jednostkowych.
- 3. Jak sprawdzić, kiedy działanie kończy się po przejściu układu?
- 4. Xcode 5 kończy działanie nieoczekiwanie zaraz po próbie pobrania Tożsamości
- 5. OutOfMemoryError - jak zabić wirtualną maszynę wirtualną po utworzeniu hprof
- 6. Jak ponownie uruchomić maszynę JVM w OutOfMemoryError _ po zrobieniu zrzutu sterty?
- 7. Debuger Flash Builder 4.5 kończy działanie | Safari
- 8. Czy fgets() zawsze kończy działanie bufora znaków z \ 0?
- 9. W jaki sposób Eclipse kończy działanie uruchomionego programu?
- 10. Spring Batch po awarii JVM
- 11. Funkcja NumberFormat.parse() kończy działanie dla niektórych łańcuchów walutowych
- 12. java outOfMemoryError z stringbuilder
- 13. OutOfMemoryError tworzenie bitmapy
- 14. jak złapać OutOfMemoryError w JVM i uruchomić skrypt, jeśli zostanie przechwycony?
- 15. Picasso produkuje OutOfMemoryError
- 16. Kontynuuj działanie skryptu php po zwróceniu strony
- 17. Maven Cobertura OutOfMemoryError
- 18. OutOfMemoryError w AbstractStringBuilder enlargeBuffer
- 19. Zrozumienie maszyny JVM Lepiej
- 20. Czy maszyna JVM zamienia stertę?
- 21. Wznów działanie po kliknięciu na powiadomienie
- 22. OutOfMemoryError: brak pamięci w IntelliJ?
- 23. Czy fragment to działanie? (Android)
- 24. Czy cursor.observe spowalnia działanie serwera?
- 25. Czy wywołanie zdarzenia przerywa działanie?
- 26. Czy wykonywanie javascript kończy się po napotkaniu niepoprawnej linii?
- 27. Jak zabić działanie po naciśnięciu przycisku Wstecz?
- 28. Jak rozwiązać OutOfMemoryError użyciu LayerDrawable
- 29. Jak interpretować logi G1 GC prowadzące do OutOfMemoryError?
- 30. OCaml dla JVM. Czy jest jakiś?
Nie. Przerywa tylko wątek. Nie cała JVM. – Torben
@Torben wystarczy, zaktualizuję odpowiedź. – Thomas