Сборка мусора в JVM — всё, что нужно знать
1. Сборка мусора (GC) → Автоматическая очистка памяти
🔸 JVM автоматически освобождает память от недостижимых объектов.
🔸 Используется для избегания ручного управления памятью (например, неиспользуемые объекты List очищаются автоматически).
2. Heap → Основная область памяти для объектов
🔸 Здесь хранятся все объекты Java.
🔸 Делится на области: Young, Old и иногда Metaspace.
3. Молодое поколение (Young Generation) → Новые объекты (краткоживущие)
🔸 Большинство новых объектов создаются здесь.
🔸 Пример использования: String s = "abc" сначала попадает в эту область.
4. Старое поколение (Old Generation / Tenured) → Долгоживущие объекты
🔸 Объекты, пережившие несколько сборок мусора, перемещаются сюда.
🔸 Пример использования: кэшированные конфигурации, бины, живущие на протяжении всей жизни приложения.
5. Metaspace → Хранение метаданных классов (начиная с Java 8+)
🔸 Заменяет PermGen.
🔸 Хранит структуру классов, информацию о методах (например, User.class, List.class).
6. Minor GC → Очистка молодого поколения
🔸 Быстрая и частая.
🔸 Срабатывает, когда заполняется пространство Eden (например, при множестве краткоживущих запросов).
7. Major (Full) GC → Очистка старого поколения и Metaspace
🔸 Медленнее и реже.
🔸 Срабатывает, когда почти заполнено старое поколение (например, при больших графах объектов или утечках памяти).
8. Stop-the-World (STW) → Приостановка приложения во время GC
🔸 JVM замораживает все потоки на время GC.
🔸 Может вызывать задержки (например, при большой полной сборке мусора).
9. GC Roots → Точки отсчета для достижимости объектов
🔸 Включает ссылки из регистров, стэков потоков, загрузчиков классов.
🔸 GC отслеживает от них «живые» объекты (например, локальные переменные в методе main()).
Основные типы сборщиков мусора
10. Serial GC → Однопоточный сборщик
🔸 Простой, но останавливает всё приложение.
🔸 Используется для малых heaps (например, CLI-инструменты или тестовые приложения).
11. Parallel GC → Многопоточный сборщик
🔸 Ускоряет GC за счёт многопоточности.
🔸 Используется в приложениях с приоритетом на производительность (например, batch-задачи, нагруженные серверы).
12. CMS (Concurrent Mark Sweep) → Сборщик с низкими паузами (УСТАРЕЛ)
🔸 Работает в фоновом режиме с короткими паузами.
🔸 Использовался в приложениях, чувствительных к задержкам (например, веб-серверы).
13. G1 GC → Сбалансированный сборщик с низкими паузами (по умолчанию с Java 9+)
🔸 Делит heap на регионы; работает параллельно и конкурентно.
🔸 Отличный универсальный сборщик (например, для микросервисов, real-time API).
14. ZGC → Сборщик с ультранизкими паузами
🔸 Разработан для пауз в пределах миллисекунды.
🔸 Используется в системах реального времени с большим heap (например, финтех, игры).
15. Shenandoah → Сборщик с низкими паузами (RedHat/OpenJDK)
🔸 Конкурирует с ZGC.
🔸 Применяется в больших heaps с постоянными требованиями к задержкам.
👉 Java Portal
1. Сборка мусора (GC) → Автоматическая очистка памяти
2. Heap → Основная область памяти для объектов
3. Молодое поколение (Young Generation) → Новые объекты (краткоживущие)
4. Старое поколение (Old Generation / Tenured) → Долгоживущие объекты
5. Metaspace → Хранение метаданных классов (начиная с Java 8+)
6. Minor GC → Очистка молодого поколения
7. Major (Full) GC → Очистка старого поколения и Metaspace
8. Stop-the-World (STW) → Приостановка приложения во время GC
9. GC Roots → Точки отсчета для достижимости объектов
Основные типы сборщиков мусора
10. Serial GC → Однопоточный сборщик
11. Parallel GC → Многопоточный сборщик
12. CMS (Concurrent Mark Sweep) → Сборщик с низкими паузами (УСТАРЕЛ)
13. G1 GC → Сбалансированный сборщик с низкими паузами (по умолчанию с Java 9+)
14. ZGC → Сборщик с ультранизкими паузами
15. Shenandoah → Сборщик с низкими паузами (RedHat/OpenJDK)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5
В чем разница между SLEEP и WAIT в java?
Принадлежность
🔸
🔸
Назначение
🔸
🔸
Блокировка
🔸
🔸
Когда использовать
🔸
🔸
Нужен ли synchronized-блок?
🔸
🔸
Может быть прерван?
🔸
🔸
Когда возобновляется
🔸
🔸
Статический или экземплярный метод?
🔸
🔸
👉 Java Portal
Принадлежность
sleep()
— относится к классу Threadwait()
— относится к классу ObjectНазначение
sleep()
используется для приостановки потока на фиксированное времяwait()
используется для взаимодействия между потоками (межпоточная сигнализация)Блокировка
sleep()
не освобождает монитор (lock остаётся удержанным)wait()
освобождает монитор (lock)Когда использовать
sleep()
— когда нужно просто отложить выполнение потокаwait()
— когда один поток должен ожидать сигнал от другого потокаНужен ли synchronized-блок?
sleep()
— нетwait()
— да, должен вызываться внутри synchronized-блока или методаМожет быть прерван?
sleep()
— да, выбрасывает InterruptedException
wait()
— да, выбрасывает InterruptedException
Когда возобновляется
sleep()
— после указанного времениwait()
— после вызова notify()
/notifyAll()
или при прерыванииСтатический или экземплярный метод?
sleep()
— статический метод, вызывается как Thread.sleep()
wait()
— метод экземпляра, вызывается на объекте: obj.wait()
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3❤2
HashSet в Java
HashSet — это коллекция для хранения уникальных элементов без гарантии порядка. Относится к пакету java.util и реализует интерфейс Set, внутренне опираясь на HashMap.
Основные особенности Java HashSet:
🔹 Дубликаты игнорируются. Если добавить элемент, который уже есть в множестве — ничего не произойдёт.
🔹 Элементы не упорядочены ни по добавлению, ни по значению.
🔹 Допускается один null-элемент.
Производительность: Базовые операции
Часто используемые операции:
—
—
—
—
—
Как работает внутри
При выводе содержимого
👉 Java Portal
HashSet — это коллекция для хранения уникальных элементов без гарантии порядка. Относится к пакету java.util и реализует интерфейс Set, внутренне опираясь на HashMap.
Основные особенности Java HashSet:
Производительность: Базовые операции
add, remove, contains
выполняются за константное время O(1), при условии качественной хеш-функции.Даже если дважды добавить строку "BMW" — в сете она появится только один раз.
Часто используемые операции:
—
add(E e)
— добавляет элемент, если его ещё нет—
remove(Object o)
— удаляет элемент, если он есть—
contains(Object o)
— проверяет наличие элемента—
size()
— возвращает количество элементов—
clear()
— очищает сетКак работает внутри
HashSet
использует внутренний HashMap
, где элементы сета хранятся как ключи, а значением выступает фиктивный объект. Это позволяет обеспечить уникальность и быстрый доступ.При выводе содержимого
HashSet
— элементы отображаются в произвольном порядке.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍4
Чувак сделал минималистичный лаунчер для Minecraft для личного использования.
Ссылки на скачивание и исходники (если интересно, как такой написать):
🔹 Скачать: https://github.com/sammwyy/MiniLaunch/releases
(Жми на ссылку с именем
🔹 Исходный код лаунчера на Java:
https://github.com/sammwyy/MiniLaunch
После скачивания просто дважды кликни по .jar, и всё готово
👉 Java Portal
Теперь, когда кто-то из друзей спрашивает, какой лаунчер посоветуешь без вирусов — просто кидаю им свой :P
Ссылки на скачивание и исходники (если интересно, как такой написать):
(Жми на ссылку с именем
minilaunch.jar
)https://github.com/sammwyy/MiniLaunch
После скачивания просто дважды кликни по .jar, и всё готово
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
JMH для микробенчмаркинга производительности:
JMH (Java Microbenchmark Harness) — это инструмент для измерения производительности небольших фрагментов кода, идеально подходит для оптимизации алгоритмов. В этом примере сравнивается простая цикл-реализация и использование Stream API.
→ JMH гарантирует точные и воспроизводимые тесты производительности
→ Используется для оптимизации критичных участков кода в продакшен-приложениях
👉 Java Portal
JMH (Java Microbenchmark Harness) — это инструмент для измерения производительности небольших фрагментов кода, идеально подходит для оптимизации алгоритмов. В этом примере сравнивается простая цикл-реализация и использование Stream API.
→ JMH гарантирует точные и воспроизводимые тесты производительности
→ Используется для оптимизации критичных участков кода в продакшен-приложениях
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍2
Как работает HashMap в Java?
1. Внутреннее устройство – https://javarevisited.blogspot.com/2010/02/how-hashmap-works-in-java.html
2. Механика методов get и put – https://java67.com/2013/06/how-get-method-of-hashmap-or-hashtable-works-internally.html
👉 Java Portal
1. Внутреннее устройство – https://javarevisited.blogspot.com/2010/02/how-hashmap-works-in-java.html
2. Механика методов get и put – https://java67.com/2013/06/how-get-method-of-hashmap-or-hashtable-works-internally.html
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2
Термины, которые действительно должен знать каждый разработчик
• Иммутабельность. Данные, которые нельзя изменить после создания — вместо этого при обновлении создаются новые копии.
• Чистые функции. Функции, которые при одинаковом входе всегда возвращают одинаковый результат и не имеют побочных эффектов.
• Побочные эффекты. Любое внешнее воздействие вне функции (например, логгирование, вызов API, изменение внешнего состояния).
• Референциальная прозрачность. Выражение можно заменить его значением без изменения поведения программы.
• Мутация состояния. Изменение значения переменной или объекта со временем — часто не приветствуется в функциональном программировании.
• Идемпотентность . Операция, которую можно выполнять многократно без изменения результата после первого применения.
• Декларативное программирование. Описание того, что нужно сделать, а не как это сделать (например, SQL, React, HTML).
• Императивное программирование. Пошаговые инструкции для выполнения задачи (например, циклы, условные операторы).
• Мемоизация. Кеширование результата функции, чтобы при повторных вызовах с теми же аргументами результат возвращался мгновенно.
• Когезия. Насколько чётко и логично связаны обязанности класса — высокая когезия = лучше дизайн.
• Тесная связанность. Классы чрезмерно зависят от внутренней реализации друг друга — изменения становятся рискованными.
• Утиная типизация. «Если выглядит как утка и крякает как утка — значит, это утка» — тип проверяется по поведению, а не по наследованию.
• Срезка объекта. При присваивании объекта производного класса объекту базового типа теряются дополнительные поля/методы — типичная ловушка в C++.
👉 Java Portal
• Иммутабельность. Данные, которые нельзя изменить после создания — вместо этого при обновлении создаются новые копии.
• Чистые функции. Функции, которые при одинаковом входе всегда возвращают одинаковый результат и не имеют побочных эффектов.
• Побочные эффекты. Любое внешнее воздействие вне функции (например, логгирование, вызов API, изменение внешнего состояния).
• Референциальная прозрачность. Выражение можно заменить его значением без изменения поведения программы.
• Мутация состояния. Изменение значения переменной или объекта со временем — часто не приветствуется в функциональном программировании.
• Идемпотентность . Операция, которую можно выполнять многократно без изменения результата после первого применения.
• Декларативное программирование. Описание того, что нужно сделать, а не как это сделать (например, SQL, React, HTML).
• Императивное программирование. Пошаговые инструкции для выполнения задачи (например, циклы, условные операторы).
• Мемоизация. Кеширование результата функции, чтобы при повторных вызовах с теми же аргументами результат возвращался мгновенно.
• Когезия. Насколько чётко и логично связаны обязанности класса — высокая когезия = лучше дизайн.
• Тесная связанность. Классы чрезмерно зависят от внутренней реализации друг друга — изменения становятся рискованными.
• Утиная типизация. «Если выглядит как утка и крякает как утка — значит, это утка» — тип проверяется по поведению, а не по наследованию.
• Срезка объекта. При присваивании объекта производного класса объекту базового типа теряются дополнительные поля/методы — типичная ловушка в C++.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3👀2❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Учись алгоритмам программирования с этим ресурсом - код, пошаговое выполнение и наглядное представление.
Более 70 алгоритмов на JavaScript, Java и C++ - идеально для практики и понимания логики.
→ http://algorithm-visualizer.org
👉 Java Portal
Более 70 алгоритмов на JavaScript, Java и C++ - идеально для практики и понимания логики.
→ http://algorithm-visualizer.org
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤4
Коллекция диаграмм по софту и программированию от ByteByteGo
✓ Архитектуры и системный дизайн
✓ Объяснение API: REST, SOAP, gRPC, WebSockets
✓ Понимание Git, CI/CD, HTTP и не только
→ https://github.com/ByteByteGoHq/system-design-101
Идеально для подготовки к техническим интервью😳
👉 Java Portal
✓ Архитектуры и системный дизайн
✓ Объяснение API: REST, SOAP, gRPC, WebSockets
✓ Понимание Git, CI/CD, HTTP и не только
→ https://github.com/ByteByteGoHq/system-design-101
Идеально для подготовки к техническим интервью
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2