Limit režie Gc překročil, co dělat. Jaké typy chyb OutOfMemoryError existují nebo z jakých částí se skládá paměť procesu Java?

Jedním z běžných příznaků úniku paměti je výjimka java.lang.OutOfMemoryError. Tato chyba je obvykle vyvolána, když není dostatek místa pro přidělení objektu v haldě Java. V tomto případě The popelář nemůže zpřístupnit prostor pro umístění nového objektu a haldu nelze dále rozšiřovat. Tato chyba může být také vyvolána, když není dostatek nativní paměti pro podporu načítání a třída Java. Ve vzácných případech může být vyvolána chyba java.lang.OutOfMemoryError, když se nadměrné množství času tráví sběrem odpadu a uvolňuje se málo paměti.

Když je vyvolána výjimka java.lang.OutOfMemoryError, vytiskne se také trasování zásobníku.

Výjimka java.lang.OutOfMemoryError může být také vyvolána kódem nativní knihovny, když nativní alokace nemůže být splněna (například pokud je málo místa na odkládání).

Prvním krokem k diagnostice výjimky OutOfMemoryError je určení příčiny výjimky. Bylo to vyvoláno, protože halda Java je plná, nebo protože je plná nativní halda? Abychom vám pomohli najít příčinu, obsahuje text výjimky podrobnou zprávu na adrese konec, jak je uvedeno v následující výjimky.

14. dubna 2011 v 09:02

Jaké typy chyb OutOfMemoryError existují nebo z jakých částí se paměť skládá? java proces

  • Jáva

Pokud zachytíte chybu OutOfMemoryError, neznamená to, že vaše aplikace vytvoří mnoho objektů, které nelze vyčistit pomocí garbage collector a zaplnit veškerou paměť, kterou jste alokovali pomocí parametru -Xmx. Napadají mě alespoň dva další případy, kdy byste tuto chybu mohli vidět. Jde o to, že paměť java procesu není omezena na oblast -Xmx, kde vaše aplikace programově vytváří objekty.

Oblast paměti obsazená procesem Java se skládá z několika částí. Typ chyby OutOfMemoryError závisí na tom, kterému z nich došlo místo.

1. java.lang.OutOfMemoryError: Prostor haldy Java

Na haldě není dostatek místa, konkrétně v oblasti paměti, do které jsou umístěny objekty vytvořené programově ve vaší aplikaci. Velikost je určena parametry -Xms a -Xmx. Pokud se pokusíte vytvořit objekt a v haldě nezůstane žádné místo, zobrazí se tato chyba. Problém obvykle spočívá v úniku paměti, kterých je velké množství a internet je prostě plný článků na toto téma.

2. java.lang.OutOfMemoryError: Prostor PermGen

K této chybě dochází, když není dostatek místa v oblasti Permanent, jejíž velikost je určena parametry -XX:PermSize a -XX:MaxPermSize. Co tam leží a jak se vypořádat s OutOfMemoryError tam vznikající, jsem již popsal podrobněji.

3. java.lang.OutOfMemoryError: Překročen limit režijních nákladů GC

K této chybě může dojít jak při přetečení první, tak druhé oblasti. Je to způsobeno tím, že zbývá málo paměti a GC neustále pracuje a snaží se uvolnit místo. Tato chyba lze deaktivovat pomocí parametru -XX:-UseGCOverheadLimit, ale samozřejmě by se neměl deaktivovat, ale buď vyřešit problém s únikem paměti, nebo přidělit více místa nebo změnit nastavení GC.

4. java.lang.OutOfMemoryError: nelze vytvořit nové nativní vlákno

Poprvé jsem se s touto chybou setkal před několika lety, když jsem na ní pracoval zátěžové testování a snažil se to zjistit maximální množství uživatelů, kteří mohou pracovat s naší webovou aplikací. Použil jsem speciální nástroj, který mi umožňoval přihlašovat uživatele a emulovat je standardní akce. Na určitou částku klientům, začal jsem dostávat OutOfMemoryError. Aniž bych skutečně přečetl text zprávy a myslel si, že nemám dostatek paměti k vytvoření uživatelské relace a dalších nezbytných objektů, zvětšil jsem velikost haldy aplikace (-Xmx). Představte si mé překvapení, když se poté počet uživatelů současně pracujících se systémem pouze snížil. Podívejme se blíže, jak k tomu došlo.

Ve skutečnosti je to velmi snadné reprodukovat ve Windows na 32bitovém počítači, protože procesu není přiděleno více než 2 GB.

Řekněme, že máte aplikaci s velkým počtem souběžných uživatelů, která se spouští s parametry -Xmx1024M -XX:MaxPermSize=256M -Xss512K. Pokud je pro proces k dispozici celkem 2G, zůstává volných asi 768 milionů. Právě v tomto zbytku paměti se vytvářejí zásobníky vláken. Přibližně tedy nemůžete vytvořit více než 768*(1024/512)=1536 (s těmito parametry jsem jich dokázal vytvořit 1316) vláken (viz obrázek na začátku článku), poté obdržíte OutOfMemoryError. Pokud zvýšíte -Xmx, počet vláken, která můžete vytvořit, se odpovídajícím způsobem sníží. Možnost s redukcí -Xss, aby bylo možné vytvořit více vlákna není vždy řešením, protože ve vašem systému mohou být vlákna, která vyžadují poměrně velké zásobníky. Například inicializační vlákno nebo tak úkoly na pozadí. Ale stále existuje cesta ven. Ukazuje se, kdy tvorba softwaru závitu, můžete určit velikost stohu: Přidat štítky




Nahoru