Munka az objektumok generációival
A Java szemétgyűjtők generációs szemétgyűjtési stratégiát valósítanak meg, amely képes az objektumokat életkor szerint osztályozni.
Az ilyen igény (az összes objektum megjelölése és tömörítése) a JVM-ben nem hatékony. Mivel a nagyszámú objektum kiosztásával a listájuk növekszik, ami a szemétgyűjtési idő növekedéséhez vezet. Az alkalmazások empirikus elemzése kimutatta, hogy a Java legtöbb objektuma rövid életű.
A JVM kupacmemória területe három részre oszlik:
![Munka az objektumok generációival](https://cdn.codegym.cc/images/article/8aab6bd2-292b-4ecd-9ecc-9ee2a44d3c82/1024.jpeg)
Fiatalabb generáció
Az újonnan létrehozott tárgyak a fiatalabb generációban kezdődnek. A fiatalabb generációt további két kategóriába sorolják.
- Eden Space - Minden új objektum itt kezdődik, kezdeti memóriát foglalnak le.
Túlélő terek (FromSpace és ToSpace) – Az objektumokat egy szemétgyűjtési ciklus túlélése után helyezik át ide az Édenből.
Azt a folyamatot, amikor a tárgyakat a fiatalabb generációtól gyűjtik össze, kisebb szemétgyűjtési eseménynek nevezzük.
Amikor Eden tere megtelik tárgyakkal, egy kis szemétgyűjtést hajtanak végre. Minden halott tárgyat eltávolítanak, és az összes élőt áthelyezik a fennmaradó két mező valamelyikére. A kis GC a túlélő térben lévő objektumokat is ellenőrzi, és áthelyezi őket egy másik (következő) túlélő térbe.
Vegyük példaként a következő sorozatot.
- Mindkét típusú (élő és holt) tárgy található az Édenben.
- Egy kis GC történik - minden halott tárgyat eltávolítanak az Édenből. Minden élő tárgy a tér-1-be kerül (Térből). Az Eden és a space-2 most üres.
- Új objektumok jönnek létre, és hozzáadódnak az Edenhez. Néhány objektum az Édenben és a tér-1-ben halottá válik.
- Egy kis GC történik - az összes halott tárgyat eltávolítják az Édenből és a tér-1-ből. Minden élő tárgy a 2. térbe (ToSpace) kerül. Az éden és a tér-1 üres.
Így bármikor, az egyik túlélőtér mindig üres. Amikor a túlélők elérnek egy bizonyos küszöböt ahhoz, hogy áthaladjanak a túlélőkön, egy idősebb generációvá lépnek fel.
Az -Xmn kapcsolóval beállíthatja a fiatal generáció méretét .
Idősebb generáció
Azok az objektumok, amelyek jelentős ideig élnek (például egy program élettartamának nagy részét), idővel régebbi tárgyakká válnak – százévesek. Rendszeres generációként is ismert, és olyan objektumokat tartalmaz, amelyek hosszú ideig a túlélő terekben maradtak.
Egy objektum élettartamának küszöbértéke határozza meg, hogy hány szemétgyűjtési cikluson kell keresztülmennie, mielőtt az idősebb generációhoz kerül. Azt a folyamatot, amikor az idősebb generáció tárgyakat küld a szemétbe, fő szemétgyűjtési eseménynek nevezzük.
Az -Xms és -Xmx jelzők segítségével beállíthatja a kezdeti és maximális kupacmemória méretét .
Mivel a Java generációs szemétgyűjtést használ, minél több szemétgyűjtési eseményt tapasztal egy objektum, annál tovább halad a halmon. A fiatalabb nemzedékben kezdődik, és végül a normál generációba kerül, ha elég sokáig él.
Az objektumok terek és generációk közötti népszerűsítésének megértéséhez vegye figyelembe a következő példát:
Amikor létrejön egy tárgy, először a fiatal generáció Édenterébe kerül.
Amint egy kis szemétgyűjtés történik, az Eden élő objektumai a FromSpace-be kerülnek. Amikor a következő kisebb szemétgyűjtés megtörténik, az Édenből és az űrből élő objektumok a ToSpace-be kerülnek.
Ez a ciklus bizonyos számú alkalommal folytatódik. Ha az objektum e pont után is "szolgálatban van", a következő szemétgyűjtési ciklus áthelyezi a régebbi generációs helyre.
Permanens generáció és metatér
Az olyan metaadatokat, mint az osztályok és a metódusok, állandó generálás során tárolják. A JVM futás közben tölti fel az alkalmazás által használt osztályok alapján. A már nem használt osztályok állandó generációból szemétté válhatnak.
Az -XX:PermGen és -XX:MaxPermGen jelzők segítségével beállíthatja az állandó generáció kezdeti és maximális méretét .
meta tér
A Java 8 óta a PermGen helyet a MetaSpace memóriaterület váltotta fel. A megvalósítás eltér a PermGen-től – ez a kupactér most automatikusan megváltozik.
Ezzel elkerülhető az alkalmazás kifogyott memóriája a PermGen halomterületének korlátozott mérete miatt. A metatérmemória szemetet gyűjthet, és a már használaton kívüli osztályok automatikusan törlődnek, amikor a metatér eléri a maximális méretét.