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

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.

  1. Mindkét típusú (élő és holt) tárgy található az Édenben.
  2. 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.
  3. Ú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.
  4. 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.