Hogyan csökkenthető a versenytárs java meghibásodása és a túlzott gc mód

A Java-ban az egyidejű üzemmód meghibásodása azt jelenti, hogy a versengő gyűjtő nem tudott felszabadítani elegendő állandó és állandó típusú memóriaterületet, és feladnia kell, és hagynia kell, hogy a gc teljesen megállítsa a világot. a végeredmény nagyon drága lehet.

csökkenthető

Megértem ezt a koncepciót, de még soha nem volt jó átfogó megértésem arról, hogy A) mi okozhat egyszerre kudarcot, és B) Mi a megoldás ?.

Ez a fajta kétértelműség arra késztet, hogy túl sok javaslat nélkül írjak/hibaelhárítsam a kódot, és gyakran különösebb ok nélkül kell körbejárnom ezeket a teljesítményzászlókat a Foo-tól a Bar-ig, csak meg kell próbálnom.

Szeretném megtudni az itteni fejlesztőktől, milyen a tapasztalata? Ha teljesítményproblémával szembesült, mi volt az oka és hogyan közelítette meg?

Ha van kódolási ajánlása, kérjük, ne legyen túl általános. Köszönöm!

4 válasz

Az első dolog, amit megtanultam a CMS-sel kapcsolatban, hogy több memóriára van szüksége, mint más gyűjtőknek, körülbelül 25-50% -kal több jó kiindulópont. Ez segít elkerülni a töredezettséget, mivel a CMS nem végez tömörítést, például leállítja a globális gyűjtést. Másodszor, tegyen olyan dolgokat, amelyek segítenek a szemétszedőben; Integer.value Az új Integer helyett szabaduljon meg az anonim osztályoktól, győződjön meg arról, hogy a belső osztályok nem férnek hozzá hozzáférhetetlen dolgokhoz (privátok a külső osztályban). Minél kevesebb szemetet, annál jobb. Ebben sokat segít a FindBugs és a figyelmeztetések figyelmen kívül hagyása.

A hangolásnál azt tapasztaltam, hogy több dolgot is ki kell próbálni:

Mondja a JVM-nek, hogy használja a CMS-t a tenured műfajban.

Helyes cölöpméret: -Xmx2048m -Xms2048m Ez megakadályozza, hogy a GC olyan dolgokat tegyen, mint a halom növelése és csökkentése.

Használja a párhuzamosat a fiatalabb generációs sorozatgyûjtemény helyett. Ez felgyorsítja kisebb gyűjteményeit, különösen, ha nagyon nagy fiatal nemet állított be. Egy nagy fiatal generáció általában jó, de nem haladja meg a régi nem felét.

állítsa be a CMS által használt szálak számát, amikor párhuzamosan végezhető dolgokat végez.

-XX: + CMSParallelRemarkEnabled megjegyzés alapértelmezés szerint soros, ez felgyorsíthatja.

-XX: + CMSIncrementalMode lehetővé teszi az alkalmazás hosszabb futtatását a GC fázisok közötti váltásával

-XX: + CMSIncrementalPacing lehetővé teszi a JVM számára, hogy idővel megváltoztassa a gyűjtési gyakoriság változását

-XX: CMSIncrementalDutyCycleMin = X A GC-ben töltött idő minimális mennyisége

-XX: CMSIncrementalDutyCycle = X Indítsa el GC-vel az idő% -ában

-XX: CMSIncrementalSafetyFactor = X

Megállapítottam, hogy általában rövid szünetet kaphat, ha úgy állítja be őket, hogy mindig összegyűjtse őket. Mivel a legtöbb munkát párhuzamosan végzik, eléri az általában kiszámítható szüneteket.

-XX: CMSFullGCsBeforeCompaction = 1

Ez nagyon fontos. Azt mondja a CMS gyűjtőnek, hogy az új gyűjtemény megkezdése előtt mindig töltse ki a gyűjteményt. Enélkül bekerülhet abba a helyzetbe, hogy rengeteg munkát dob, és újrakezdi.

