Если говорить про «прикольные штуки с конференций по программированию», Java Ring, пожалуй, самая крутая.
Ты получал своё кольцо, записывал свои предпочтения по кофе, а затем использовал его для аутентификации и получения бесплатного «Java» на JavaOne 1998.
Конечно, внутри него был небольшой микропроцессор, который запускал JVM, с целыми 6 КБ NVRAM. В то время они заявляли(?), что «конференция — это компьютер», потому что эти кольца носили 14 000 участников.
Насколько я могу понять, никто не использовал какое-либо… настоящее P2P-вычисление. Тем не менее, в маркетинговых материалах это называли параллельным компьютером.
Забавно, но спустя почти 30 лет эта идея может продолжать жить. Некто по имени yamad проделал отличную работу по реверс-инжинирингу Java Ring и ведёт подробный блог об этом. Замена севшей герметичной батареи оказалась сложной задачей, но, судя по всему, ему удалось запускать и записывать новые программы на устройство, которое работает на оригинальной JVM!
Мне очень, очень хочется теперь раздобыть несколько Java Ring просто ради того, чтобы проверить, можно ли сделать с ними хоть что-нибудь в стиле P2P…
Вот оригинальная серия постов в блоге yamad. Оказалось, что найти IDE было отдельным приключением!
https://yamad.jp/en/
👉 Java Portal
Ты получал своё кольцо, записывал свои предпочтения по кофе, а затем использовал его для аутентификации и получения бесплатного «Java» на JavaOne 1998.
Конечно, внутри него был небольшой микропроцессор, который запускал JVM, с целыми 6 КБ NVRAM. В то время они заявляли(?), что «конференция — это компьютер», потому что эти кольца носили 14 000 участников.
Насколько я могу понять, никто не использовал какое-либо… настоящее P2P-вычисление. Тем не менее, в маркетинговых материалах это называли параллельным компьютером.
Забавно, но спустя почти 30 лет эта идея может продолжать жить. Некто по имени yamad проделал отличную работу по реверс-инжинирингу Java Ring и ведёт подробный блог об этом. Замена севшей герметичной батареи оказалась сложной задачей, но, судя по всему, ему удалось запускать и записывать новые программы на устройство, которое работает на оригинальной JVM!
Мне очень, очень хочется теперь раздобыть несколько Java Ring просто ради того, чтобы проверить, можно ли сделать с ними хоть что-нибудь в стиле P2P…
Вот оригинальная серия постов в блоге yamad. Оказалось, что найти IDE было отдельным приключением!
https://yamad.jp/en/
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤3
Не позволяйте одному контейнеру съесть всю память сервера.
Устанавливайте лимиты памяти в Docker с помощью флага
👉 Java Portal
Устанавливайте лимиты памяти в Docker с помощью флага
--memory или через настройки в файле ComposePlease open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
В PostgreSQL 19 autovacuum станет умнее и сможет работать параллельно.
Теперь PostgreSQL сможет запускать сразу несколько autovacuum-воркеров, оценивать риск для каждой таблицы и в первую очередь обслуживать те, где очистка нужнее всего.
Раньше autovacuum мог превращаться в длинную очередь: один воркер обрабатывал таблицы по одной, из-за чего проблемные таблицы могли ждать, пока завершится менее срочная работа.
В PostgreSQL 19 несколько таблиц можно будет очищать одновременно, а приоритет получат таблицы с наибольшим риском.
👉 Java Portal
Теперь PostgreSQL сможет запускать сразу несколько autovacuum-воркеров, оценивать риск для каждой таблицы и в первую очередь обслуживать те, где очистка нужнее всего.
Раньше autovacuum мог превращаться в длинную очередь: один воркер обрабатывал таблицы по одной, из-за чего проблемные таблицы могли ждать, пока завершится менее срочная работа.
В PostgreSQL 19 несколько таблиц можно будет очищать одновременно, а приоритет получат таблицы с наибольшим риском.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
PostgreSQL 19 теперь умеет показывать активность асинхронного ввода-вывода прямо в
Это упрощает понимание:
→ где именно используется асинхронный I/O;
→ какие части плана обращаются к хранилищу;
→ получает ли запрос преимущество от асинхронного чтения.
Меньше догадок и больше прозрачности в том, что PostgreSQL делает под капотом плана выполнения запроса.
В PostgreSQL 18 появился асинхронный I/O.
А в PostgreSQL 19 стало проще увидеть, как он работает.
👉 Java Portal
EXPLAIN.Это упрощает понимание:
→ где именно используется асинхронный I/O;
→ какие части плана обращаются к хранилищу;
→ получает ли запрос преимущество от асинхронного чтения.
Меньше догадок и больше прозрачности в том, что PostgreSQL делает под капотом плана выполнения запроса.
В PostgreSQL 18 появился асинхронный I/O.
А в PostgreSQL 19 стало проще увидеть, как он работает.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Используйте
✅
✅ Оберните компаратор в
✅ Для сортировки по нескольким полям добавляйте
#Java #Comparator
👉 Java Portal
Comparator.nullsFirst() или Comparator.nullsLast(), если ключи сортировки могут быть null.✅
comparing(User::getName) выбросит NullPointerException, если getName() вернёт null.✅ Оберните компаратор в
nullsFirst() или nullsLast(), чтобы явно задать порядок для null.✅ Для сортировки по нескольким полям добавляйте
thenComparing().#Java #Comparator
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2
A Compiler Writing Journey — практическое руководство по созданию компиляторов.
https://github.com/DoctorWkt/acwj
👉 Java Portal
https://github.com/DoctorWkt/acwj
Please open Telegram to view this post
VIEW IN TELEGRAM
Анимированное введение в преобразование Фурье от 3Blue1Brown.
https://youtu.be/spUNpyF58BY
👉 Java Portal
https://youtu.be/spUNpyF58BY
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
But what is the Fourier Transform? A visual introduction.
An animated introduction to the Fourier Transform.
Help fund future projects: https://www.patreon.com/3blue1brown
An equally valuable form of support is to simply share some of the videos.
Special thanks to these supporters: http://3b1b.co/fourier-thanks…
Help fund future projects: https://www.patreon.com/3blue1brown
An equally valuable form of support is to simply share some of the videos.
Special thanks to these supporters: http://3b1b.co/fourier-thanks…
В JVM уже есть вполне хороший встроенный профайлер.
Он доступен ещё с Java 11, но многие до сих пор им не пользуются.
Называется JDK Flight Recorder (JFR). В JEP 328 для него даже был задан ориентир: не более 1% overhead в конфигурации по умолчанию на SPECjbb2015.
JFR можно включить прямо для уже запущенного процесса:
По умолчанию он не активен — возможно, поэтому о нём часто забывают.
👉 Java Portal
Он доступен ещё с Java 11, но многие до сих пор им не пользуются.
Называется JDK Flight Recorder (JFR). В JEP 328 для него даже был задан ориентир: не более 1% overhead в конфигурации по умолчанию на SPECjbb2015.
JFR можно включить прямо для уже запущенного процесса:
jcmd <pid> JFR.start
По умолчанию он не активен — возможно, поэтому о нём часто забывают.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Spring Boot 4: для подключения поддерживаемых технологий теперь лучше использовать более узкие, специализированные starter-зависимости.
✅ В Boot 4 появились более компактные модули под конкретные технологии
✅
✅ Для Flyway, Liquibase и Mongo теперь нужны отдельные starter’ы
#SpringBoot4 #Modular
👉 Java Portal
✅ В Boot 4 появились более компактные модули под конкретные технологии
✅
spring-boot-starter-* подключает соответствующую автоконфигурацию✅ Для Flyway, Liquibase и Mongo теперь нужны отдельные starter’ы
#SpringBoot4 #Modular
Please open Telegram to view this post
VIEW IN TELEGRAM
Вы создали составной индекс:
Затем выполнили запрос:
Результат?
База данных проигнорировала индекс и выполнила Sequential Scan (полное последовательное сканирование таблицы).
Почему?🤔
Разве индекс не должен использоваться, если
Что изменится, если запросы будут такими:
Понимание порядка полей в составных индексах — одна из самых важных оптимизаций производительности SQL, которую должен знать каждый backend-разработчик.
👉 Java Portal
(first_name, last_name, city)
Затем выполнили запрос:
SELECT *
FROM users
WHERE last_name = 'Smith';
Результат?
База данных проигнорировала индекс и выполнила Sequential Scan (полное последовательное сканирование таблицы).
Почему?
Разве индекс не должен использоваться, если
last_name является его частью?Что изменится, если запросы будут такими:
WHERE first_name = ?
WHERE first_name = ? AND last_name = ?
WHERE first_name = ? AND city = ?
Понимание порядка полей в составных индексах — одна из самых важных оптимизаций производительности SQL, которую должен знать каждый backend-разработчик.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Собираем бэкенд-комьюнити на JVM Day
Бэкендеры, 29 августа в Москве пройдет хардкорная конференция. Ждут своих: Java-, Scala- и Kotlin-разработчиков, архитекторов и тимлидов.
Здесь выступят и расскажут:
— Андрей Кулешов — что нового в мире JVM за год.
— Сергей Петрелевич — разработка по Mechanical Sympathy.
— Александр Ланцов — Java после Loom: другие модели concurrency.
— Антон Курако — как бенчмарки вводят в заблуждение.
А вечером во дворе T-Space — посиделки, интерактивы и открытый микрофон с историями ошибок.
Мест мало, а цена билета будет расти.
Успевай зарегистрироваться
Бэкендеры, 29 августа в Москве пройдет хардкорная конференция. Ждут своих: Java-, Scala- и Kotlin-разработчиков, архитекторов и тимлидов.
Здесь выступят и расскажут:
— Андрей Кулешов — что нового в мире JVM за год.
— Сергей Петрелевич — разработка по Mechanical Sympathy.
— Александр Ланцов — Java после Loom: другие модели concurrency.
— Антон Курако — как бенчмарки вводят в заблуждение.
А вечером во дворе T-Space — посиделки, интерактивы и открытый микрофон с историями ошибок.
Мест мало, а цена билета будет расти.
Успевай зарегистрироваться
💡 Используй
✅
✅
✅ Удобно для проверок вроде «тот же день» или «тот же час»
#Java #Time
👉 Java Portal
Instant.truncatedTo(...), когда нужно сравнивать время с точностью до дня, часа или минуты.✅
Instant.equals() сравнивает значение целиком, поэтому разница даже в наносекундах даст false✅
truncateTo(ChronoUnit.DAYS) отбрасывает более мелкие единицы времени✅ Удобно для проверок вроде «тот же день» или «тот же час»
#Java #Time
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
В Java есть несколько сборщиков мусора, и некоторые из них действительно могут вызывать паузы, которые останавливают приложение на секунды.
Но ZGC работает иначе.
В JEP 439 прямо указано: паузы ZGC стабильно измеряются в микросекундах, тогда как у G1 — сборщика по умолчанию — они могут составлять от миллисекунд до секунд.
При этом длительность пауз ZGC не растёт вместе с размером heap: согласно официальной документации, он рассчитан на heap от нескольких сотен мегабайт до 16 ТБ.
Важно: ZGC не является сборщиком по умолчанию. По умолчанию используется G1.
ZGC нужно включать вручную:
А начиная с Java 23 этот флаг уже включает generational-режим ZGC, который и считается рекомендуемым.
👉 Java Portal
Но ZGC работает иначе.
В JEP 439 прямо указано: паузы ZGC стабильно измеряются в микросекундах, тогда как у G1 — сборщика по умолчанию — они могут составлять от миллисекунд до секунд.
При этом длительность пауз ZGC не растёт вместе с размером heap: согласно официальной документации, он рассчитан на heap от нескольких сотен мегабайт до 16 ТБ.
Важно: ZGC не является сборщиком по умолчанию. По умолчанию используется G1.
ZGC нужно включать вручную:
-XX:+UseZGC
А начиная с Java 23 этот флаг уже включает generational-режим ZGC, который и считается рекомендуемым.
Please open Telegram to view this post
VIEW IN TELEGRAM
Используйте
✅
✅ Для намеренной обработки данных лучше использовать
#Java #Streams
👉 Java Portal
Stream.peek() только для отладки, а не для реальной логики.✅
peek() выполняется как побочный эффект, поэтому его вызов легко не заметить или вообще потерять при выполнении Stream pipeline.✅ Для намеренной обработки данных лучше использовать
map() или forEach().#Java #Streams
Please open Telegram to view this post
VIEW IN TELEGRAM
Флаг Java, который снижает потребление памяти без единого изменения в коде.
Compact Object Headers уменьшают размер заголовка каждого объекта с 16 до 8 байт на 64-битных архитектурах.
В одном из сценариев бенчмарка SPECjbb2015 в JEP указывается снижение использования heap на 22% и CPU на 8% — OpenJDK, JEP 519.
Более того, согласно JEP 534, Amazon уже использует эту возможность в продакшене в сотнях сервисов, причём большинство из них работает на бэкпортах для Java 17 и 21.
В JDK 25 эту опцию нужно включать вручную:
Но есть важный момент: JEP 534 предлагает сделать Compact Object Headers поведением по умолчанию в JDK 27.
👉 Java Portal
Compact Object Headers уменьшают размер заголовка каждого объекта с 16 до 8 байт на 64-битных архитектурах.
В одном из сценариев бенчмарка SPECjbb2015 в JEP указывается снижение использования heap на 22% и CPU на 8% — OpenJDK, JEP 519.
Более того, согласно JEP 534, Amazon уже использует эту возможность в продакшене в сотнях сервисов, причём большинство из них работает на бэкпортах для Java 17 и 21.
В JDK 25 эту опцию нужно включать вручную:
-XX:+UseCompactObjectHeadersНо есть важный момент: JEP 534 предлагает сделать Compact Object Headers поведением по умолчанию в JDK 27.
Please open Telegram to view this post
VIEW IN TELEGRAM
В Spring Boot 4 больше нет
Для моков в полях всё привычно:
—
—
Но в классах
#SpringBoot4 #Testing
👉 Java Portal
@MockBean — вместо него теперь используется @MockitoBean.Для моков в полях всё привычно:
—
@MockitoBean—
@MockitoSpyBeanНо в классах
@Configuration они больше не используются. Для общих моков теперь рекомендуется подключать тестовые конфигурации через @Import.#SpringBoot4 #Testing
Please open Telegram to view this post
VIEW IN TELEGRAM
Сохрани этот ресурс, если работаешь с SQL.
Это playground без установки, где можно:
- создавать таблицы, выполнять запросы и делиться результатами;
- работать с MySQL, PostgreSQL и SQL Server.
Бесплатно и без установки:
→ http://runsql.com/r
👉 Java Portal
Это playground без установки, где можно:
- создавать таблицы, выполнять запросы и делиться результатами;
- работать с MySQL, PostgreSQL и SQL Server.
Бесплатно и без установки:
→ http://runsql.com/r
Please open Telegram to view this post
VIEW IN TELEGRAM
Runsql
RunSQL - Online SQL Playground for MySQL, PostgreSQL, and SQL Server
Explore, learn, and share SQL queries in our free online SQL playground. Support for MySQL, PostgreSQL, and SQL Server, perfect for testing and enhancing your SQL skills.
В Spring Boot 4 библиотекой для работы с JSON по умолчанию стала Jackson 3.
✅ Изменились пакеты:
✅ Вместо обычного изменяемого бина
✅ Крайний вариант (устаревший): добавить
#SpringBoot4 #Jackson3
👉 Java Portal
✅ Изменились пакеты:
com.fasterxml → tools.jackson✅ Вместо обычного изменяемого бина
ObjectMapper используется неизменяемый JsonMapper, создаваемый через Builder✅ Крайний вариант (устаревший): добавить
spring-boot-jackson2#SpringBoot4 #Jackson3
Please open Telegram to view this post
VIEW IN TELEGRAM