Java: если нужно писать переносы строк, соответствующие ОС, используй
👉 Java Portal
System.lineSeparator().Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
@ComponentScan аккуратно, чтобы не сканировать целые пакеты по ошибке.Предположим, вы используете что-то вроде
@ComponentScan("com.mycompany"):Лучшие практики:
@SpringBootApplication
public class MyApplication { }
По умолчанию сканируются только подпакеты пакета, где находится MyApplication
@ComponentScan({
"com.mycompany.myapp.product",
"com.mycompany.myapp.order"
})Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Основные области памяти JVM:
▪️ Heap (куча)
Общая для потоков
Хранит объекты и экземпляры, управляется сборщиком мусора
▪️ Method Area (область методов)
Общая для потоков
Метаданные классов, статические переменные, байткод
▪️ Runtime Constant Pool (пул констант времени выполнения)
На класс, разделяется
Строковые литералы, ссылки на методы, константы
▪️ JVM Stack (стек JVM)
На поток
Фреймы вызовов, локальные переменные, адреса возврата
▪️ Native Stack (нативный стек)
На поток
Выполнение нативного кода через JNI
▪️ Program Counter (PC регистр)
На поток
Текущая инструкция, которую выполняет поток
▪️ Code Cache (кэш кода)
Общий
Машинный код после JIT-компиляции
▪️ Direct Memory (off-heap)
Общая
Память вне кучи для высокопроизводительного ввода-вывода
Разбиение кучи:
▪️ Eden
Новые объекты создаются здесь
▪️ Survivor
Краткоживущие объекты перед продвижением
▪️ Old Generation
Долгоживущие объекты
👉 Java Portal
Общая для потоков
Хранит объекты и экземпляры, управляется сборщиком мусора
Общая для потоков
Метаданные классов, статические переменные, байткод
На класс, разделяется
Строковые литералы, ссылки на методы, константы
На поток
Фреймы вызовов, локальные переменные, адреса возврата
На поток
Выполнение нативного кода через JNI
На поток
Текущая инструкция, которую выполняет поток
Общий
Машинный код после JIT-компиляции
Общая
Память вне кучи для высокопроизводительного ввода-вывода
Разбиение кучи:
Новые объекты создаются здесь
Краткоживущие объекты перед продвижением
Долгоживущие объекты
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Совет по Java: избегайте глубокой вложенности if-else — используйте guard clauses (ранний выход)
Одна из частых проблем в Java-коде — сильно вложенные условия. Формально код работает, но его сложно читать и поддерживать.
✗ Плохо: вложенные if-else
* сложно читать
* логика размазана
* любое изменение усложняет код
✓ Хорошо: guard clauses (ранний выход)
* проверки сразу отсекают невалидные состояния
* основной сценарий читается сверху вниз
* код короче и понятнее
Почему guard clauses — профессиональный подход:
* снижают когнитивную нагрузку
* делают бизнес-логику очевидной
* упрощают рефакторинг и тестирование
* хорошо сочетаются с fail-fast подходом
Правило простое:
если условие — это ошибка или отклонение от нормального потока, проверяйте его сразу и выходите из метода.
В результате код становится:
* линейным
* предсказуемым
* удобным для поддержки
На уровне синтаксиса это мелочь, но на уровне качества кода разница существенная.
👉 Java Portal
Одна из частых проблем в Java-коде — сильно вложенные условия. Формально код работает, но его сложно читать и поддерживать.
✗ Плохо: вложенные if-else
* сложно читать
* логика размазана
* любое изменение усложняет код
✓ Хорошо: guard clauses (ранний выход)
* проверки сразу отсекают невалидные состояния
* основной сценарий читается сверху вниз
* код короче и понятнее
Почему guard clauses — профессиональный подход:
* снижают когнитивную нагрузку
* делают бизнес-логику очевидной
* упрощают рефакторинг и тестирование
* хорошо сочетаются с fail-fast подходом
Правило простое:
если условие — это ошибка или отклонение от нормального потока, проверяйте его сразу и выходите из метода.
В результате код становится:
* линейным
* предсказуемым
* удобным для поддержки
На уровне синтаксиса это мелочь, но на уровне качества кода разница существенная.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤4
Совет по Java: удаляйте неиспользуемые импорты и переменные — это улучшает читаемость кода.
До:
После:
#Java #CleanCode
👉 Java Portal
До:
import java.util.Date; // неиспользуемый импорт
import java.util.Scanner;
public class Greeting {
private int age; // неиспользуемая переменная
public void sayHello() {
Scanner sc = new Scanner(System.in);
System.out.println("Hello, world!");
sc.close();
}
}
После:
import java.util.Scanner;
public class Greeting {
public void sayHello() {
Scanner sc = new Scanner(System.in);
System.out.println("Hello, world!");
sc.close();
}
}
#Java #CleanCode
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Spring Boot: можно обрабатывать CORS глобально через WebMvcConfigurer
CORS — это механизм, который позволяет веб-приложению на одном домене (origin) получать доступ к ресурсам с другого домена.
👉 Java Portal
CORS — это механизм, который позволяет веб-приложению на одном домене (origin) получать доступ к ресурсам с другого домена.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3❤2
SOLID в Java: принцип подстановки Лисков (LSP) утверждает:
==> Объекты базового класса должны заменяться объектами подклассов без проблем.
× Плохой пример
* Есть класс Vehicle с методом startEngine().
* Наследуемся в Bicycle, но… у велосипеда нет двигателя, и метод выбрасывает исключение.
Такая иерархия:
* Любой тест, который ожидает, что любой Vehicle сможет запустить двигатель, падает.
* Подкласс ведёт себя иначе, чем базовый класс — LSP нарушен.
✓ Как исправить
Разделить ответственность через интерфейсы:
Теперь только те объекты, которым действительно нужен двигатель, реализуют Motorized.
* Подклассы не должны ломать ожидания, заданные базовым классом
* Поведение лучше разделять, чем «затыкать» методы исключениями
* LSP делает код предсказуемым и безопасным для расширения
👉 Java Portal
==> Объекты базового класса должны заменяться объектами подклассов без проблем.
× Плохой пример
* Есть класс Vehicle с методом startEngine().
* Наследуемся в Bicycle, но… у велосипеда нет двигателя, и метод выбрасывает исключение.
Такая иерархия:
class Vehicle {
public void startEngine() { ... }
}
class Bicycle extends Vehicle {
@Override
public void startEngine() {
throw new UnsupportedOperationException("Bicycles don't have engines!");
}
}* Любой тест, который ожидает, что любой Vehicle сможет запустить двигатель, падает.
* Подкласс ведёт себя иначе, чем базовый класс — LSP нарушен.
✓ Как исправить
Разделить ответственность через интерфейсы:
interface Vehicle {}
interface Motorized {
void startEngine();
}
class Car implements Vehicle, Motorized {
public void startEngine() { ... }
}
class Bicycle implements Vehicle {
// без двигателя — всё корректно
}Теперь только те объекты, которым действительно нужен двигатель, реализуют Motorized.
* Подклассы не должны ломать ожидания, заданные базовым классом
* Поведение лучше разделять, чем «затыкать» методы исключениями
* LSP делает код предсказуемым и безопасным для расширения
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Кто-то выложил в опенсорс инструмент, который парсит бизнесы из Google Maps по всему миру.
Название, адрес, телефон, сайт, отзывы, часы работы — всё собирается. Достаточно ввести поисковый запрос, и он выгружает данные в CSV.
Проект на 100% с открытым исходным кодом.
👉 Java Portal
Название, адрес, телефон, сайт, отзывы, часы работы — всё собирается. Достаточно ввести поисковый запрос, и он выгружает данные в CSV.
Проект на 100% с открытым исходным кодом.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
System Design Cheat Sheet — 15 ключевых концепций
1. Сбор требований
* Определить функциональные и нефункциональные требования
* Описать пользовательские сценарии и воркфлоу
* Расставить приоритеты по бизнес-целям
* Зафиксировать зависимости и ограничения
2. Архитектура системы
* Определить компоненты системы и их взаимодействие
* Выбрать подходящие архитектурные паттерны и стиль
* Оптимизировать под масштабируемость и поддерживаемость
* Оценить трейд-оффы между монолитом и распределённой системой
3. Дизайн данных
* Спроектировать модели данных, схемы и связи
* Выбрать подходящую БД под масштаб и консистентность
* Определить политики хранения, бэкапы и архивирование
* Использовать нормализацию и денормализацию по необходимости
4. Доменная модель
* Разбить систему на бизнес-домены
* Инкапсулировать функциональность внутри доменных модулей
* Минимизировать междоменные зависимости
* Обеспечить владение данными внутри доменов
5. Масштабируемость
* Реализовать горизонтальное и вертикальное масштабирование
* Использовать балансировку нагрузки
* Оптимизировать партиционирование и шардинг
* Планировать автоскейлинг под пики нагрузки
6. Надёжность
* Проектировать отказоустойчивость и деградацию
* Настроить мониторинг, алерты и логирование
* Реализовать бэкапы и восстановление
* Использовать ретраи, circuit breaker и таймауты
7. Доступность
* Реплицировать данные между узлами
* Минимизировать даунтайм через failover
* Определить планы восстановления (RTO/RPO)
* Регулярно тестировать под нагрузкой
8. Производительность
* Оптимизировать задержки и пропускную способность
* Использовать кэширование для горячих данных
* Оптимизировать алгоритмы и запросы
* Применять сжатие для передачи данных
9. Безопасность
* Реализовать аутентификацию и авторизацию
* Шифровать данные в покое и при передаче
* Проводить сканирование уязвимостей и аудиты
* Защищать API и эндпоинты от атак
10. Поддерживаемость
* Писать модульный, читаемый и документированный код
* Автоматизировать деплой и версионирование
* Проектировать систему без ломания фич при росте
* Использовать CI/CD пайплайны
11. Тестирование
* Покрывать юнит-, интеграционные и e2e-тесты
* Проводить нагрузочное тестирование
* Валидировать API и корректность данных
* Проверять безопасность и соответствие требованиям
12. Пользовательский опыт
* Делать понятный и отзывчивый интерфейс
* Оптимизировать пользовательские сценарии
* Проводить юзабилити-тестирование
* Учитывать доступность
13. Оценка стоимости
* Считать инфраструктурные затраты
* Учитывать лицензии, масштабирование и операционные расходы
* Оптимизировать использование облачных ресурсов
* Закладывать бюджет на отказоустойчивость
14. Документация
* Поддерживать актуальные техдоки и архитектуру
* Писать API-справочники и руководства
* Использовать диаграммы
* Хранить всё с версионированием
15. План миграции
* Проверить совместимость старой и новой системы
* Составить пошаговую стратегию
* Прогнать миграцию на стенде
* Проверить целостность данных после переноса
👉 Java Portal
1. Сбор требований
* Определить функциональные и нефункциональные требования
* Описать пользовательские сценарии и воркфлоу
* Расставить приоритеты по бизнес-целям
* Зафиксировать зависимости и ограничения
2. Архитектура системы
* Определить компоненты системы и их взаимодействие
* Выбрать подходящие архитектурные паттерны и стиль
* Оптимизировать под масштабируемость и поддерживаемость
* Оценить трейд-оффы между монолитом и распределённой системой
3. Дизайн данных
* Спроектировать модели данных, схемы и связи
* Выбрать подходящую БД под масштаб и консистентность
* Определить политики хранения, бэкапы и архивирование
* Использовать нормализацию и денормализацию по необходимости
4. Доменная модель
* Разбить систему на бизнес-домены
* Инкапсулировать функциональность внутри доменных модулей
* Минимизировать междоменные зависимости
* Обеспечить владение данными внутри доменов
5. Масштабируемость
* Реализовать горизонтальное и вертикальное масштабирование
* Использовать балансировку нагрузки
* Оптимизировать партиционирование и шардинг
* Планировать автоскейлинг под пики нагрузки
6. Надёжность
* Проектировать отказоустойчивость и деградацию
* Настроить мониторинг, алерты и логирование
* Реализовать бэкапы и восстановление
* Использовать ретраи, circuit breaker и таймауты
7. Доступность
* Реплицировать данные между узлами
* Минимизировать даунтайм через failover
* Определить планы восстановления (RTO/RPO)
* Регулярно тестировать под нагрузкой
8. Производительность
* Оптимизировать задержки и пропускную способность
* Использовать кэширование для горячих данных
* Оптимизировать алгоритмы и запросы
* Применять сжатие для передачи данных
9. Безопасность
* Реализовать аутентификацию и авторизацию
* Шифровать данные в покое и при передаче
* Проводить сканирование уязвимостей и аудиты
* Защищать API и эндпоинты от атак
10. Поддерживаемость
* Писать модульный, читаемый и документированный код
* Автоматизировать деплой и версионирование
* Проектировать систему без ломания фич при росте
* Использовать CI/CD пайплайны
11. Тестирование
* Покрывать юнит-, интеграционные и e2e-тесты
* Проводить нагрузочное тестирование
* Валидировать API и корректность данных
* Проверять безопасность и соответствие требованиям
12. Пользовательский опыт
* Делать понятный и отзывчивый интерфейс
* Оптимизировать пользовательские сценарии
* Проводить юзабилити-тестирование
* Учитывать доступность
13. Оценка стоимости
* Считать инфраструктурные затраты
* Учитывать лицензии, масштабирование и операционные расходы
* Оптимизировать использование облачных ресурсов
* Закладывать бюджет на отказоустойчивость
14. Документация
* Поддерживать актуальные техдоки и архитектуру
* Писать API-справочники и руководства
* Использовать диаграммы
* Хранить всё с версионированием
15. План миграции
* Проверить совместимость старой и новой системы
* Составить пошаговую стратегию
* Прогнать миграцию на стенде
* Проверить целостность данных после переноса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤1
image_2026-04-28_06-49-08.png
2 MB
Spring Boot: эффективный способ обработки больших CSV-файлов — использовать возможности Spring Batch.
Spring Batch настраивается с такими опциями:
✅ Чанкинг
✅ Параллелизм
✅ Ретраи
#SpringBoot #РазработкаПО
👉 Java Portal
Spring Batch настраивается с такими опциями:
#SpringBoot #РазработкаПО
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣3
Обрабатывает случаи, когда значение в Optional есть и когда оно отсутствует, одним вызовом.
if/else для Optional → ifPresentOrElse() (JDK 9+)
Please open Telegram to view this post
VIEW IN TELEGRAM
java.evolved
Optional.ifPresentOrElse() | java.evolved
Handle both present and empty cases of Optional in one call.
maven-cheat-sheet.pdf
147.3 KB
Основные команды Maven для Java-разработчиков
Maven — это мощный инструмент автоматизации сборки, который используется в основном для Java-проектов. Он помогает управлять зависимостями, сборкой и жизненным циклом проекта
👉 Java Portal
Maven — это мощный инструмент автоматизации сборки, который используется в основном для Java-проектов. Он помогает управлять зависимостями, сборкой и жизненным циклом проекта
$ mvn archetype:generate
Создание нового Maven-проекта
$ mvn clean
Очистка директории target
$ mvn compile
Компиляция исходного кода
$ mvn test
Запуск unit-тестов
$ mvn package
Сборка проекта в JAR/WAR
$ mvn install
Установка артефакта в локальный Maven-репозиторий
$ mvn install -DskipTests
Пропустить тесты при сборке
$ mvn spring-boot:run
Запуск Spring Boot приложения (если используется spring-boot-maven-plugin)
$ mvn dependency:resolve
Обновление зависимостей
$ mvn dependency:tree
Вывод дерева зависимостей
$ mvn clean compile package
Запуск целей в указанной фазе
$ mvn validate
Проверка структуры проекта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Spring Boot: важно валидировать входные данные ваших API, даже внутренних.
#SpringBoot #РазработкаПО
👉 Java Portal
#SpringBoot #РазработкаПО
Please open Telegram to view this post
VIEW IN TELEGRAM
👀3❤1
В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн
Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда?
Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России
📆 в канале размещаются как онлайн, так и оффлайн мероприятия;
👩💻 можно найти ивенты по любому стеку: программирование, frontend-backend разработка, кибербезопасность, дата-аналитика, osint, devops и другие;
🎙 разнообразные форматы мероприятий: митапы с коллегами по цеху, конференции и вебинары с известными опытными специалистами, форумы и олимпиады от важных представителей индустрии и многое другое
А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах:
🚀 IT-мероприятия России — подписывайся и будь в курсе всех предстоящих мероприятий!
Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда?
Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России
А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1🔥1😁1👀1
На фото показана проблема N+1 в JPA и её решение.
🟣
☑
Показана разница в коде и как избежать лишних запросов при загрузке связанных сущностей (Author → Book)
👉 Java Portal
findAll() — вызывает 1 запрос к авторам + по 1 запросу на книги каждого автора → N+1 запросовJOIN FETCH в @Query — решает проблему, загружая авторов и их книги одним SQL-запросомПоказана разница в коде и как избежать лишних запросов при загрузке связанных сущностей (Author → Book)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Клёвый тренажёр+учебник по SQL
Тут можно потренироваться в хитрых джойнах, агрегациях и понабивать руку. Интерфейс очень приятный и позволяет потыкать схему БД, даёт подсказки как в коде, так и непосредственно по решению
В более сложные штуки (к примеру, в оконные функции) этот ресурс не лезет. Ну и запросы даже в самых сложных задачках получаются не сказать чтобы громоздкие
На сайте есть платная версия (которая позволяет смотреть авторские решения), но можно вполне обойтись и без неё
https://sql-academy.org/ru/trainer
👉 Java Portal
Тут можно потренироваться в хитрых джойнах, агрегациях и понабивать руку. Интерфейс очень приятный и позволяет потыкать схему БД, даёт подсказки как в коде, так и непосредственно по решению
В более сложные штуки (к примеру, в оконные функции) этот ресурс не лезет. Ну и запросы даже в самых сложных задачках получаются не сказать чтобы громоздкие
На сайте есть платная версия (которая позволяет смотреть авторские решения), но можно вполне обойтись и без неё
https://sql-academy.org/ru/trainer
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤1👍1
Используй
Проверяет, ссылаются ли два объекта
#Java #РазработкаПО
👉 Java Portal
Files.isSameFile(path1, path2), чтобы проверить, указывают ли два пути на один и тот же файл. Метод также резолвит симлинки.Проверяет, ссылаются ли два объекта
Path на один и тот же реальный файл в файловой системе.#Java #РазработкаПО
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
На собесе по Java понимание устройства JVM и управления памятью сильно влияет на оценку. Ниже — сжатое покрытие всех 25 тем без воды.
1. Heap vs Stack
Heap — аллокация объектов, шарится между потоками.
Stack — фреймы методов, локальные переменные, примитивы.
Объекты в heap, ссылки — в stack.
2. Сборка мусора
GC освобождает недостижимые объекты.
Сборщики: Serial, Parallel, CMS (устаревший), G1.
Объект попадает под GC при отсутствии достижимости по графу ссылок.
3. Области памяти JVM
Heap (Young/Old), Stack, Metaspace (вместо Method Area), Native Stack.
Metaspace хранит метаданные классов.
4. Алгоритмы GC
Minor GC — Young, Major/Full GC — Old.
Mark-and-Sweep, Copying, Mark-Compact.
5. Параметры JVM
GC-логи анализируются для поиска пауз и аллокаций.
6. Утечки памяти
Причины: статические коллекции, кеши без очистки, listener’ы.
Инструменты: VisualVM, JConsole, Eclipse MAT.
7. OutOfMemoryError
Heap overflow, Metaspace overflow, Direct memory.
Решения: тюнинг heap, профилинг, оптимизация аллокаций.
8. Типы ссылок
Soft — для кешей.
Weak — сборка при следующем GC.
Phantom — для пост-очистки.
9. ThreadLocal
Утечки из-за хранения значений без remove().
Проблема усиливается в пуле потоков.
10. finalize()
Непредсказуемый вызов, влияет на GC.
Замена — Cleaner или try-with-resources.
11. Direct Memory
Off-heap через
Контроль сложнее, GC не управляет напрямую.
12. JEP по GC
ZGC (JEP 307) — низкие паузы.
Shenandoah (JEP 189) — конкурентная очистка.
13. Архитектура JVM
ClassLoader, Runtime Data Areas, Execution Engine, JNI.
14. Загрузка классов
Loading → Linking → Initialization.
Загрузчики: Bootstrap, Platform (бывш. Extension), System.
15. Байткод
Инструкции JVM, стековая модель исполнения.
Интерпретируется и оптимизируется JIT.
16. JIT-компилятор
Горячий код компилируется в машинный.
Оптимизации: инлайнинг, удаление мертвого кода.
17. Структура .class
Magic number, constant pool, методы, атрибуты.
18. Жизненный цикл потоков
NEW → RUNNABLE → BLOCKED/WAITING → TERMINATED.
JVM управляет планированием через ОС.
19. JNI
Связка с нативным кодом (C/C++).
Используется для low-level операций.
20. Профилинг JVM
CPU, память, потоки.
Инструменты: VisualVM, JConsole.
21. HotSpot
Основная реализация JVM.
Использует адаптивную оптимизацию и JIT.
22. Манипуляция байткодом
ASM, BCEL, Javassist.
Применяется в прокси, AOP, фреймворках.
23. Инструменты диагностики
jstack — дамп потоков.
jmap — heap dump.
jstat — статистика GC.
24. Безопасность классов
Верификация байткода.
Security Manager (устаревший, но концепт важен).
25. Java Memory Model (JMM)
Правила видимости и happens-before.
Ключевые примитивы: volatile, synchronized.
👉 Java Portal
1. Heap vs Stack
Heap — аллокация объектов, шарится между потоками.
Stack — фреймы методов, локальные переменные, примитивы.
Объекты в heap, ссылки — в stack.
2. Сборка мусора
GC освобождает недостижимые объекты.
Сборщики: Serial, Parallel, CMS (устаревший), G1.
Объект попадает под GC при отсутствии достижимости по графу ссылок.
3. Области памяти JVM
Heap (Young/Old), Stack, Metaspace (вместо Method Area), Native Stack.
Metaspace хранит метаданные классов.
4. Алгоритмы GC
Minor GC — Young, Major/Full GC — Old.
Mark-and-Sweep, Copying, Mark-Compact.
5. Параметры JVM
-Xms, -Xmx — размер heap.-XX:NewRatio — соотношение поколений.GC-логи анализируются для поиска пауз и аллокаций.
6. Утечки памяти
Причины: статические коллекции, кеши без очистки, listener’ы.
Инструменты: VisualVM, JConsole, Eclipse MAT.
7. OutOfMemoryError
Heap overflow, Metaspace overflow, Direct memory.
Решения: тюнинг heap, профилинг, оптимизация аллокаций.
8. Типы ссылок
Soft — для кешей.
Weak — сборка при следующем GC.
Phantom — для пост-очистки.
9. ThreadLocal
Утечки из-за хранения значений без remove().
Проблема усиливается в пуле потоков.
10. finalize()
Непредсказуемый вызов, влияет на GC.
Замена — Cleaner или try-with-resources.
11. Direct Memory
Off-heap через
ByteBuffer.allocateDirect.Контроль сложнее, GC не управляет напрямую.
12. JEP по GC
ZGC (JEP 307) — низкие паузы.
Shenandoah (JEP 189) — конкурентная очистка.
13. Архитектура JVM
ClassLoader, Runtime Data Areas, Execution Engine, JNI.
14. Загрузка классов
Loading → Linking → Initialization.
Загрузчики: Bootstrap, Platform (бывш. Extension), System.
15. Байткод
Инструкции JVM, стековая модель исполнения.
Интерпретируется и оптимизируется JIT.
16. JIT-компилятор
Горячий код компилируется в машинный.
Оптимизации: инлайнинг, удаление мертвого кода.
17. Структура .class
Magic number, constant pool, методы, атрибуты.
18. Жизненный цикл потоков
NEW → RUNNABLE → BLOCKED/WAITING → TERMINATED.
JVM управляет планированием через ОС.
19. JNI
Связка с нативным кодом (C/C++).
Используется для low-level операций.
20. Профилинг JVM
CPU, память, потоки.
Инструменты: VisualVM, JConsole.
21. HotSpot
Основная реализация JVM.
Использует адаптивную оптимизацию и JIT.
22. Манипуляция байткодом
ASM, BCEL, Javassist.
Применяется в прокси, AOP, фреймворках.
23. Инструменты диагностики
jstack — дамп потоков.
jmap — heap dump.
jstat — статистика GC.
24. Безопасность классов
Верификация байткода.
Security Manager (устаревший, но концепт важен).
25. Java Memory Model (JMM)
Правила видимости и happens-before.
Ключевые примитивы: volatile, synchronized.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
image_2026-05-02_07-05-20.png
291.1 KB
Паттерны в Java: паттерн «Строитель» позволяет гибко и прозрачно конструировать сложные объекты. #Java #ПаттерныПроектирования
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Для кого-то неожиданно узнать, что Java не конкатенирует строки на этапе выполнения в таком кейсе:
Что важно:
Строка в Java хранится как
Строки размещаются в двух областях:
- куча
- пул строковых констант (SCP)
Пример:
Пример:
При такой записи:
компилятор Java выполняет константную свёртку и подставляет готовое значение:
Конкатенации на этапе выполнения нет — это вычисляется на этапе компиляции.
но это не работает со строковыми переменными:
здесь компилятор Java уже не может сделать константную свёртку, поэтому генерируется вызов через
На уровне байткода это реализуется через механизм динамической конкатенации строк (JEP 280 / JEP 357), который выбирает оптимальную стратегию выполнения во время запуска.
В ранних версиях вместо этого использовался
👉 Java Portal
String c = "a" + "b";Что важно:
Строка в Java хранится как
byte[] + флаг кодировки:0 — LATIN1 (1 байт на символ, для ASCII экономия памяти)1 — UTF-16 (2 байта на символ)Строки размещаются в двух областях:
- куча
- пул строковых констант (SCP)
Пример:
String a = "hello", b = "hello";
a == b → true, обе переменные указывают на один объект из пулаПример:
String a = "hello", b = new String("hello");a == b → false, разные объекты в кучеПри такой записи:
String c = "a" + "b";
компилятор Java выполняет константную свёртку и подставляет готовое значение:
String c = "ab";
Конкатенации на этапе выполнения нет — это вычисляется на этапе компиляции.
но это не работает со строковыми переменными:
java id="xq7v2m"
String a = "a", b = "b", c = a + b;
здесь компилятор Java уже не может сделать константную свёртку, поэтому генерируется вызов через
invokedynamic с StringConcatFactoryНа уровне байткода это реализуется через механизм динамической конкатенации строк (JEP 280 / JEP 357), который выбирает оптимальную стратегию выполнения во время запуска.
В ранних версиях вместо этого использовался
StringBuilder, где код фактически превращался в цепочку append() и финальный toString().Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔6👍1