Sobes.tech
Junior

Co je Out of Memory (OOM)?

sobes.tech AI

Odpověď od AI

Out of Memory (OOM) — je situace, kdy aplikace nebo operační systém vyčerpá dostupnou operační paměť pro alokaci nových objektů nebo provádění požadovaných operací.

V kontextu operačních systémů nastává OOM, když systém nemůže alokovat paměť pro nový proces nebo vlákno. Aby se předešlo úplnému selhání systému, v Linuxu existuje OOM Killer — mechanismus, který vynuceně ukončuje procesy, které spotřebovávají hodně paměti, aby uvolnil zdroje.

V kontextu aplikací nastává OOM, když virtuální stroj Java (JVM) nebo prostředí jiného jazyka nemůže alokovat paměť v haldě (heap) pro vytvoření nového objektu.

Příčiny OOM mohou být různé:

  • Úniky paměti (Memory Leaks): Objekt, které již nejsou používány, zůstávají v paměti, protože na ně jsou zachovány odkazy, bránící garbage collectoru je odstranit.
  • Nadměrná spotřeba paměti: Aplikace žádá nebo udržuje příliš velké množství paměti pro zpracování dat (například načítání velkého souboru do paměti).
  • Nedostatečné přidělení paměti: Nastavení JVM (například -Xmx) nebo konfigurace prostředí neposkytují dostatek paměti pro chod aplikace.
  • Chybné nastavení poolů vláken nebo spojení: Nadměrný počet aktivních vláken nebo spojení může spotřebovávat značné množství zásobníkové paměti (pro vlákna) nebo jiných oblastí paměti.

Příznaky OOM na úrovni aplikace jsou často:

  • Zpomalení chodu aplikace.
  • Výjimka OutOfMemoryError v logu.
  • Pokles výkonu garbage collectoru.

Pro diagnostiku OOM se používají následující přístupy:

  • Analýza logů: Vyhledávání výjimek OutOfMemoryError a zpráv OOM Killer.
  • Sběr haldových dumpů: Vytvoření snímku obsahu haldy v okamžiku vzniku chyby pro následnou analýzu pomocí nástrojů (například Eclipse Memory Analyzer Tool (MAT), VisualVM).
  • Monitoring: Použití systémových monitorovacích nástrojů (Prometheus, Grafana, New Relic) ke sledování využití paměti JVM a operačního systému.
  • Profilování: Použití profilovačů (JProfiler, YourKit) k odhalení vzorů využití paměti a zdrojů úniků.
// Příklad Java kódu, který může vést k OOM (s únikem paměti)
import java.util.ArrayList;
import java.util.List;

public class OOMExample {
    private List<Object> largeList = new ArrayList<>();

    public void addObjects() {
        while (true) {
            largeList.add(new Object()); // Neustálé přidávání objektů bez jejich odstranění
        }
    }

    public static void main(String[] args) {
        OOMExample example = new OOMExample();
        example.addObjects();
    }
}
# Příklad příkazu pro spuštění Java s omezením paměti pro rychlou demonstraci OOM
java -Xmx64m OOMExample

Prevence OOM zahrnuje:

  • Optimalizaci kódu pro efektivní využití paměti.
  • Správné nastavení parametrů JVM nebo prostředí.
  • Pravidelnou analýzu dumpů haldy a profilování.
  • Monitoring využití paměti v produkčním prostředí.