Az alapelvek szemétgyűjtő beállításokat a semmiből

Ebben a cikkben, én nem szeretnék összpontosítani működési elve a szemétgyűjtő - ez rendben van, és világosan le van írva van: habrahabr.ru/post/112676/. Azt akarjuk, hogy több megy a gyakorlati alapokat és mennyiségi jellemzői konfigurálására Garbage Collection a JVM -, és próbálja megérteni, hogyan lehet hatékony.

Mennyiségi jellemzői hatékonyságának értékelésére GC


Tekintsük a következő számokat:

  • Sávszélesség intézkedés, amely meghatározza az alkalmazás képes működni csúcsterhelés függetlenül szünetre szerelés és a szükséges memória mérete
  • GC mérni RTT meghatározása, az alkalmazás képes megbirkózni ingadozás megállások számát és a munka GC
  • A méret a használt memória memória mérete, amely szükséges a hatékony működéséhez GC

Általában ezek a jellemzők befolyásolják, illetve javított egyikük vezet a fennmaradó költségeket. A legtöbb alkalmazás esetén mind a három legfontosabb jellemzője, de gyakran egy-két fontosabb alkalmazási - ez lesz a kiindulási pont, hogy hozzanak létre.

Alapelvei GC tuning

Tekintsük három alapvető alapvető megértése a szabályokat GC beállításokat:
  • Meg kell próbálni, hogy a maximális számú objektum működtetése során tisztított kis GC (kisebb grabage gyűjtemény). Ez az elv lehetővé teszi, hogy csökkentsék a számát és gyakoriságát a teljes szemétgyűjtő (garbage collection teljes) - akinek a munkája a fő oka a hosszú késések a kérelemben
  • A több memóriát az alkalmazás, a jobb szemét gyűjtése, és a jobb az elért mennyiségi jellemzőit sávszélesség és válaszidő
  • Hatékonyan beállítani csak két a három mennyiségi jellemzőit - áteresztőképességű, válaszidő, allokált memória mérete - a tényleges értéke a szükséges memória mérete ez úgy értendő minimalizálás

fogjuk futtatni egy kísérletet:

Mely az alapértelmezett üzemmód aktiválódik - szerver és UseParallelGC (többszálú működési szakaszban kis szemétgyűjtő)

Ahhoz, hogy megbecsüljük a teljes összeg a szünet szemétgyűjtő is futtatni mód:

És összefoglalja a késedelem szakadékba gc.log:

Amennyiben valós = 0.01 másodperc - a ténylegesen eltöltött idő szerelvény.

És akkor a közüzemi VisualVm, egy plugin telepítése VisualGC, amely világosan megfigyelhetjük memóriafoglalási különböző területein GC (Eden, Survivor1, Survivor2, régi) és a statisztikák a start és időtartamát egy szemétgyűjtő.

Határozza meg a szükséges memória méretét


Kezdeni, meg kell futtatni az alkalmazást a lehető legnagyobb mennyiségű memória, mint a ténylegesen szükséges alkalmazást. Ha nem tudja, kezdetben mennyi lesz a kérelmet a memóriában -, akkor az alkalmazás futtatásához megadása nélkül -Xmx és -Xms és HotSpot virtuális gép válassza a memória mérete. Ha az elején a kérelmet fogunk kapni OutOfMemory (Java kupac térben vagy PermGen tér), akkor mi is iteratív növeli a rendelkezésre álló memória mérete (-Xmx vagy -XX: PermSize), amíg a hiba megszűnt.
A következő lépés az, hogy kiszámítja a méret a hosszú életű élő adatok - a méret a régi és az állandó területek a halom időszakot követően teljes szemétgyűjtő. Ez a méret - a hozzávetőleges memória működéséhez szükséges az alkalmazás, így, akkor láthatjuk a terület nagysága után egy sor a teljes összeszerelés. Általában a memória mérete alkalmazásához szükséges -Xms és -Xmx 3-4-szor nagyobb, mint az összeg az élő adatokat. Tehát, hogy a napló, a fenti - régi mező értéke időszakot követően teljes szemétgyűjtés - 349363K. Ezután a javasolt érték -Xmx és -Xms

