Знакомимся с 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). Для этого требуется, чтобы элементы имели некоторый механизм сравнения, либо со сравнением, либо с компаратором. Порядок итераций определяется этим механизмом.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