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:
- Fiatal generációs hely
- Régi / bérelt generációs hely
A fiatal generáció ismét három részre oszlik
- Éden tér
- Túlélő tól
- 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 -
- Konstruktor és romboló Java-ban
- Destructor Java
- C # vs Java teljesítmény
- Mi a JVM?