Знайомимося з ZGC, найновішим збирачем сміття JDK
Джерело: Inside Java ZGC або Z Garbage Collector - це найсучасніший збирач сміття в JDK. Спочатку він з'явився у JDK 11 у вигляді експериментальної функції. Продакшн-функцією ZGC став у JDK 15 після затвердження покращення JEP 377. У цій статті ми розглянемо цілі та перспективи ZGC.Огляд ZGC
ZGC розроблений як масштабований збирач сміття з малою затримкою. Максимальний час паузи під час роботи ZGC рідко перевищує 250 мікросекунд, Так, саме мікросекунд, із середнім часом паузи до десятків мікросекунд. ZGC має високу масштабованість: мінімальний розмір купи становить від 8 МБ до 16 ТБ. Важливо, що час паузи не збільшується з розміром купи. Таким чином, навіть із купою розміром у кілька терабайт час паузи все одно вимірюватиметься в мікросекундах. Хоча ZGC забезпечує малу затримку та високу масштабованість, це відбувається за рахунок пропускної спроможності, яка приблизно на 10% нижча порівняно з G1. Конкретне зниження пропускної спроможності залежить від дизайну програми, архітектури системи та потреб бізнесу.Використання ZGC
Оскільки починаючи з JDK 9 збирачем сміття за умовчанням призначено G1, для використання ZGC вам знадобиться установка прапора VM -XX:+UseZGC. При використанні ZGC найважливішою конфігурацією є встановлення максимального розміру купи -Xmx. Розмір купи повинен бути досить великим, щоб справлятися з live-set вашої програми. Також він повинен мати додатковий резерв для виконання складання сміття. Чим більше доступного місця в купі, тим рідше потрібно виконувати складання сміття. Але майте на увазі, що це має бути збалансовано з використанням пам'яті.Подальший розвиток ZGC
З моменту свого випуску як виробнича функція в JDK 15 ZGC продовжує активно розвиватися. З виходом JDK 16 в ньому з'явилася паралельна обробка стека потоків (JEP 376), а в JDK 18 як додаткова функція додана дедуплікація рядків. У перспективі планується, що ZGC стане мультипоколінським (multi-generational), хоча конкретні терміни впровадження цього покращення ще не встановлені.Додаткова інформація про ZDC
- JEP 377
- JEP 376
- ZGC - Майбутнє складання сміття з малою затримкою вже настало
- Офіційна документація з ZGC
У чому різниця між HashMap, LinkedHashMap та TreeMap у Java
Джерело: Rrtutors Якщо ви хочете зберігати пари ключ-значення (key-value) у програмі Java, то колекції Java пропонують для цього безліч варіантів залежно від ваших потреб. До них відносяться LinkedHashmap , HashMap і TreeMap . Ключові відмінності між цими трьома класами полягають у їх внутрішній реалізації та специфіці застосування у певних випадках.Відмінності між HashMap, LinkedHashMap і TreeMap в Java
Ось основні відмінності між трьома згаданими класами, засновані на реалізації, упорядкуванні, сортуванні та підтримці нульових ключів та значень.Реалізація
І HashMap , і LinkedHashMap реалізують інтерфейс Map , тоді як TreeMap реалізує інтерфейси Map , NavigableMap та vSortedMap. LinkedHashMap реалізований як кошик зі списком з подвійним зв'язком (double-linked list bucket), HashMap реалізований як хеш-таблиця, а TreeMap реалізований за деревоподібним принципом.Замовлення та сортування
-
HashMap не дає жодних гарантій щодо порядку ітерацій. Однак він може повністю змінюватись при додаванні нових елементів.
-
LinkedHashMap буде виконувати ітерацію в порядку, в якому записи були поміщені в карту.
-
TreeMap виконує ітерацію відповідно до "природного порядку" ключів відповідно до їх методу compareTo() (або зовнішнім Comparator). Також він реалізує інтерфейс SortedMap , який містить методи, що залежать від порядку сортування.
Нульові ключі та значення
HashMaps та LinkedHashMap підтримують нульові значення, а також ключові значення, у той час як TreeMap не підтримують нульові значення, оскільки вони підтримують природні типи елементів. Для наочного прикладу давайте створимо HashMap , LinkedHashMap та TreeMap .import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
public class HashMap_LinkedHashMap_TreeMap {
public static void main(String[] args) {
Map Treemapu = new TreeMap();
Treemapu.put("First", "Java");
Treemapu.put("Second", "Python");
System.out.println("TreeMap values are: \n" + Treemapu);
Map Hashimapu = new HashMap();
Hashimapu.put("First", "Java");
Hashimapu.put("Second", "Python");
System.out.println("HashMap Values are: \n" + Hashimapu);
Map LinkedHashiMapu = new LinkedHashMap();
LinkedHashiMapu.put("First", "Java");
LinkedHashiMapu.put("Second", "Python");
System.out.println("LinkedHashMap values are: \n" + LinkedHashiMapu);
}
}
На виході отримаємо:
-
HashMap — це карта, яка базується на хешуванні ключів. Він підтримує операції O(1) get/put. Ключі повинні мати послідовні реалізації hashCode() та equals() .
-
LinkedHashMap дуже схожий на HashMap , але він має порядок, яким елементи додаються (або доступні), тому порядок ітерації збігається з порядком розміщення (або порядком доступу, залежно від параметрів конструкції).
-
TreeMap – це відображення за принципом дерева. Його операції put/get приймають час O (log n). Для цього потрібно, щоб елементи мали деякий механізм порівняння або з порівнянням або з компаратором. Порядок ітерацій визначається цим механізмом.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