Какво е Java Garbage Collector?
Събирачът за боклук е демонова нишка, която освобождава паметта по време на изпълнение. Събирането на боклук може да се изрази и като рециклиране на паметта. Най-вече в JVM се използва боклукът за събиране на боклук oracle hotspot поради своята ефективност. Областта на паметта в JVM, където се създават обекти, се нарича heap. Купата е разделена на две части:
- Космос на младото поколение
- Старо пространство / поколение поколение
Младото поколение отново е разделено на 3 части
- Eden пространство
- Сървайвър от
- Survivor To
По-задълбочено обяснение е дадено в следващите точки. Например, ако сте създали кеш в програмата си и ако кеш обектът е преживял много цикли на GC, той преминава в старото поколение. GC търси обекти, които вече не са необходими на програмата и ги унищожава.
Защо боклук?
Преди Java два от най-популярните езици бяха C и C ++. В C попаднахме на calloc (), malloc (), realloc (), който ще разпределя буферна памет, а в C ++ имаме разрушители. Всички тези функции са за функцията, наречена управление на паметта. Java предоставя Garbage collector като автоматично управление на паметта по основните две причини:
- Някои създадени обекти стават недостъпни
- Препратките от стари предмети към млади обекти съществуват само в малък брой.
Най-добрата практика за използване на колектор за боклук е да поставите знамена на JVM.
Позволете ми да ви дам пример за недостъпни обекти
//class code
int i = 1;
if(i == 1)(
String s = abc;
System.out.println(s);
)
//class code
В горния пример, Java ще създаде обект на низ и обхватът на този обект е точно в това, ако блокът не може да се използва отвън. По този начин, когато събирането на боклука преминава над този клас, той ще маркира 's' като недостъпен и неизползван обект и ще го изтрие.
Функции в колектора за боклук
- Марк: Започва от коренния възел на вашето приложение (основно), разхожда се по графиката на обекта, маркира обекти, които са достъпни като живот.
- Изтриване / Почистване: Изтриване на недостъпни обекти. Когато GC изтрива обекти, той създава дупка в грамада, което го прави непоследователен. По този начин се използва уплътняването.
- Уплътняване: Уплътнете паметта, като се движите около обектите и маркирате разпределението непрекъснато, отколкото фрагментирано. Това е отнемаща време задача.
Как работи Java Garbage Collector?
- Има два типа обект:
Живи обекти: Достъпни (референции от друг обект)
Мъртви обекти: недостъпни (не се споменават от никъде)
- Всички новосъздадени обекти са създадени в пространството на Едем (пространство на младо поколение).
- След като пространството на Eden се запълни, на пространство Young Young Generation се стартира програма minorGC (), която маркира всички неизползвани или мъртви обекти и ги изхвърля от паметта.
- Обектите, оцелели в този GC цикъл, ще бъдат преместени в Survivor From Space. Същият процес се повтаря и този път, когато обектите са преместени от пространството на Eden към Survivor От космоса, GC проверява дали е пълен, мъртвите обекти са освободени и оцелелите обекти ще бъдат преместени и в Survivor.
- Този процес се повтаря и ако някои обекти са преживели праг без GC цикли, тези обекти са преместени в Old Generation пространство.
- В този сценарий JVM изпълнява функцията majorGC (), която преминава през пълно пространство за купчина, идентифицира / маркира неизползвани (нулеви или мъртви) обекти и помества всички тези обекти.
- Не забравяйте, че метенето на предмети от купчината ще създаде дупки в паметта, причинявайки теч на паметта. За да се избегне такъв сценарий Garbage collector осъществява уплътняване на паметта
Примери за събиране на боклук в Java
Пример за system.gc ():
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();
)
)
изход:
обект
Обяснение на горния код
- В горния код двата обекта obj1 и obj2 сочат към null, така че се съхраняват в Eden пространство с нулеви и нереферирани стойности
- System gc () ще извика демонова нишка за събиране на боклука и двата обекта се изтриват от пространството.
Против и минуси
По-долу са някои плюсове и минуси на Java Garbage Collector, както следва:
Плюсове на gc:
- Събирането на боклук увеличава ефективността на паметта, тъй като ще изтрие всички неизползвани и нулеви обекти
- Събирането на боклук е автоматичен процес, така че разработчикът може да не се грижи за него, защото на други езици без програмист за събиране на боклук трябва да се грижи за неуловимия проблем с паметта.
Минуси от gc:
- Събирателят на боклука ще изпълнява главна gc функция, която ще се движи през цялото пространство на грамада, правейки вашата програма скоростта бавно с няколко секунди.
- Този процес ще отнеме повече време на процесора, което прави кодовата система по-бавна.
- Ако работите върху приложение, изискващо огромна памет, използвайте JVM флагчета.
- Ако пространството за купчина е пълно и обектите не могат да бъдат прекарани или добавени по-нататък, Java изхвърля грешка в паметта, което ще забави цялото приложение и също така може да причини течове на памет.
Препоръчителни статии
Това е ръководство за Какво е Java Garbage Collector ?. Тук обсъждаме нейната работа заедно с Функции, пример, плюсове и минуси на Java боклук. Можете също да разгледате следните статии, за да научите повече -
- Конструктор и деструктор в Java
- Destructor в Java
- C # срещу Java Performance
- Какво е JVM?