Alapértelmezés szerint a CMS hagyja, hogy a PermGen növekedjen, amíg néhány hét múlva megöli az alkalmazásodat. Ez megáll. A PermGen értéke csak akkor nő, ha a Reflectiont használja, vagy rosszul használja a String.intern programot, vagy valami rosszat csinál egy osztályos betöltővel vagy valami mással.

A túlélő játszható attól függően is, hogy hosszú vagy rövid életű tárgyai vannak-e, és mennyi az objektum másolása a túlélő terek között, amelyekkel együtt élhet. Ha tudod, hogy az összes objektumod a közelben marad, konfigurálhatod a nulla méretű túlélési tereket, és bármit, ami túlél egy fiatal műfaji gyűjteményt, azonnal elérhetővé tesznek.

A párhuzamos üzemmód meghibásodása elkerülhető azáltal, hogy növeli a társult generálás számát, vagy a CMS gyűjtését kisebb kapacitásra indítja, ha a CMSInitiatingOccupancyFraction értéket alacsonyabbra állítja.

Ha azonban valóban van memóriaszivárgás az alkalmazásában, akkor csak időt vásárol.

Ha gyors újraindításra és helyreállításra van szüksége, és a "gyors" megközelítést részesíti előnyben, azt javaslom, hogy egyáltalán ne használja a CMS-t. Harcolnék a '-XX: + UseParallelGC'-vel.

A párhuzamos szemétgyűjtő (UseParallelGC) memórián kívüli kivételt dob, ha túl sok idő alatt kis mennyiséget gyűjtött össze a halomból. A kivétel elkerülése érdekében megnövelheti a lerakó méretét. Beállíthatja a -XX: GCTimeLimit = időkorlát és -XX: GCHeapFreeLimit = térkorlát paramétereket is

Néha az OOM meglehetősen gyorsan és megölték, néha sokáig szenvedtek (az utolsó időszak több mint 10 óra volt).

Számomra úgy tűnik, hogy egy memóriaszivárgás a problémád gyökere.

A CMS meghibásodása nem okoz (ahogy értem) OOM-ot. Inkább azért fordul elő CMS hiba, mert a JVM-nek túl sok gyűjteményt kell túl gyorsan elvégeznie, és a CMS nem tud lépést tartani. Az a helyzet, amikor sok gyűjtési ciklus történik rövid idő alatt, amikor a szeméttárolója szinte megtelt.

Az igazán hosszú zajidő furcsán hangzik. de elméletileg lehetséges, ha az autója borzalmasan mozog. A CG-k hosszú ismétlése azonban meglehetősen valószínű, ha a dump szinte tele van.

Beállíthatja a GC-t úgy, hogy leessen, amikor a dump 1) teljes méretben és 2) a teljes GC befejezése után még mindig a teljes közelében van. Próbálja meg ezt megtenni, ha még nem tette meg. Ez nem oldja meg a problémákat, de legalább a JVM gyorsan megkapja az OOM-ot, lehetővé téve a szolgáltatás gyorsabb újraindítását és helyreállítását.

SZERKESZTÉS - ennek a lehetősége -XX: GCHeapFreeLimit = nnn, ahol nnn 0 és 100 közötti szám, amely megadja a halom minimális százalékát, amelynek szabadnak kell lennie a GC után. Az alapértelmezett érték 2. Az opció a megfelelő címet viseli "A Java-6 JVM -XX beállításainak legteljesebb listája" oldalon. (Számos olyan -XX opció van felsorolva, amelyek nem jelennek meg a Sun dokumentációjában. Sajnos az oldal kevés részletet tartalmaz arról, hogy a lehetőségek valójában mit csinálnak.)

Valószínűleg el kell kezdenie vizsgálni, hogy nem szivárog-e az alkalmazás/webapp. Ha igen, akkor a problémái csak akkor szűnnek meg, ha megtalálják és kijavítják őket. Hosszú távon a Hotspot GC opciókkal történő kezelés nem oldja meg a memória szivárgását.