Tól Sandbox alapjait 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/. Szeretne 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 effektivnym.Kolichestvennye jellemzőit GCRassmotrim hatékonyságának értékelésére a következő paraméterekkel: 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 válaszidő intézkedés, amely meghatározza az alkalmazás képes megbirkózni ingadozás megállások számát és a munka GC Méret emoy memória mérete memóriára van szükség a hatékony 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:
import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;
public class MemoryConsumer megvalósítja futtatható
private static final int OBJECT_SIZE = 1024 × 1024; private static final int OBJECTS_NUMBER = 8; private static final int ADD_PROCESS_TIME = 1000; privát statikus végső int NUMBER_OF_REQUEST_THREADS = 50; private static final hosszú EXPERIMENT_TIME = 30000; private static illékony logikai megálló = false;
public static void main (String [] args) dob InterruptedException
start (); Thread.sleep (EXPERIMENT_TIME); stop ();>
private static void start () java -XX: + PrintGCTimeStamps -XX: + PrintGCDetails -verbose: GC -Xloggc: gc.log ru.skuptsov.MemoryConsumer késleltetés és összege víznyelő gc.log: 0,167: [Teljes GC [PSYoungGen: 21792K → 13324K (152896K)] [PSOldGen: 341095K → 349363K (349568K)] 362888K → 362687K (502464K) [PSPermGen: 2581K → 2581K (21248K)], 0,0079385 mp] [Times: user = 0.01 sys = 0.00, valós = 0,01 mp], ahol a valódi = 0,01 mp - a tényleges időt töltött sborku.A segédprogram használható 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, hogy az elején, 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 nem uydut.Sleduyuschim lépés kiszámításához a méret a hosszú életű élő adatokat - 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: java -Xms1400m -Xmx1400m -Xmn525m -XX: PermSize = 20m ru.skuptsov.MemoryConsumer A VisualVm kap a következő kép:
Ö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ése kis szemétgyűjtő időtartama frekvencia, szemét kis összeállítás hosszmérést legrosszabb esetben egy teljes szemétgyűjtő gyakorisága mérése a legrosszabb esetben a teljes szemétgyűjtő kiigazításokat a fiatalok és az idősek generációja a végrehajtáshoz szükséges idő fázis kis szemétgyűjtő függ az objektumok száma a fiatal generáció, a kisebb a mérete - az alsó időtartamát, de ez növeli a részek hogy azért, mert 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 a következő paraméterekkel: java -Xms1275m -Xmx1275m -Xmn400m -XX: PermSize = 20m ru.skuptsov.MemoryConsumer A VisualVm kap a következő kép:
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:
java -Xms1400m -Xmx1400m -Xmn400m -XX: PermSize = 20m ru.skuptsov.MemoryConsumer
Összesen szünet most javult, és eléri a 2637, és a teljes é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 során a ConcMarkSweep GC ajánlott méretének növelése régi generáció 20-30% - JVM fut a következő paraméterekkel: java -Xms1680m -Xmx1680m -Xmn400m -XX: + UseConcMarkSweepGC -XX: PermSize = 20m ru.skuptsov.MemoryConsumer
Összesen szünet csökkent 1923 másodperc.
Beállítása a méret túlélő alatt a diagram alatt láthatjuk a 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ő oblasti.Dlya nyomon a tárgyak elosztása a színpadon, meg lehet kezdeni a JVM a lehetőséget -XX: + PrintTenuringDistribution. A gc.log tudjuk megfigyelni:
Kívánt túlélő mérete 20971520 bájt, új 1-es küszöbérték (max 4) - kor 1: 40900584 bájt, 40900584 teljes mérete összességében túlélő tárgyak - 40.900.584, CMS az alapértelmezett 50% -os kihasználtság gát régió 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: túlélő tér mérete = -Xmn / (- XX: SurvivorRatio = + 2), így
java -Xms1680m -Xmx1680m -Xmn400m -XX: SurvivorRatio = 3 -XX: + UseConcMarkSweepGC -XX: PermSize = 20m ru.skuptsov.MemoryConsumer szeretnének kilépni a eden tér mérete ugyanaz - ezt kapjuk: java -Xms1760m -Xmx1760m -Xmn480m -XX: SurvivorRatio = 5 -XX: + UseConcMarkSweepGC -XX: PermSize = 20m ru.skuptsov.MemoryConsumer
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:
java -Xms1760m -Xmx1760m -Xmn480m -XX: SurvivorRatio = 100 -XX: + UseConcMarkSweepGC -XX: PermSize = 20m ru.skuptsov.MemoryConsumer
Eredmény Ennek eredményeként tudtuk 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.