1400 MB. -XX: PermSize és -XX: MaxPermSize - 1,5-szer több, mint PermGenSize időszakot követően a teljes szemétgyűjtő - 13324K

20 MB. A méret a fiatal generáció veszi egyenlő méretű 1-1,5 térfogat élő adat

525 MB. Aztán kap egy string JVM fut a következő paraméterekkel:

A VisualVm megkapjuk az alábbi képet:

Az alapelvek szemétgyűjtő beállításokat a semmiből

Összesen 54 szerelvény történt 30 másodpercig a kísérlet - 31 kis- és 23 teljes - a teljes leállási idő 3,227c. Ez az összeg a késedelem nem felel meg a szükséges követelményeknek - meglátjuk, ha meg tudjuk javítani a helyzetet, hogy nem változik az alkalmazás kódját.

Beállítása a megengedett válaszidő


A következő paramétereket kell mérni és figyelembe kell venni, amikor beállítja a válaszidő:
  • Mérési kis szemétgyűjtő időtartama
  • Mérési kis szemétgyűjtő frekvencia
  • Hosszának mérése A legrosszabb eset teljes szemétgyűjtő
  • Mérési gyakorisága a legrosszabb esetben a teljes szemétgyűjtő
méret beállítása fiatal és idős generáció


A szükséges idő a kis szakasza szemétgyűjtő függ az objektumok száma a fiatal generáció, annál kisebb a mérete - az alsó időtartamát, de egyre gyakoribb, mint területet gyakran kezd betelni. Próbálja meg csökkenteni az idő minden kis összeállítás mérete csökken a fiatal generáció, miközben a mérete a régi generáció. Nagyjából úgy becsülhető, hogy minden második tisztázzuk a fiatal generáció 50potokov 8obektov * 1 MB

400Mbps. Fuss az alábbi paraméterekkel:

A VisualVm megkapjuk az alábbi képet:

Az alapelvek szemétgyűjtő beállításokat a semmiből

A teljes idő a szemetet nem voltunk képesek befolyásolni egy kis építmények - 1,533s - nagyobb gyakorisággal kis szerelvények, de a teljes idő romlott - 3661 annak a ténynek köszönhető, hogy a megnövekedett kihasználtságot a régi generáció, és a megnövekedett gyakorisága hívás teljes szemétgyűjtő. Annak érdekében, hogy megoldja ezt a - próbálja meg növelni a méretét a régi generáció - JVM fut a következő paraméterekkel:

Az alapelvek szemétgyűjtő beállításokat a semmiből

Összesen szünet Most javult, és összege 2637 összértékű alkalmazásához szükséges memória ugyanakkor csökkent - így iteratív, megtalálja a helyes egyensúlyt a régi és a fiatal generáció számára eloszlásának élettartama tárgyak egy adott alkalmazás.

Ha az idő még mindig nem elégedett velünk - akkor megy a konkurens szemétgyűjtő, beleértve azt a lehetőséget -XX: + UseConcMarkSweepGC - egy algoritmus, amely megpróbálja elvégezni érdemi munkát jelölés tárgyak törlésre külön áramlik párhuzamos alkalmazások.

Beállítása Egyidejű szemétgyűjtő


ConcMarkSweep GC igényel gondos beállítások - az egyik fő célkitűzése, hogy csökkentse a stop-a-világot szünetelteti hiányában elegendő hely a régi generáció helyzetét tárgyak - például a Ez a fázis tart átlagosan hosszabb, mint a fázis teljes szemétgyűjtő amikor átmenő GC. Ennek eredményeként - növelheti időtartamát a legrosszabb esetben szemétgyűjtő, szükséges, hogy elkerüljük a gyakori túlcsordul a régi generáció. Általános szabály, hogy - az átmenet ConcMarkSweep GC ajánlani méretének növelése régi generáció 20-30% - JVM fut a következő paraméterekkel:

