what is garbage collection java
Цей посібник пояснює, що таке збір сміття в Java та як працює збірник сміття. Ви також дізнаєтесь про алгоритми збору сміття:
Читачі, які добре знають C / C ++, повинні усвідомлювати, що програміст несе відповідальність за створення та видалення об’єктів у C / C ++.
Серйозні помилки виникають, якщо програміст забуде знищити створені об'єкти. Це тому, що якщо не зруйнувати об’єкти, це може спричинити “ Недостатньо помяті ”Помилки, витоки пам’яті тощо.
Ця ситуація повністю усунена на Java, оскільки програмісту не потрібно вести відстеження об’єктів. Java піклується про знищення об’єктів за допомогою автоматичного збору сміття.
=> Завітайте сюди, щоб вивчити Java з нуля.
Процес, за допомогою якого об’єкти, які вже не використовуються, видаляються з кучи, називається “Збір сміття”. Техніка збору сміття є частиною управління пам’яттю в Java.
Таким чином, на Java смітник збирає всі об'єкти, які вже не використовуються.
Що ви дізнаєтесь:
- Що таке збирач сміття в Java?
- Як працює збір сміття на Java?
- Алгоритми збору сміття на Java
- Висновок
Що таке збирач сміття в Java?
Збір сміття в Java управляється програмою під назвою Garbage Collector.
Garbage Collector можна визначити як програму, яка використовується для автоматичного управління пам’яттю шляхом обробки де-розподілу об’єкта.
Ми знаємо, що мовою Java нові об’єкти створюються та виділяються в пам’ять за допомогою нового оператора. Пам'ять, виділена об'єкту за допомогою нового оператора, залишається виділеною, поки посилання не використовують цей об'єкт.
Як тільки посилання перестають існувати, пам'ять, яку займає об'єкт, відновлюється. Потім Java автоматично обробляє видалення або знищення об’єктів, і нам не потрібно явно знищувати об’єкт.
Цей прийом є методом збору сміття на Java, коли програмістам не потрібно явно обробляти вивільнення об’єктів.
Зауважте, що якщо програми не розподіляють пам’ять, коли об’єкти в ній не потрібні, то з часом пам’яті для виділення не залишиться, і програми вийдуть з ладу. Ця ситуація називається витоком пам'яті.
Смітник завжди працює у фоновому режимі на потоці демона. Смітник вважається найкращим прикладом потоку демона.
Garbage Collector працює, маючи намір звільнити пам’ять купи. Це робиться шляхом знищення «недосяжних» об’єктів.
Що таке 'недосяжний' об'єкт?
Об’єкт стає недосяжним, коли з ним не пов’язано навіть жодного посилання.
Розглянемо наступний фрагмент коду:
Integer ref_obj = new Integer (5); //ref_obj is a reference to Integer ref_obj = null; //Integer object now becomes unreachable
Як видно з наведеного коду, об’єкт доступний, доки з ним пов’язане посилання. У той момент, коли посилання на посилання видаляється (посилання на параметр має значення null у наведеному вище випадку), об’єкт стає недоступним.
Коли об’єкт стає недосяжним, він стає придатним для збору сміття (GC).
Як ми можемо зробити об’єкт придатним для GC?
Хоча програміст не зобов'язаний знищувати об'єкти, оскільки ними опікується GC, принаймні програміст може зробити ці об'єкти недоступними, коли вони більше не потрібні.
Роблячи це, GC збиратиме недосяжні предмети та знищуватиме їх.
Є кілька способів зробити об’єкт придатним для GC, зробивши його недоступним.
Вони є:
# 1) Зніміть посилання
Враховуючи посилання, присвоєне об’єкту, якщо цей об’єкт більше не потрібен, присвоюйте посилання нулю.
Student s = new Student (); s = null;
Коли для s встановлено значення null, об'єкт Student стає недоступним.
# 2) Перепризначити Посилання
Це ще один спосіб зробити об’єкти придатними для GC.
Розглянемо наступний код.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2;
Тепер, коли ми призначили s1 іншому об'єкту, об'єкт Студента, на який посилається s1, розмежовується.
# 3) Створіть анонімний об’єкт
Створюючи анонімний об’єкт, ми можемо зробити об’єкти придатними для GC.
Ми можемо створити анонімний об’єкт, як показано нижче:
new Student();
Після того, як ми зробимо об’єкти придатними для GC, ці об’єкти можуть або не можуть бути знищені негайно GC. Це тому, що ми не можемо явно змусити GC виконувати як і коли ми хочемо.
Коли працює Сміттєзбірник?
Запустити програму Garbage Collector залежить від JVM. Коли JVM запускає збирач сміття, недосяжні об’єкти руйнуються. Але все ж ми не можемо гарантувати, коли JVM буде працювати.
Незважаючи на те, що ми не можемо змусити GC виконати, ми можемо запросити збір сміття.
GC можна запитати, використовуючи будь-який з наступних методів.
# 1) System.gc (): Клас System Java забезпечує статичний метод gc (), за допомогою якого ми можемо запитувати JVM для запуску Garbage Collector.
# 2) Runtime.getRuntime (). Gc (): Як і System.gc (), ми також можемо використовувати метод gc () класу “Runtime class”, щоб подати запит на JVM для запуску Garbage Collector.
Примітка: Немає жодних гарантій того, що Колектор сміття буде працювати після запиту цих двох методів.
Доопрацювання
Доопрацювання виконується Garbage Collector безпосередньо перед знищенням об’єктів. Як частина техніки фіналізації, Смітник збирає метод finalize () на об'єкті. Метод finalize () використовується для виконання операцій з очищення.
Метод finalize () надається класом “Object” і має такий прототип.
protected void finalize () throws Throwable
Метод finalize () викликається щоразу, коли об’єкт збирається сміттям
Примітка: Збирач сміття збирає лише об’єкти, створені за допомогою нового ключового слова. Для інших об’єктів ми повинні використовувати метод finalize () для виконання очищення.
У наведеній нижче програмі показано простий збір сміття на Java.
class TestGC{ @Override // finalize method: called on object once // before garbage collecting it protected void finalize() throws Throwable { System.out.println('Garbage collector called'); System.out.println('Object garbage collected : ' + this); } } class Main{ public static void main(String args()){ TestGC gc1=new TestGC(); TestGC gc2=new TestGC(); gc1 = null; //nullify gc1 System.gc(); //request for GC to run gc2 = null; //nullify gc2 Runtime.getRuntime().gc(); //request for GC to run } }
Вихідні дані
У наведеній вище програмі ми створили клас TestGC. У цьому класі ми перевизначили метод finalize (). Тоді в основному класі ми створюємо два об’єкти класу TestGC. По-перше, ми обнуляємо об'єкт і викликаємо System.gc () для запиту збирача сміття.
Далі ми зводимо нанівець другий об’єкт і викликаємо метод Runtime.getRuntime.gc () для запиту збирача сміття. Вихідні дані два рази показують висновок методу завершення, вказуючи тим, що Сміттєвий збірник працював двічі.
Примітка: Хоча ми отримали цей результат, не гарантуємо, що кожного разу ми отримаємо однаковий результат. Це повністю залежить від JVM.
Як працює збір сміття на Java?
У цьому розділі ми побачимо, як збір сміття працює на Java.
Під час збору сміття Смітник шукає пам’ять купи, а потім «позначає» недосяжні об’єкти. Потім це їх знищує.
Але проблема виникає, коли кількість об’єктів збільшується. У міру збільшення об’єктів час, необхідний для збору сміття, також збільшується, оскільки він шукає недосяжні об’єкти. Однак це не впливає занадто сильно, оскільки більшість об’єктів мають короткий термін життя.
Викликається поведінка вище «Генеральний збір сміття» і повинен покращити продуктивність JVM. У цьому підході весь простір купи поділяється на - молоде покоління, старе або постійне покоління та постійне покоління.
# 1) Простір купи молодого покоління: У цьому просторі створюються всі нові об’єкти. Після того, як простір заповниться, відбувається Малий ЖК, в якому всі мертві предмети знищуються. Незначний процес ГХ швидкий і швидкий, оскільки більшість предметів мертві. Предмети, що пережили молоде покоління, переносяться до старших поколінь.
# 2) Простір купи старого покоління: Це покоління зберігає предмети, які виживають довго. Коли досягнуто пороговий вік, встановлений для молодого покоління, об’єкт переміщується до старого покоління. Коли заповнюється простір старого покоління, виконується основний GC.
Основні GC повільні, оскільки об'єкти, що беруть участь тут, є живими. Іноді очищається весь простір купи, що включає молоді, а також старі покоління. Це називається “Повний ГХ”.
# 3) Постійне поколінняL До Java 7 раніше існувало постійне покоління (Пермське покоління). JVM використовувала метадані, що містяться у Пермі. JVM використовував ці метадані для опису класів та методів, що використовуються в додатку. Пермська генеральна генерація була вилучена в Java 8.
Збір сміття Java 8: Пермський генерал та метапростір
Ми вже згадували про простір Пермського покоління, який був присутній до Java 7. Однак зараз у Java 8 JVM представляє метадані класу з використанням власної пам'яті під назвою 'Метапростір'.
Окрім Metaspace, є новий прапор під назвою “MaxMetaspaceSize”, який обмежує пам’ять, що використовується для метаданих класу. Якщо для MaxMetaspaceSize не вказано значення, тоді Metaspace змінює його розмір під час виконання відповідно до вимог програми.
Коли простір метаданих класу досягає MaxMetaspaceSize, спрацьовує MetaCpace GC. Коли надмірна кількість MetaCpace GC, це свідчить про витік пам'яті класів, завантажувачів класів тощо, а також про неадекватний розмір.
Алгоритми збору сміття на Java
Збір сміття здійснюється різними способами. У цьому розділі ми представимо чотири таких способи або алгоритми збору сміття на Java.
Серійний GC
Серійний GC - найпростіший алгоритм GC. В основному це працює на невеликих розмірах купи та однопоточних системах. Під час роботи Serial GC заморожує всі програми.
Щоб увімкнути Serial GC, ми можемо скористатися наступним варіантом JVM.
функціональне тестування та нефункціональне тестування
java –xx:+UseSerialGC –jar Application.java
Вищезазначену команду можна ввести в командному рядку. Тут Application.java - це файл, для якого слід увімкнути послідовний GC.
Пропускна здатність / паралельний ГХ
АЛГОРИТМ паралельного GC є типовим в JDK 8. Цей алгоритм використовує кілька потоків для сканування простору купи та ущільнення. Цей алгоритм підходить здебільшого для програм, які можуть обробляти паузи в потоці та оптимізувати накладні витрати на процесор.
Одним недоліком паралельного GC є те, що під час виконання незначного або повного GC алгоритм призупиняє потоки програми.
Колектор CMS
CMS означає ' Одночасна розгортка Марка '. Цей алгоритм використовує кратність одночасний потоки для сканування купи ( позначка ) для виявлення невикористаних об’єктів та переробки ( підмітати ) їх. Колектор CMS має режим Stop-The-World (STW).
Колектор переходить у цей режим у двох сценаріях:
- Коли до об’єктів, що належать до старого покоління, можна дістатись зі статичних змінних або точок входу потоку. Отже, цей режим увімкнено під час ініціалізації початкових позначок кореня.
- Коли алгоритм працює одночасно, програма змінює стан і змушує колектор повернутися назад, щоб переконатися, що правильні об'єкти позначені.
Однак колектор CMS може постраждати від 'невдалих просування'. Отже, що таке рекламний провал? Якщо об’єкти з простору молодого покоління переміщуються до старого покоління, а колектор не випустив достатньо місця для цих об’єктів у купі старого покоління, тоді відбудеться рекламний збій.
Щоб запобігти рекламним помилкам, ми можемо надати більше фонових потоків колектору або надати більший розмір купи старому поколінню.
Колектор G1
Колектор G1 є колектором “Сміття спочатку”. Він призначений для купи розміром більше 4 Гб. Залежно від розміру купи, він ділить розмір купи на регіони розміром від 1 МБ до 32 МБ.
Колектор G1 позначає предмети залежно від жвавості предметів по всій купі. Після цієї фази маркування G1 знає про порожні регіони. Таким чином він збирає недосяжні об'єкти з цих регіонів, звільняючи тим самим велику кількість простору. Тому його називають Garbage-First, оскільки він першим збирає регіони, що містять сміття.
Він також відповідає визначеному користувачем цільовому часу паузи, використовуючи модель прогнозування паузи, вибираючи кількість областей для збору залежно від зазначеного цільового часу паузи.
Перевага збору сміття
- «Збір сміття» робить управління пам’яттю в Java ефективною, оскільки видаляє об’єкти, на які не посилаються, з купи пам’яті без втручання програміста.
- Оскільки збір сміття відбувається автоматично і є частиною JVM, додаткові зусилля програмісту не потрібні для відновлення пам’яті чи руйнування об’єктів.
- Програмісту не потрібно писати будь-який конкретний код для де-розподілу пам'яті та видалення об'єктів, як це зроблено в C / C ++.
Часті запитання
Q # 1) Яка роль збирача сміття?
Відповідь: На Java смітник є головною стороною в управлінні пам’яттю, і йому доручається збирати недосяжні об’єкти та повертати пам’ять.
Q # 2) Що ви маєте на увазі під вивозом сміття?
Відповідь: Збір сміття - це техніка, за допомогою якої пам’ять управляється автоматично, повертаючи невикористану пам’ять. Ця функція присутня в таких мовах програмування, як Java, завдяки чому програмістам не потрібно відстежувати невикористані об’єкти та знищувати їх. Це робиться автоматично за допомогою збору сміття.
Q # 3) Хто відповідає за збір сміття на Java?
Відповідь: Управління пам'яттю Java відповідає за збір сміття.
Q # 4) Як ми можемо запобігти збору сміття на Java?
Відповідь: Оскільки Колекціонер сміття не відновлює пам’ять живих змінних / об’єктів, найкращий спосіб запобігти Збору сміття - продовжувати використовувати змінні / об’єкти у всій програмі.
Q # 5) Як ви можете переконатися, що об’єкт збирається сміттям?
Відповідь: Об’єкт придатний для збору сміття, коли він недосяжний, тобто коли більше немає посилань, що посилаються на об’єкт. Хоча ми не можемо змусити колектор сміття запускатись коли завгодно, ми завжди можемо попросити його запустити за допомогою System.gc ().
Висновок
Збір сміття на Java, про який ми говорили в цьому посібнику, є автоматичним, і програмісту не потрібно турбуватися про видалення об’єктів або змінних, виділених у програмі.
Автоматичний збір сміття на Java - найважливіша особливість мови і є частиною управління пам’яттю на Java.
Незважаючи на те, що Збір сміття виконується JVM і знаходиться поза зоною доступності програміста, ми завжди можемо попросити Garbage Collector запуститись за допомогою методу gc () для класу System і Runtime.
У цьому посібнику ми обговорили процес завершення, який виконується до того, як об’єкти будуть знищені Garbage Collector. Ми також обговорили процес збору сміття на Java. Нарешті, ми обговорили різні алгоритми, які використовуються збирачем сміття.
На цьому наша дискусія про збирач сміття на Java завершена.
=> Тут слідкуйте за простими навчальними серіями Java.
Рекомендована література
- Основи Java: Синтаксис Java, клас Java та основні концепції Java
- Для чого використовується Java: 12 реальних програм Java
- Підручник із рядків Java | Рядові методи Java на прикладах
- Підручник JAVA для початківців: 100+ практичних відео-підручників Java
- Компоненти Java: платформа Java, JDK, JRE та віртуальна машина Java
- Розгортання Java: Створення та виконання файлу JAR Java
- Віртуальна машина Java: як JVM допомагає у запуску програми Java
- Підручник з роздумів про Java з прикладами