Java Portal | Программирование
12K subscribers
935 photos
69 videos
32 files
749 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Сборка мусора в 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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍75
В чем разница между SLEEP и WAIT в java?

Принадлежность

🔸sleep() — относится к классу Thread
🔸wait() — относится к классу 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()

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥32
Профилирование JDBC с помощью VisualVM

Читать подробнее

👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥2👍1
HashSet в Java

HashSet — это коллекция для хранения уникальных элементов без гарантии порядка. Относится к пакету java.util и реализует интерфейс Set, внутренне опираясь на HashMap.

Основные особенности Java HashSet:

🔹Дубликаты игнорируются. Если добавить элемент, который уже есть в множестве — ничего не произойдёт.
🔹Элементы не упорядочены ни по добавлению, ни по значению.
🔹Допускается один null-элемент.

Производительность: Базовые операции add, remove, contains выполняются за константное время O(1), при условии качественной хеш-функции.

Даже если дважды добавить строку "BMW" — в сете она появится только один раз.


Часто используемые операции:

add(E e) — добавляет элемент, если его ещё нет
remove(Object o) — удаляет элемент, если он есть
contains(Object o) — проверяет наличие элемента
size() — возвращает количество элементов
clear() — очищает сет

Как работает внутри

HashSet использует внутренний HashMap, где элементы сета хранятся как ключи, а значением выступает фиктивный объект. Это позволяет обеспечить уникальность и быстрый доступ.

При выводе содержимого HashSet — элементы отображаются в произвольном порядке.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍4
Чувак сделал минималистичный лаунчер для Minecraft для личного использования.

Теперь, когда кто-то из друзей спрашивает, какой лаунчер посоветуешь без вирусов — просто кидаю им свой :P


Ссылки на скачивание и исходники (если интересно, как такой написать):

🔹Скачать: https://github.com/sammwyy/MiniLaunch/releases
(Жми на ссылку с именем minilaunch.jar)

🔹Исходный код лаунчера на Java:
https://github.com/sammwyy/MiniLaunch

После скачивания просто дважды кликни по .jar, и всё готово

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4
JMH для микробенчмаркинга производительности:

JMH (Java Microbenchmark Harness) — это инструмент для измерения производительности небольших фрагментов кода, идеально подходит для оптимизации алгоритмов. В этом примере сравнивается простая цикл-реализация и использование Stream API.

→ JMH гарантирует точные и воспроизводимые тесты производительности
→ Используется для оптимизации критичных участков кода в продакшен-приложениях

👉 Java Portal
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62
Термины, которые действительно должен знать каждый разработчик

• Иммутабельность. Данные, которые нельзя изменить после создания — вместо этого при обновлении создаются новые копии.

• Чистые функции. Функции, которые при одинаковом входе всегда возвращают одинаковый результат и не имеют побочных эффектов.

• Побочные эффекты. Любое внешнее воздействие вне функции (например, логгирование, вызов API, изменение внешнего состояния).

• Референциальная прозрачность. Выражение можно заменить его значением без изменения поведения программы.

• Мутация состояния. Изменение значения переменной или объекта со временем — часто не приветствуется в функциональном программировании.

• Идемпотентность . Операция, которую можно выполнять многократно без изменения результата после первого применения.

• Декларативное программирование. Описание того, что нужно сделать, а не как это сделать (например, SQL, React, HTML).

• Императивное программирование. Пошаговые инструкции для выполнения задачи (например, циклы, условные операторы).

• Мемоизация. Кеширование результата функции, чтобы при повторных вызовах с теми же аргументами результат возвращался мгновенно.

• Когезия. Насколько чётко и логично связаны обязанности класса — высокая когезия = лучше дизайн.

• Тесная связанность. Классы чрезмерно зависят от внутренней реализации друг друга — изменения становятся рискованными.

• Утиная типизация. «Если выглядит как утка и крякает как утка — значит, это утка» — тип проверяется по поведению, а не по наследованию.

• Срезка объекта. При присваивании объекта производного класса объекту базового типа теряются дополнительные поля/методы — типичная ловушка в C++.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3👀21
Лучшие способы логировать SQL-запросы в Spring Boot

Читать подробнее

👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Учись алгоритмам программирования с этим ресурсом - код, пошаговое выполнение и наглядное представление.

Более 70 алгоритмов на JavaScript, Java и C++ - идеально для практики и понимания логики.

http://algorithm-visualizer.org

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍154
Коллекция диаграмм по софту и программированию от ByteByteGo

✓ Архитектуры и системный дизайн
✓ Объяснение API: REST, SOAP, gRPC, WebSockets
✓ Понимание Git, CI/CD, HTTP и не только

https://github.com/ByteByteGoHq/system-design-101

Идеально для подготовки к техническим интервью 😳

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2