Wyjątki OutOfMemoryError i StackOverflowError w Javie

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łoszenia StackOverflowError.

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.

Scroll to Top