Mi a Java szemétgyűjtő? - Útmutató a Java szemétgyűjtőhöz

Tartalomjegyzék:

Anonim

Mi a Java szemétgyűjtő?

A szemétgyűjtő egy démonszál, amely felszabadítja a memóriát a futásidejű folyamatok során. A hulladékgyűjtés memória újrahasznosításként is kifejezhető. Leginkább a JVM-ben az oracle hotspot szemetesgyűjtőt használják hatékonysága miatt. A JVM memóriaterületét, ahol az objektumok létrejönnek, halomnak nevezzük. A halom két részre oszlik:

  1. Fiatal generációs hely
  2. Régi / bérelt generációs hely

A fiatal generáció ismét három részre oszlik

  1. Éden tér
  2. Túlélő tól
  3. Túlélő To

Mélyebb magyarázatot adtak a következő pontokban. Például, ha létrehozott egy gyorsítótárat a programban, és ha a gyorsítótár-objektum sok GC-ciklust túlélt, akkor a régi generációba kerül. A GC objektumokat keres, amelyekre a programnak már nincs szüksége, és elpusztítja azokat.

Miért a szemétgyűjtő?

A Java előtt a két legnépszerűbb nyelv a C és a C ++ volt. C-ben találkoztunk a calloc (), malloc (), realloc () -al, amelyek puffermemóriát fognak kiosztani, és a C ++-ban destruktorok vannak. Mindezek a funkciók a memóriakezelésnek nevezett funkcióra vonatkoznak. A Java kétféle fő okból biztosítja a Szemétgyűjtőt mint automatikus memóriakezelést:

  • Egyes létrehozott objektumok elérhetetlenné válnak
  • A régi tárgyakról a fiatal tárgyakra való hivatkozások csak kis számban léteznek.

A szemétgyűjtő használatának legjobb gyakorlata a zászlók felállítása a JVM-en.

Hadd mutassam meg példát az elérhetetlen tárgyakról

//class code
int i = 1;
if(i == 1)(
String s = abc;
System.out.println(s);
)
//class code

A fenti példában a Java létrehoz egy karakterláncobjektumot, és az objektum hatóköre éppen abban rejlik, ha a blokkot nem lehet kinti felhasználni. Tehát, ha a szemetesgyűjtés ezen az osztályon halad át, akkor az 's' -t elérhetetlen és nem használt tárgyként jelöli meg, és törli.

Funkciók a szemétgyűjtőben

  • Jelölés: Az alkalmazás gyökér csomópontjától kezdődik (fő), bejárja az objektum gráfot, megjelöli azokat az objektumokat, amelyek életként elérhetőek.
  • Törlés / sweep: A nem elérhető objektumok törlése. Amikor a GC objektumokat töröl, lyukat hoz létre a halomban, és következetlenné teszi. Így tömörítést alkalmazunk.
  • Kompaktálás: Tömörítse a memóriát az objektumok körüli mozgatással és az allokáció szomszédos, mint töredezett megjelölésével. Ez időigényes feladat.

Hogyan működik a Java Garbage Collector?

  • Kétféle objektum létezik:

Élő objektumok: Elérhető (hivatkozások egy másik objektumból)

Halott objektumok: Nem érhető el (sehova nem hivatkozik)

  • Az összes újonnan létrehozott objektum az Eden térben (Fiatal Generáció térben) kerül létrehozásra.
  • Amint az Eden-terület megtelt, a minorGC () program fut a Fiatal Generáció helyén, amely megjelöli az összes fel nem használt vagy elhalt tárgyat, és törli őket a memóriából.
  • Azok a tárgyak, akik túlélték ezt a GC ciklust, a Survivor űrből kerülnek. Ugyanez a folyamat ismétlődik, és ezúttal, amikor az objektumokat az Eden térből a Survivor Spacebe továbbítják, a GC ellenőrzi, hogy tele van-e, hogy a halott tárgyakat szabadon engedik-e, és a túlélő tárgyakat a Survivorba is áthelyezik.
  • Ez a folyamat megismétlődik, és ha néhány objektum túléli a GC ciklusok küszöbértékét, akkor ezeket az objektumokat a régi generációs térbe helyezik.
  • Ebben a forgatókönyvben a JVM a majorGC () függvényt futtatja, amely a teljes halomterületen keresztül fut, azonosítja / megjelöli a nem használt (semleges vagy halott) objektumokat, és az összes objektumot átöri.
  • Ne feledje, hogy az objektumok elsöprése a halomtérből lyukakat okoz a memóriában, memóriaszivárgást okozva. Az ilyen forgatókönyvek elkerülése érdekében a szemetesgyűjtő a memóriaterület tömörítését hajtja végre

Példák a Java szemétgyűjtőre

Példa a system.gc () -ra:

class Demo (
public void finalize()(
System.out.println(“Object”);
)
public static void main(String args())(
Demo obj1 = new Demo();
Demo obj2 = new Demo();
obj1 = null;
obj2 = null;
System.gc();
)
)

Kimenet:

Tárgy

A fenti kód magyarázata

  • A fenti kódban a két obj1 és obj2 objektum nullára mutat, tehát nulla és nem hivatkozott értékekkel kerülnek tárolásra az Eden térben.
  • A gc () rendszer egy démonszálat indít a hulladékgyűjtéshez, és mindkét objektum törlődik a helyről.

Előnyök és hátrányok

Az alábbiakban bemutatjuk a Java Garbage Collector néhány előnyeit és hátrányait, az alábbiak szerint:

A gc előnyei:

  • A hulladékgyűjtés növeli a memória hatékonyságát, mivel törli az összes fel nem használt és semleges objektumot
  • A szemetesgyűjtő automatikus eljárás, ezért a fejlesztő nem vigyáz rá, mivel más nyelveken a szemetesgyűjtő nélkül a programozónak gondoskodnia kell a megsemmisíthető memóriaproblémákról.

A gc hátrányai:

  • A szemetesgyűjtő fő gc funkciót fog futtatni, amely az egész halomterületen átfut, így a program sebessége néhány másodperccel lassan megnő.
  • Ez a folyamat több CPU-időt igényel, és ezzel lecsökkenti a kódrendszert.
  • Ha hatalmas memóriát igénylő alkalmazáson dolgozik, akkor használja a rendelkezésre álló JVM zászlókat.
  • Ha a halom hely megtelt, és az objektumokat nem lehet tovább elmozgatni vagy hozzáadni, akkor a Java eltávolítja a Memória hibát, amely lelassítja az alkalmazást, és memóriaszivárgást okozhat.

Ajánlott cikkek

Ez az útmutató a Mi a Java szemétgyűjtő? Itt tárgyaljuk annak működését, valamint a Java szemétgyűjtő funkcióit, példáit, előnyeit és hátrányait. A következő cikkeket is megnézheti további információkért -

  1. Konstruktor és romboló Java-ban
  2. Destructor Java
  3. C # vs Java teljesítmény
  4. Mi a JVM?