Java jest językiem programowania, który zarządza pamięcią automatycznie za pomocą Garbage Collector. Jednakże, w pewnych sytuacjach, niepoprawne zarządzanie zasobami lub błędy w projektowaniu mogą prowadzić do wyjątków, takich jak OutOfMemoryError
i StackOverflowError
. Te błędy wskazują, odpowiednio, na brak dostępnej pamięci sterty (heap) i przekroczenie rozmiaru stosu (stack). W tej lekcji pokażemy, jak mogą zostać wygenerowane te błędy i jakie praktyki mogą do tego prowadzić.
Generowanie OutOfMemoryError
OutOfMemoryError
jest błędem, który Java zgłasza, gdy aplikacja próbuje użyć więcej pamięci, niż jest dostępna dla sterty JVM.
Przykład kodu:
import java.util.ArrayList;
import java.util.List;
public class MemoryLeak {
// Metoda generująca OutOfMemoryError
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
while (true) {
// Tworzenie nowych obiektów w nieskończonej pętli
list.add(new Object());
}
}
}
Generowanie StackOverflowError
StackOverflowError
jest wynikiem nadmiernego zagłębiania się w wywołania funkcji (rekursji), co prowadzi do wyczerpania dostępnego miejsca na stosie.
Przykład kodu:
public class RecursiveCall {
// Metoda wywołująca samą siebie rekurencyjnie
public static void recursiveMethod(int number) {
// Wywołanie rekurencyjne bez warunku zakończenia
System.out.println(number);
recursiveMethod(number+1);
}
public static void main(String[] args) {
recursiveMethod(1);
}
}
Omówienie
- OutOfMemoryError: W pierwszym przykładzie tworzymy nieskończoną pętlę, która w każdej iteracji dodaje nowy obiekt do listy, co z czasem wyczerpuje dostępną pamięć sterty i prowadzi do zgłoszenia
OutOfMemoryError
. Jest to przykład wycieku pamięci, gdzie obiekty są nieustannie tworzone, ale nigdy nie są usuwane przez Garbage Collector, ponieważ są nadal osiągalne przez listę. - StackOverflowError: W drugim przykładzie używamy rekursji bez warunku bazowego (warunku zakończenia), co oznacza, że metoda
recursiveMethod
będzie wywoływać samą siebie nieskończenie wiele razy. Każde wywołanie rekurencyjne dodaje ramkę na stosie, co ostatecznie prowadzi do wyczerpania dostępnego miejsca i zgłoszeniaStackOverflowError
.
Podsumowanie
OutOfMemoryError
i StackOverflowError
to dwa krytyczne błędy w Javie, które wskazują na problemy z zarządzaniem pamięcią. Aby uniknąć OutOfMemoryError
, ważne jest monitorowanie i optymalizacja zużycia pamięci aplikacji, a także odpowiednie zarządzanie zasobami. StackOverflowError
można unikać przez stosowanie rekursji z warunkiem bazowym lub ograniczając głębokość rekursji. Zrozumienie i unikanie tych błędów jest kluczowe dla tworzenia wydajnych i stabilnych aplikacji w Javie.
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.