Знания по базам данных на техсобесах игнорировать нельзя.
Честно, многие реально боятся DB. И когда бэкендер не может сходу написать обычный, часто используемый запрос, его шансы пройти начинают заметно проседать.
Один из ключевых концептов тут это JOIN.
Я собрал понятную шпаргалку по SQL JOIN: с примерами и визуализацией, чтобы быстро уложить в голове.
👉 Java Portal
Честно, многие реально боятся DB. И когда бэкендер не может сходу написать обычный, часто используемый запрос, его шансы пройти начинают заметно проседать.
Один из ключевых концептов тут это JOIN.
Я собрал понятную шпаргалку по SQL JOIN: с примерами и визуализацией, чтобы быстро уложить в голове.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍3💊1
Брейкпоинты в IDEA (IntelliJ и другие) для разработчиков
Иногда смотрю, как люди дебажат, и чуть ли не ловлю инсульт🍺
Большинство разработчиков умеют только ставить и удалять брейкпоинты. А в IDEA есть куча полезных фич для отладки. Ниже самые годные:
[1] Условие остановки
Если метод вызывается часто или брейкпоинт стоит в цикле, не трать время, ожидая нужных значений:
▪️ ПКМ по брейкпоинту
▪️ В Condition добавь условие остановки. Можно использовать все доступные переменные, объекты и методы
[2] Динамически смотреть значения параметров
Вариант для новичков: добавить в код
Вариант для продвинутых:
▪️ Зажми Shift и поставь брейкпоинт
▪️ Отметь чекбокс Evaluate and log
▪️ Введи нужное выражение
Дебаггер не будет останавливать выполнение, но будет писать значение выражения в консоль. Супер полезно для многопоточки, кода сторонних библиотек и remote debugging.
[3] Отключение брейкпоинта
Ненужный брейкпоинт можно не удалять, а просто выключить:
▪️ Нажми на шестеренку у брейкпоинта
ИЛИ
▪️ ПКМ по брейкпоинту → снимай галочку Enabled
[4] Массовая чистка
Когда в проекте много брейкпоинтов, IDE может чуть тормозить во время дебага. Чтобы убрать лишние, открой полный список:
▪️ ПКМ по любому брейкпоинту
▪️ Link More
▪️ Слева будет список брейкпоинтов
▪️ Удаляй ненужные
Обязательно попробуй. Пусть дебаг будет как по маслу👍
👉 Java Portal
Иногда смотрю, как люди дебажат, и чуть ли не ловлю инсульт
Большинство разработчиков умеют только ставить и удалять брейкпоинты. А в IDEA есть куча полезных фич для отладки. Ниже самые годные:
[1] Условие остановки
Если метод вызывается часто или брейкпоинт стоит в цикле, не трать время, ожидая нужных значений:
[2] Динамически смотреть значения параметров
Вариант для новичков: добавить в код
System.out.println с нужным полем/выражением.Вариант для продвинутых:
Дебаггер не будет останавливать выполнение, но будет писать значение выражения в консоль. Супер полезно для многопоточки, кода сторонних библиотек и remote debugging.
[3] Отключение брейкпоинта
Ненужный брейкпоинт можно не удалять, а просто выключить:
ИЛИ
[4] Массовая чистка
Когда в проекте много брейкпоинтов, IDE может чуть тормозить во время дебага. Чтобы убрать лишние, открой полный список:
Обязательно попробуй. Пусть дебаг будет как по маслу
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥8
Java 25: апгрейд, который экономит до 30% RAM (без правок кода)
В JDK 25 добавили одну из самых заметных оптимизаций за долгое время: Compact Object Headers (JEP 519).
Что меняется:
- размер заголовка объекта уменьшается примерно с ~12 байт до 8 байт
- меньше памяти на объект -> меньше heap
- меньше heap -> меньше давление на GC
- меньше GC -> сервис быстрее + облако дешевле
Где профит максимальный:
Spring Boot, микросервисы, DTO, records, кэши, в общем всё, где много мелких объектов.
Включается одной опцией:
-XX:+UseCompactObjectHeaders
По отзывам из реальных систем:
снижение heap на 15–30% встречается довольно часто.
Просто протестируй на своих сервисах и забирай “бесплатную” экономию.
👉 Java Portal
В JDK 25 добавили одну из самых заметных оптимизаций за долгое время: Compact Object Headers (JEP 519).
Что меняется:
- размер заголовка объекта уменьшается примерно с ~12 байт до 8 байт
- меньше памяти на объект -> меньше heap
- меньше heap -> меньше давление на GC
- меньше GC -> сервис быстрее + облако дешевле
Где профит максимальный:
Spring Boot, микросервисы, DTO, records, кэши, в общем всё, где много мелких объектов.
Включается одной опцией:
-XX:+UseCompactObjectHeaders
По отзывам из реальных систем:
снижение heap на 15–30% встречается довольно часто.
Просто протестируй на своих сервисах и забирай “бесплатную” экономию.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Java: Records не ограничены ролью просто контейнера данных, в них можно добавлять кастомные конструкторы и методы для валидации.
✅ В records можно иметь конструкторы, статические методы и методы экземпляра:
👉 Java Portal
public record Email(String address) {
// Конструктор с валидацией
public Email {
if (address == null || !address.matches("^[\\w-.]+@([\\w-]+\\.)+[\\w-]{2,4}$")) {
throw new IllegalArgumentException("Некорректный email-адрес: " + address);
}
}
// Метод экземпляра
public String domain() {
return address.substring(address.indexOf('@') + 1);
}
// Статический метод
public static Email from(String raw) {
return new Email(raw.trim().toLowerCase());
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
5👍6❤1
В Spring Boot можно включить асинхронное логирование, настроив Logback (logback-spring.xml).
✅ Лог-сообщения отправляются в очередь и обрабатываются отдельным фоновым потоком.
✅ Это снижает узкие места на I/O (ввод-вывод).
Положи конфиг Logback в папку
Пример:
👉 Java Portal
Положи конфиг Logback в папку
resources:src/main/resources/logback-spring.xmlПример:
<configuration>
<!-- Консольный appender, обернутый в async -->
<appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="CONSOLE" />
<queueSize>5000</queueSize>
<discardingThreshold>0</discardingThreshold>
<includeCallerData>false</includeCallerData>
</appender>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="ASYNC_CONSOLE" />
</root>
</configuration>
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3
Развенчиваем распространенный миф про Java Garbage Collector
Миф: мне НЕ нужно заниматься управлением памятью в Java, потому что GC все делает за меня
Garbage Collector (GC) действительно очищает неиспользуемые объекты, на которые больше нет активных ссылок. Благодаря этому в Java не нужно вручную освобождать память, как в C++.
Несколько предпосылок, из которых обычно рождается этот тезис:
- В языках с ручным управлением памятью (C, C++) утечки очевидны: если забыл вызвать
- В Java GC работает автоматически, поэтому кажется, что он сам решает все проблемы.
- «Ну раз есть GC, значит о памяти можно больше не думать» - типичная ошибка.
GC удаляет только те объекты, на которые больше нет активных ссылок. Если объект остается доступным, но фактически уже не используется, он будет занимать память до завершения приложения.
* Несколько случаев утечек памяти
[1] Статические коллекции (заполняем, но не очищаем)
Если создать
Через пару минут -
[2] Переменные потока (
Объекты, сохраненные в
Поток завершится, но память останется занятой, потому что
[3] Внутренние классы и «утекшие» ссылки
Если анонимный класс или lambda-ссылка захватывает внешний объект, это может мешать GC освободить его.
Миф развенчан. GC не всесилен, и даже с ним придется учиться правильно работать с памятью в Java.
👉 Java Portal
Миф: мне НЕ нужно заниматься управлением памятью в Java, потому что GC все делает за меня
Garbage Collector (GC) действительно очищает неиспользуемые объекты, на которые больше нет активных ссылок. Благодаря этому в Java не нужно вручную освобождать память, как в C++.
Несколько предпосылок, из которых обычно рождается этот тезис:
- В языках с ручным управлением памятью (C, C++) утечки очевидны: если забыл вызвать
free(), память потеряна навсегда.- В Java GC работает автоматически, поэтому кажется, что он сам решает все проблемы.
- «Ну раз есть GC, значит о памяти можно больше не думать» - типичная ошибка.
GC удаляет только те объекты, на которые больше нет активных ссылок. Если объект остается доступным, но фактически уже не используется, он будет занимать память до завершения приложения.
* Несколько случаев утечек памяти
[1] Статические коллекции (заполняем, но не очищаем)
Если создать
static List и постоянно добавлять в него объекты, GC их никогда не освободит, потому что статические поля живут в течение всего времени работы приложения.public class MemoryLeak {
private static final List<byte[]> cache = new ArrayList<>();
public static void main(String[] args) {
while (true) {
cache.add(new byte[10 * 1024 * 1024]);
System.out.println("Added 10MB to the cache. Used memory: " +
(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024) + "MB");
}
}
}Через пару минут -
OutOfMemoryError.[2] Переменные потока (
ThreadLocal)Объекты, сохраненные в
ThreadLocal, привязаны к потоку, а в пуле потоков могут жить дольше, чем нужно.public class ThreadLocalLeak {
private static final ThreadLocal<byte[]> threadLocalData = new ThreadLocal<>();
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
executor.execute(() -> {
threadLocalData.set(new byte[10 * 1024 * 1024]); // 10MB per thread
System.out.println("Memory occupied by the thread!");
});
}
executor.shutdown();
}
}Поток завершится, но память останется занятой, потому что
ThreadLocal не очищается автоматически.[3] Внутренние классы и «утекшие» ссылки
Если анонимный класс или lambda-ссылка захватывает внешний объект, это может мешать GC освободить его.
public class InnerClassLeak {
private String data = "Very important data";
public void createAnonymousClass() {
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("Using: " + data);
}
};
new Thread(task).start();
}
}task держит ссылку на data, и даже если InnerClassLeak больше не используется, GC не сможет очистить объект.Миф развенчан. GC не всесилен, и даже с ним придется учиться правильно работать с памятью в Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4