Az alapelvek szemétgyűjtő beállításokat a semmiből

Összesen szünet csökkent 1923 másodperc.

méret beállítása túlélő


Az alábbi grafikon látható memória mennyiségét pályázatok megoszlása ​​szerint az átmenetek száma közötti szakaszai Eden, Survivor1 és Survivor2 mielőtt eljut a régi generáció. Az a tény, hogy az egyik módja annak, hogy csökkentsék a számát túlcsordul a régi generáció ConcMarkSweep GC - megakadályozza a közvetlen áramlását tárgyakat a fiatal generáció közvetlenül a régi - megkerülve túlélő régióban.

Figyelemmel kíséri a tárgyak elosztása a színpadon, meg lehet kezdeni a JVM a lehetőséget -XX: + PrintTenuringDistribution.
A gc.log tudjuk megfigyelni:

A teljes összeget a túlélő tárgyak - 40900584, CMS alapértelmezés szerint 50% -al gát kitöltött területek túlélő. Így megkapjuk a méret a régió

80 MB. Amikor fut, akkor van beállítva JVM paramétert -XX: SurvivorRatio, amelynek meghatározása az alábbi képletből:

Akarta, hogy hagyja Eden tér mérete ugyanaz - ezt kapjuk:


Az alapelvek szemétgyűjtő beállításokat a semmiből

Az eloszlás jobb, de a teljes idő nem sok minden változott, mivel az alkalmazás sajátosságait, a tény az, hogy miután a gyakori kis hulladékgyûjtés mérete túlélő tárgyak mindig nagyobb, mint a rendelkezésre álló területek nagysága túlélője, így ebben az esetben is lehet adományozni helyes elosztása mellett Éden mérete hely:


Az alapelvek szemétgyűjtő beállításokat a semmiből


Ennek eredményeként sikerült csökkenteni a teljes mérete a szünet egy 3227 a 1481 30 kísérletezni egy kicsit, miközben növeli a memória-felhasználás. Sok vagy kevés - függ az adott funkciók, különösen, mivel az a tendencia, hogy csökkentse a költségeit a fizikai memóriát, és azt az elvet, hogy maximalizálják a memória használatára - továbbra is fontos, hogy megtalálja az egyensúlyt a különböző területek GC és a folyamat sokkal kreatívabb, mint tudományos.

A több memóriát az alkalmazás, a jobb szemét gyűjtése, és a jobb az elért mennyiségi jellemzőit sávszélesség és válaszidő WUT? A növekvő memória kaphatnak jelentős növekedés a diszperziós (egyszerűsített - szórás) késleltetést. Nagy halom időt teljes egység (teljes gc) egy s-t-w (wtop a világon) szünet több, ami növekedést jelent a látencia, ha jön a teljes gc.

Egyes elvtársak kezdeni JVM nagy Heep és rendszeresen csak újra az egész, anélkül, hogy megvárná a teljes gc.

A klasszikusok. A antipattern használat Apache Cassandra egy szép táblázat, amely bemutatja, hogy mi okozhatja növekedését az esztelen -Xms / xmx.


www.datastax.com/documentation/cassandra/1.2/cassandra/architecture/architecturePlanningAntiPatterns_c.html


Van egy feladatot egy -Xmx re 12G 16G csomóponthoz Cassandra rettenetesen lassú, nagy késleltetésű The, időtúllépés és a veszteség a lapkák, a 8G mindent dolgozott folyamatosan a normál áramlási (6 csomópont 500-600 MByte / s csomópont a 2x SSD RAID1).

Az előzőekben említett témában ez az eset, de pontatlanság volt. A megadott adatfolyam (50 Mbit / s) a csomópontok bemeneti streamjéhez kapcsolódik, a join'a-hoz a memóriában lévő szótárakhoz és a forrásfolyam adatainak bizonyos mértékű kiszűréséhez.

Kapcsolódó cikkek