Java Portal | Программирование
12.3K subscribers
1.35K photos
108 videos
42 files
1.35K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Основные области памяти 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
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍54
Совет по Java: удаляйте неиспользуемые импорты и переменные — это улучшает читаемость кода.

До:

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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Spring Boot: можно обрабатывать CORS глобально через WebMvcConfigurer

CORS — это механизм, который позволяет веб-приложению на одном домене (origin) получать доступ к ресурсам с другого домена.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32
SOLID в Java: принцип подстановки Лисков (LSP) утверждает:

==> Объекты базового класса должны заменяться объектами подклассов без проблем.

× Плохой пример

* Есть класс 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 делает код предсказуемым и безопасным для расширения

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥41
This media is not supported in your browser
VIEW IN TELEGRAM
Кто-то выложил в опенсорс инструмент, который парсит бизнесы из Google Maps по всему миру.

Название, адрес, телефон, сайт, отзывы, часы работы — всё собирается. Достаточно ввести поисковый запрос, и он выгружает данные в CSV.

Проект на 100% с открытым исходным кодом.

👉 Java Portal
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
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥41
image_2026-04-28_06-49-08.png
2 MB
Spring Boot: эффективный способ обработки больших CSV-файлов — использовать возможности Spring Batch.

Spring Batch настраивается с такими опциями:

Чанкинг
Параллелизм
Ретраи

#SpringBoot #РазработкаПО

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣3
☕️ Optional.ifPresentOrElse()

Обрабатывает случаи, когда значение в Optional есть и когда оно отсутствует, одним вызовом.

if/else для Optional → ifPresentOrElse() (JDK 9+)

🔗https://javaevolved.github.io/streams/optional-ifpresentorelse.html

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
maven-cheat-sheet.pdf
147.3 KB
Основные команды Maven для Java-разработчиков

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
Проверка структуры проекта


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Spring Boot: важно валидировать входные данные ваших API, даже внутренних.
#SpringBoot #РазработкаПО

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👀31
В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн

Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда?

Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России

📆 в канале размещаются как онлайн, так и оффлайн мероприятия;
👩‍💻 можно найти ивенты по любому стеку: программирование, frontend-backend разработка, кибербезопасность, дата-аналитика, osint, devops и другие;
🎙 разнообразные форматы мероприятий: митапы с коллегами по цеху, конференции и вебинары с известными опытными специалистами, форумы и олимпиады от важных представителей индустрии и многое другое

А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах:

🚀 IT-мероприятия Россииподписывайся и будь в курсе всех предстоящих мероприятий!
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1🔥1😁1👀1
На фото показана проблема N+1 в JPA и её решение.

🟣findAll() — вызывает 1 запрос к авторам + по 1 запросу на книги каждого автора → N+1 запросов

JOIN FETCH в @Query — решает проблему, загружая авторов и их книги одним SQL-запросом

Показана разница в коде и как избежать лишних запросов при загрузке связанных сущностей (Author → Book)

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Клёвый тренажёр+учебник по SQL

Тут можно потренироваться в хитрых джойнах, агрегациях и понабивать руку. Интерфейс очень приятный и позволяет потыкать схему БД, даёт подсказки как в коде, так и непосредственно по решению

В более сложные штуки (к примеру, в оконные функции) этот ресурс не лезет. Ну и запросы даже в самых сложных задачках получаются не сказать чтобы громоздкие

На сайте есть платная версия (которая позволяет смотреть авторские решения), но можно вполне обойтись и без неё

https://sql-academy.org/ru/trainer

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥41👍1
Используй Files.isSameFile(path1, path2), чтобы проверить, указывают ли два пути на один и тот же файл. Метод также резолвит симлинки.

Проверяет, ссылаются ли два объекта Path на один и тот же реальный файл в файловой системе.
#Java #РазработкаПО

👉 Java Portal
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
-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.

👉 Java Portal
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 не конкатенирует строки на этапе выполнения в таком кейсе:
String c = "a" + "b";

Что важно:

Строка в Java хранится как byte[] + флаг кодировки:

0 — LATIN1 (1 байт на символ, для ASCII экономия памяти)
1 — UTF-16 (2 байта на символ)

Строки размещаются в двух областях:

- куча
- пул строковых констант (SCP)

Пример:

String a = "hello", b = "hello";


a == btrue, обе переменные указывают на один объект из пула

Пример:

String a = "hello", b = new String("hello");


a == bfalse, разные объекты в куче

При такой записи:

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().

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔6👍1