Spring Boot 4: как перенести старые настройки
При обновлении добавьте временную зависимость:
После запуска приложения migrator:
* найдёт устаревшие и переименованные параметры;
* выведет подсказки в логах;
* временно преобразует старые ключи во время выполнения.
Исправьте настройки в
#SpringBoot4 #Migration
При обновлении добавьте временную зависимость:
После запуска приложения migrator:
* найдёт устаревшие и переименованные параметры;
* выведет подсказки в логах;
* временно преобразует старые ключи во время выполнения.
Исправьте настройки в
#SpringBoot4 #Migration
При обновлении добавьте временную зависимость:
runtimeOnly("org.springframework.boot:spring-boot-properties-migrator")
После запуска приложения migrator:
* найдёт устаревшие и переименованные параметры;
* выведет подсказки в логах;
* временно преобразует старые ключи во время выполнения.
Исправьте настройки в
application.properties или application.yaml, убедитесь, что предупреждения исчезли, и удалите зависимость. Оставлять её в проекте постоянно не нужно.#SpringBoot4 #Migration
При обновлении добавьте временную зависимость:
runtimeOnly("org.springframework.boot:spring-boot-properties-migrator")
После запуска приложения migrator:
* найдёт устаревшие и переименованные параметры;
* выведет подсказки в логах;
* временно преобразует старые ключи во время выполнения.
Исправьте настройки в
application.properties или application.yaml, убедитесь, что предупреждения исчезли, и удалите зависимость. Оставлять её в проекте постоянно не нужно.#SpringBoot4 #Migration
👍8❤5🤩2🥰1
Kotlin 2.5.0-Beta1 вышел
JetBrains выпустила первую бета-версию Kotlin 2.5.0.
Главное:
- Language: стабильная name-based destructuring в
- Standard Library: новые экспериментальные функции для упрощения типичных конструкций с
- Kotlin/JS: добавлена поддержка target ES2020.
- Compiler: более предсказуемое поведение inline-функций при компиляции
Пока это Beta, но релиз уже показывает, в какую сторону движется Kotlin 2.5: меньше синтаксического шума, современнее JS-таргеты и более стабильное поведение компилятора.
https://kotl.in/2-5-0-beta1
JetBrains выпустила первую бета-версию Kotlin 2.5.0.
Главное:
- Language: стабильная name-based destructuring в
only-syntax режиме, плюс экспериментальные companion extensions и blocks.- Standard Library: новые экспериментальные функции для упрощения типичных конструкций с
if.- Kotlin/JS: добавлена поддержка target ES2020.
- Compiler: более предсказуемое поведение inline-функций при компиляции
.klib.Пока это Beta, но релиз уже показывает, в какую сторону движется Kotlin 2.5: меньше синтаксического шума, современнее JS-таргеты и более стабильное поведение компилятора.
https://kotl.in/2-5-0-beta1
🎉5❤3🥰2
⚡️Продвинутый Java-совет: используйте `ClassValue`
Если нужно кешировать метаданные отдельно для каждого класса, не обязательно создавать
Полезно для reflection, сериализации, мапперов и собственных фреймворков.
#Java #JavaTips #Backend
Если нужно кешировать метаданные отдельно для каждого класса, не обязательно создавать
ConcurrentHashMap<Class<?>, Metadata>.
private static final ClassValue<Metadata> CACHE =
new ClassValue<>() {
@Override
protected Metadata computeValue(Class<?> type) {
return scan(type);
}
};
Metadata metadata = CACHE.get(MyClass.class);
ClassValue лениво вычисляет значение, безопасно работает при конкуренции потоков и хранит отдельный результат для каждого Class. Сбросить кеш можно через remove().Полезно для reflection, сериализации, мапперов и собственных фреймворков.
#Java #JavaTips #Backend
🔥7❤3🎉3👍1
💡 Java: не создавайте тяжёлые объекты раньше времени
Если объект дорогой в создании, но нужен только в редких сценариях, eager initialization может зря тратить время и память.
Вместо этого используйте lazy initialization:
Так HeavyAnalyzer создастся только при первом реальном обращении.
Где особенно полезно:
- кэши;
- API-клиенты;
- тяжёлая конфигурация;
- анализаторы;
- объекты с дорогой инициализацией.
Для более чистого кода можно использовать Supplier, holder pattern или современные lazy-механизмы Java.
Если доступ идёт из нескольких потоков, простая проверка if (analyzer == null) уже недостаточна - нужна потокобезопасная реализация.
Если объект дорогой в создании, но нужен только в редких сценариях, eager initialization может зря тратить время и память.
Вместо этого используйте lazy initialization:
private HeavyAnalyzer analyzer;
private HeavyAnalyzer analyzer() {
if (analyzer == null) {
analyzer = new HeavyAnalyzer();
}
return analyzer;
}
Так HeavyAnalyzer создастся только при первом реальном обращении.
Где особенно полезно:
- кэши;
- API-клиенты;
- тяжёлая конфигурация;
- анализаторы;
- объекты с дорогой инициализацией.
Для более чистого кода можно использовать Supplier, holder pattern или современные lazy-механизмы Java.
Если доступ идёт из нескольких потоков, простая проверка if (analyzer == null) уже недостаточна - нужна потокобезопасная реализация.
👍7❤3🔥2😱1
В Spring Boot 3 SSL-компонент health endpoint переходил в особый статус WILL_EXPIRE_SOON, если сертификат скоро истекал. Для проб Kubernetes и балансировщиков это было неудобно: непонятно, считать сервис живым или нет.
В Spring Boot 4 этот статус убрали. Health остаётся UP, а цепочки сертификатов, срок которых скоро закончится, перечисляются в details.expiringChains. Порог предупреждения задаётся свойством
management.health.ssl.certificate-validity-warning-threshold:
management:
health:
ssl:
certificate-validity-warning-threshold: 14d
endpoint:
health:
show-details: always
Ответ
/actuator/health тогда выглядит так:
{
"status": "UP",
"details": {
"expiringChains": ["server-cert…"]
}
}
Практический вывод простой: пробы больше не будут дёргаться из-за истекающего сертификата, но и алерт по смене статуса тоже не сработает. Если мониторинг ловил WILL_EXPIRE_SOON, переключите его на проверку непустого expiringChains и не забудьте включить
show-details, иначе деталей в ответе не будет.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🔥1😁1
🧠 Spring AI показал, как сделать RAG заметно умнее обычного vector search.
Проблема классического RAG: похожий документ ещё не значит полезный.
Новый пайплайн делает так:
Jev проверяет каждый найденный chunk: есть ли там реальный ответ, противоречие или prompt injection.
В демо vector search нашёл 6 фрагментов, но до модели дошли только 2 действительно полезных.
Меньше мусора в контексте → точнее ответы и меньше шансов на prompt injection.
Код и разбор:
https://spring.io/blog/2026/10/02/spring-ai-modular-rag-typesafe-jev/
Проблема классического RAG: похожий документ ещё не значит полезный.
Новый пайплайн делает так:
Question → Rewrite → MultiQuery → Vector Search → Jev Filter → Rerank → LLMJev проверяет каждый найденный chunk: есть ли там реальный ответ, противоречие или prompt injection.
В демо vector search нашёл 6 фрагментов, но до модели дошли только 2 действительно полезных.
Меньше мусора в контексте → точнее ответы и меньше шансов на prompt injection.
Код и разбор:
https://spring.io/blog/2026/10/02/spring-ai-modular-rag-typesafe-jev/
👍6🔥5❤3
💡 Предпочитайте делегирование наследованию
Связь
Но есть цена.
✅ Подкласс получает весь API родителя.
✅ Он зависит от деталей реализации суперкласса.
✅ Изменение родительского класса может неожиданно сломать потомка.
И чем глубже иерархия, тем сложнее понять, откуда вообще взялось конкретное поведение.
Часто безопаснее композиция:
Вместо наследования:
Композиция связывает объекты. Наследование связывает их судьбы.
Если объекту просто нужна чужая функциональность, чаще лучше её делегировать, а не наследовать.
Связь
is-a выглядит удобно: создаём подкласс, наследуем поведение и пишем меньше кода.Но есть цена.
✅ Подкласс получает весь API родителя.
✅ Он зависит от деталей реализации суперкласса.
✅ Изменение родительского класса может неожиданно сломать потомка.
И чем глубже иерархия, тем сложнее понять, откуда вообще взялось конкретное поведение.
Часто безопаснее композиция:
class OrderService {
private final PaymentService paymentService;
}
Вместо наследования:
class OrderService extends PaymentService {
}
Композиция связывает объекты. Наследование связывает их судьбы.
Если объекту просто нужна чужая функциональность, чаще лучше её делегировать, а не наследовать.
👍5❤4🔥3
🚀 Spring Boot 4: переименовали property для exception translation
Было:
Стало:
Функциональность та же: Spring продолжает переводить persistence-исключения в
Чтобы не пропустить такие изменения при миграции на Boot 4, подключите Spring Boot Properties Migrator — он покажет устаревшие и переименованные настройки.
Мелочь, которая легко ломает конфиг после обновления.
Было:
spring.dao.exceptiontranslation.enabledСтало:
spring.persistence.exceptiontranslation.enabledФункциональность та же: Spring продолжает переводить persistence-исключения в
DataAccessException для @Repository.Чтобы не пропустить такие изменения при миграции на Boot 4, подключите Spring Boot Properties Migrator — он покажет устаревшие и переименованные настройки.
Мелочь, которая легко ломает конфиг после обновления.
👍6❤1🔥1
💡 Java: почему месяц `5` может оказаться июнем
В
Начиная с Java 8, для нового кода выбирайте
Здесь
Помните: `LocalDateTime` не содержит часового пояса. Для однозначного момента события используйте
В
Calendar месяцы нумеруются с нуля: январь 0, май 4, июнь 5. Простая ловушка, которая легко превращается в баг.Начиная с Java 8, для нового кода выбирайте
java.time:
LocalDate date = LocalDate.of(2026, 5, 31);
LocalDate deadline = date.plusDays(7);
String text = deadline.format(
DateTimeFormatter.ISO_LOCAL_DATE
);
// 2026-06-07
Здесь
5 означает май, а plusDays() возвращает новый объект, сохраняя исходную дату. Основные типы java.time неизменяемы и безопасны для совместного использования потоками.Помните: `LocalDateTime` не содержит часового пояса. Для однозначного момента события используйте
Instant или задавайте пояс явно.👍12❤2
💡 Код работает на обычных данных? Проверьте, что происходит на границах.
Баги часто прячутся там, где данных нет, их слишком мало или значение выходит за допустимый диапазон.
✅ `null`: метод корректно обрабатывает отсутствие значения или неожиданно падает с
✅ Пустая коллекция: что вернёт код, если обрабатывать нечего?
✅ Один элемент: работает ли логика без второго элемента и соседних значений?
✅ Границы: проверьте минимум, максимум и значения сразу за ними. Например, для диапазона
Такие тесты ещё и документируют контракт: какие входные данные допустимы, что возвращается и когда ожидается исключение.
Проверяйте не только «всё прошло успешно», но и «что будет, если…».
Баги часто прячутся там, где данных нет, их слишком мало или значение выходит за допустимый диапазон.
✅ `null`: метод корректно обрабатывает отсутствие значения или неожиданно падает с
NullPointerException?✅ Пустая коллекция: что вернёт код, если обрабатывать нечего?
✅ Один элемент: работает ли логика без второго элемента и соседних значений?
✅ Границы: проверьте минимум, максимум и значения сразу за ними. Например, для диапазона
1–100: 0, 1, 100, 101.Такие тесты ещё и документируют контракт: какие входные данные допустимы, что возвращается и когда ожидается исключение.
Проверяйте не только «всё прошло успешно», но и «что будет, если…».
🤬2❤1🔥1😁1
💡 Описывайте состояния через enum вместо строк
Статусы вроде
✅ Именованные значения вместо «магических» строк.
✅ Правила допустимых переходов рядом с описанием состояний.
✅ В языках с проверкой полноты
Но enum сам по себе не запрещает неверные переходы. Правило «отменённый заказ нельзя отправить» нужно реализовать отдельно.
Статусы вроде
"pending" и "finished" легко сломать опечаткой. Enum задаёт явный набор состояний и делает код понятнее.✅ Именованные значения вместо «магических» строк.
✅ Правила допустимых переходов рядом с описанием состояний.
✅ В языках с проверкой полноты
switch компилятор подскажет, если вы забыли обработать состояние.Но enum сам по себе не запрещает неверные переходы. Правило «отменённый заказ нельзя отправить» нужно реализовать отдельно.
👍8❤5🔥1
💡 100% покрытия тестами ≠ код без багов
Coverage показывает, какие строки выполнились во время тестов. Но не доказывает, что результат правильный.
Можно пройти каждую строку и пропустить ошибку в логике, граничный случай или сбой при неожиданном вводе.
✅ Проверяйте результат, а не только выполнение.
✅ Тестируйте рискованные сценарии и обработку ошибок.
✅ Используйте покрытие, чтобы искать пробелы в тестах.
Тест, который ловит реальный баг, ценнее красивой цифры в отчёте.
Coverage показывает, какие строки выполнились во время тестов. Но не доказывает, что результат правильный.
Можно пройти каждую строку и пропустить ошибку в логике, граничный случай или сбой при неожиданном вводе.
✅ Проверяйте результат, а не только выполнение.
✅ Тестируйте рискованные сценарии и обработку ошибок.
✅ Используйте покрытие, чтобы искать пробелы в тестах.
Тест, который ловит реальный баг, ценнее красивой цифры в отчёте.
👍5❤3🔥2
🍃 Не раскладывайте весь Spring-проект по папкам controller, service и repository.
В новом This Week in Spring Джош Лонг советует группировать код по функциональности, используя подход Spring Modulith. Например,
Ещё в подборке:
• JobRunr 9: поиск упавшего шага и задач, вызывающих замедление, остановка выполнения без потери работы.
• Spring AI: разбор агентных паттернов и вызова инструментов от руководителя проекта Кристиана Цолова.
• Progen CLI: видео о генерации каркаса приложения.
• IntelliJ IDEA: обзор новых возможностей.
• A Bootiful Podcast: разговор с создателем Jenkins Косуке Кавагути.
https://spring.io/blog/2026/10/13/this-week-in-spring-october-13th-2026
#Java #SpringBoot
В новом This Week in Spring Джош Лонг советует группировать код по функциональности, используя подход Spring Modulith. Например,
orders, payments, users, внутри которых находятся относящиеся к ним слои.Ещё в подборке:
• JobRunr 9: поиск упавшего шага и задач, вызывающих замедление, остановка выполнения без потери работы.
• Spring AI: разбор агентных паттернов и вызова инструментов от руководителя проекта Кристиана Цолова.
• Progen CLI: видео о генерации каркаса приложения.
• IntelliJ IDEA: обзор новых возможностей.
• A Bootiful Podcast: разговор с создателем Jenkins Косуке Кавагути.
https://spring.io/blog/2026/10/13/this-week-in-spring-october-13th-2026
#Java #SpringBoot
🔥7❤5🎉2
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Хакинг: t.iss.one/linuxkalii
DevOps: t.iss.one/DevOPSitsec
Docker: https://t.iss.one/+90Z5TAyfuNU5YmRi
Golang: t.iss.one/Golang_google
Rust: t.iss.one/rust_code
C++: t.iss.one/cpluspluc
C#: t.iss.one/csharp_ci
Java: t.iss.one/java_library
JavaScript: t.iss.one/javascriptv
React: t.iss.one/react_tg
Frontend: t.iss.one/front
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Мобильная разработка: t.iss.one/mobdevelop
Базы данных: t.iss.one/sqlhub
Data Science: t.iss.one/data_analysis_ml
Big Data: t.iss.one/bigdatai
Математика: t.iss.one/data_math
Физика: t.iss.one/fizmat
Kubernetes: t.iss.one/kubernetc
GameDev: https://t.iss.one/gamedev
Haskell: t.iss.one/haskell_tg
Собеседования и карьера:
DS собеседования: t.iss.one/machinelearning_interview
Python собеседования: t.iss.one/python_job_interview
Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.iss.one/memes_prog
Английский для программистов: t.iss.one/english_forprogrammers
ИИ и технологии: t.iss.one/vistehno
954 ГБ open-source курсов: https://t.iss.one/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: https://t.iss.one/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Хакинг: t.iss.one/linuxkalii
DevOps: t.iss.one/DevOPSitsec
Docker: https://t.iss.one/+90Z5TAyfuNU5YmRi
Golang: t.iss.one/Golang_google
Rust: t.iss.one/rust_code
C++: t.iss.one/cpluspluc
C#: t.iss.one/csharp_ci
Java: t.iss.one/java_library
JavaScript: t.iss.one/javascriptv
React: t.iss.one/react_tg
Frontend: t.iss.one/front
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Мобильная разработка: t.iss.one/mobdevelop
Базы данных: t.iss.one/sqlhub
Data Science: t.iss.one/data_analysis_ml
Big Data: t.iss.one/bigdatai
Математика: t.iss.one/data_math
Физика: t.iss.one/fizmat
Kubernetes: t.iss.one/kubernetc
GameDev: https://t.iss.one/gamedev
Haskell: t.iss.one/haskell_tg
Собеседования и карьера:
DS собеседования: t.iss.one/machinelearning_interview
Python собеседования: t.iss.one/python_job_interview
Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.iss.one/memes_prog
Английский для программистов: t.iss.one/english_forprogrammers
ИИ и технологии: t.iss.one/vistehno
954 ГБ open-source курсов: https://t.iss.one/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: https://t.iss.one/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
❤2👍1🔥1🥰1
Хватит склеивать строки через плюс: как в Java собирать сообщения читаемо
Когда в строку нужно подставить несколько значений, конкатенация быстро превращается в кашу из кавычек и пробелов, где легко потерять пробел или перепутать порядок.
В String.format шаблон целиком виден сразу, а поля легко добавить или переставить, не трогая остальную строку. MessageFormat пригодится, когда тексты лежат в ResourceBundle и для разных языков порядок слов меняется: индексы {0} и {1} позволяют переставлять аргументы прямо в переводе.
У MessageFormat есть подвохи. Числа он форматирует по локали, поэтому 1234 превратится в "1,234". А одинарная кавычка там служебный символ, так что "don't" нужно писать как "don''t".
И про производительность: начиная с Java 9 конкатенация через + компилируется в invokedynamic и работает быстро, а String.format заметно медленнее, потому что каждый раз разбирает шаблон. В горячих циклах и логах на каждый запрос лучше оставить плюс или StringBuilder, а format использовать там, где важна читаемость.
Когда в строку нужно подставить несколько значений, конкатенация быстро превращается в кашу из кавычек и пробелов, где легко потерять пробел или перепутать порядок.
String name = "Ada";
int score = 98;
// трудно читать, когда полей становится больше
String msg = "Player " + name + " scored " + score + " points";
// шаблон отдельно, значения отдельно
String msg2 = String.format("Player %s scored %d points", name, score);
// то же самое короче, Java 15+
String msg3 = "Player %s scored %d points".formatted(name, score);
// для локализации
String i18n = MessageFormat.format("Player {0} scored {1} points", name, score);
В String.format шаблон целиком виден сразу, а поля легко добавить или переставить, не трогая остальную строку. MessageFormat пригодится, когда тексты лежат в ResourceBundle и для разных языков порядок слов меняется: индексы {0} и {1} позволяют переставлять аргументы прямо в переводе.
У MessageFormat есть подвохи. Числа он форматирует по локали, поэтому 1234 превратится в "1,234". А одинарная кавычка там служебный символ, так что "don't" нужно писать как "don''t".
И про производительность: начиная с Java 9 конкатенация через + компилируется в invokedynamic и работает быстро, а String.format заметно медленнее, потому что каждый раз разбирает шаблон. В горячих циклах и логах на каждый запрос лучше оставить плюс или StringBuilder, а format использовать там, где важна читаемость.
👍5❤2🔥2
💡 Все файлы из папки и вложенных каталогов в Java? Используйте `Files.walk()`.
Метод возвращает
Например, найдём все
✅
✅ В
✅
Нюанс:
При вызове
Метод возвращает
Stream<Path>, который позволяет рекурсивно обойти дерево каталогов и отфильтровать нужные файлы.Например, найдём все
.java в src:
try (Stream<Path> paths = Files.walk(Path.of("src"))) {
paths.filter(Files::isRegularFile)
.filter(p -> p.getFileName()
.toString()
.endsWith(".java"))
.forEach(System.out::println);
}
✅
Files::isRegularFile исключает каталоги.✅ В
.filter() можно задать любое условие.✅
try-with-resources закрывает поток и освобождает ресурсы открытых каталогов.Нюанс:
Path.endsWith(".java") не проверяет расширение. Вызывайте endsWith() у строки с именем файла.При вызове
Files.walk() также нужно обработать IOException или объявить его в throws.👍5🔥1
Java-приложение ускорили примерно на 10% одним флагом JVM
Автор alf.io - сервиса продажи билетов на Spring Boot и PostgreSQL- решил проверить, стоит ли переходить на JDK 27 ради Compact Object Headers. В итоге протестировал и заголовки объектов, и сборщики мусора, и AOT-кеш.
Компактные заголовки уменьшают служебную часть объекта с 12 до 8 байт. Для приложения с множеством небольших объектов это означает меньше занятого места и работы для GC.
В контейнере с 2 CPU и 512 МБ памяти результаты оказались такими:
- Компактные заголовки снизили затраты CPU на GC и задержку p95 примерно на 10%.
- AOT-кеш Leyden сократил время запуска с 7,1 до 5,4 секунды относительно JDK 25 с рабочим AppCDS.
- ParallelGC снизил потребление CPU примерно на треть, но увеличил паузы сборки мусора.
За выигрышем от компактных заголовков необязательно идти на JDK 27. В JDK 25 их можно включить явно:
При этом потребление памяти контейнером не уменьшилось: при фиксированном размере кучи экономия проявилась в меньшей нагрузке на GC и более быстрых ответах.
Это результаты одного приложения — полезный повод провести свой замер.
https://ticketguy.dev/blogs/2026-10-17-jdk27-memory/
Автор alf.io - сервиса продажи билетов на Spring Boot и PostgreSQL- решил проверить, стоит ли переходить на JDK 27 ради Compact Object Headers. В итоге протестировал и заголовки объектов, и сборщики мусора, и AOT-кеш.
Компактные заголовки уменьшают служебную часть объекта с 12 до 8 байт. Для приложения с множеством небольших объектов это означает меньше занятого места и работы для GC.
В контейнере с 2 CPU и 512 МБ памяти результаты оказались такими:
- Компактные заголовки снизили затраты CPU на GC и задержку p95 примерно на 10%.
- AOT-кеш Leyden сократил время запуска с 7,1 до 5,4 секунды относительно JDK 25 с рабочим AppCDS.
- ParallelGC снизил потребление CPU примерно на треть, но увеличил паузы сборки мусора.
За выигрышем от компактных заголовков необязательно идти на JDK 27. В JDK 25 их можно включить явно:
java -XX:+UseCompactObjectHeaders -jar app.jar
При этом потребление памяти контейнером не уменьшилось: при фиксированном размере кучи экономия проявилась в меньшей нагрузке на GC и более быстрых ответах.
Это результаты одного приложения — полезный повод провести свой замер.
https://ticketguy.dev/blogs/2026-10-17-jdk27-memory/
❤5🔥3👍2
Критическая уязвимость в Java: атака по сети без пароля и участия пользователя
Oracle опубликовала предупреждение CVE-2026-91403 с оценкой CVSS 9.1. Проблема находится в JSSE — компоненте Java, который обеспечивает защищённые соединения TLS.
По описанию Oracle, успешная атака может позволить читать, изменять и удалять данные, доступные уязвимому приложению. Для эксплуатации не нужны учётные данные, а сложность атаки оценена как низкая.
В списке затронутых версий:
- Java SE 8u511 / 8u511-perf, 11.0.33, 17.0.21, 21.0.13, 25.0.5 и 27.0.1.
- Oracle GraalVM for JDK 17.0.21 и 21.0.13.
- Oracle GraalVM Enterprise Edition 21.3.20.
Условия зависят от приложения: Oracle указывает на сценарии, где данные атакующего попадают в API уязвимого компонента, например через веб-сервис. Само наличие Java ещё не означает, что любой сервис можно атаковать.
Администраторам стоит проверить используемые сборки Java, включая runtime внутри контейнеров, и установить исправления по инструкции поставщика.
Предупреждение опубликовано 21 октября. Более ранние версии тоже могут быть затронуты — отсутствие в списке не подтверждает их безопасность.
https://www.oracle.com/security-alerts/alert-cve-2026-91403.html
Oracle опубликовала предупреждение CVE-2026-91403 с оценкой CVSS 9.1. Проблема находится в JSSE — компоненте Java, который обеспечивает защищённые соединения TLS.
По описанию Oracle, успешная атака может позволить читать, изменять и удалять данные, доступные уязвимому приложению. Для эксплуатации не нужны учётные данные, а сложность атаки оценена как низкая.
В списке затронутых версий:
- Java SE 8u511 / 8u511-perf, 11.0.33, 17.0.21, 21.0.13, 25.0.5 и 27.0.1.
- Oracle GraalVM for JDK 17.0.21 и 21.0.13.
- Oracle GraalVM Enterprise Edition 21.3.20.
Условия зависят от приложения: Oracle указывает на сценарии, где данные атакующего попадают в API уязвимого компонента, например через веб-сервис. Само наличие Java ещё не означает, что любой сервис можно атаковать.
Администраторам стоит проверить используемые сборки Java, включая runtime внутри контейнеров, и установить исправления по инструкции поставщика.
Предупреждение опубликовано 21 октября. Более ранние версии тоже могут быть затронуты — отсутствие в списке не подтверждает их безопасность.
https://www.oracle.com/security-alerts/alert-cve-2026-91403.html
👍11❤3🎉2
💡 Spring Boot 4: DevTools больше не запускает LiveReload по умолчанию
Автоматический перезапуск приложения при изменениях в classpath продолжает работать. А обновление страницы в браузере через LiveReload теперь нужно включать явно.
В
Удобно, если запускаете несколько приложений на одной машине: ненужные LiveReload-серверы больше не пытаются занять общий порт.
Учтите: начиная со Spring Boot 4.1, LiveReload объявлен устаревшим без замены.
Автоматический перезапуск приложения при изменениях в classpath продолжает работать. А обновление страницы в браузере через LiveReload теперь нужно включать явно.
В
application.properties:
spring.devtools.livereload.enabled=true
Удобно, если запускаете несколько приложений на одной машине: ненужные LiveReload-серверы больше не пытаются занять общий порт.
Учтите: начиная со Spring Boot 4.1, LiveReload объявлен устаревшим без замены.
❤5👍2🔥1