Sobes.tech
Junior

Čo je Out of Memory (OOM)?

sobes.tech AI

Odpoveď od AI

Out of Memory (OOM) — je situácia, keď aplikácia alebo operačný systém vyčerpá dostupnú operačnú pamäť na alokáciu nových objektov alebo vykonanie požadovaných operácií.

V kontexte operačných systémov nastáva OOM, keď systém nemôže alokovať pamäť pre nový proces alebo vlákno. Aby sa predišlo úplnému zlyhaniu systému, v Linuxe existuje OOM Killer — mechanizmus, ktorý nútene ukončuje procesy, ktoré spotrebúvajú veľa pamäte, aby uvoľnil zdroje.

V kontexte aplikácií nastáva OOM, keď virtuálna stroj Java (JVM) alebo prostredie pre spúšťanie iného jazyka nemôže alokovať pamäť v halde (heap) na vytvorenie nového objektu.

Príčiny OOM môžu byť rôzne:

  • Úniky pamäte (Memory Leaks): Objekt, ktoré už nie sú používané, zostávajú v pamäti, pretože na ne sú zachované odkazy, brániace garbage collectoru ich odstrániť.
  • Nadmerná spotreba pamäte: Aplikácia žiada alebo udržiava príliš veľké množstvo pamäte na spracovanie dát (napríklad načítanie veľkého súboru úplne do pamäte).
  • Nedostatočné pridelenie pamäte: Nastavenia JVM (napríklad, -Xmx) alebo konfigurácia prostredia neposkytujú dostatok pamäte na chod aplikácie.
  • Chybné nastavenie poolov vlákien alebo spojení: Nadmerný počet aktívnych vlákien alebo spojení môže konzumovať významné množstvo pamäti zásobníka (pre vlákna) alebo iných oblastí pamäti.

Príznaky OOM na úrovni aplikácie sú často:

  • Spomalenie chodu aplikácie.
  • Výnimka OutOfMemoryError v logoch.
  • Pokles výkonu garbage collectora.

Na diagnostiku OOM sa používajú nasledujúce prístupy:

  • Analýza logov: Vyhľadávanie výnimiek OutOfMemoryError a správ od OOM Killer.
  • Zber haldových dumpov: Vytvorenie snímky obsahu haldy v okamihu vzniku chyby na ďalšiu analýzu pomocou nástrojov (napríklad Eclipse Memory Analyzer Tool (MAT), VisualVM).
  • Monitoring: Použitie systémových monitorovacích systémov (Prometheus, Grafana, New Relic) na sledovanie využitia pamäte JVM a operačného systému.
  • Profilovanie: Použitie profilovacích nástrojov (JProfiler, YourKit) na odhalenie vzorov využitia pamäte a zdrojov únikov.
// Príklad Java kódu, ktorý môže viesť k OOM (s únikom pamäte)
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ále pridávanie objektov bez ich odstránenia
        }
    }

    public static void main(String[] args) {
        OOMExample example = new OOMExample();
        example.addObjects();
    }
}
# Príklad príkazu na spustenie Java s obmedzením pamäte pre rýchlu demonštráciu OOM
java -Xmx64m OOMExample

Prevencia OOM zahŕňa:

  • Optimalizáciu kódu pre efektívne využívanie pamäte.
  • Správne nastavenie parametrov JVM alebo prostredia.
  • Pravidelnú analýzu dumpov haldy a profilovanie.
  • Monitorovanie využitia pamäte v produkčných prostrediach.