Обновить
128K+

Java *

Объектно-ориентированный язык программирования

135,33
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Оптимизация генерации ресурсов в Java, три Ryzen и 225 замеров

Уровень сложностиПростой
Время на прочтение18 мин
Охват и читатели6.3K

Почему ручное разбиение задач оказалось быстрее parallel().collect() в большинстве наших тестов.

Привет, Хабр!

Меня зовут Юрий, и уже десять лет я разрабатываю The Great Tribes — пошаговую 4X-стратегию, в которой игроку предстоит провести свою цивилизацию от первобытных племён до космической эпохи.

Игра создаётся на Java с использованием LWJGL и собственного игрового движка. Мы не используем Unity или Unreal Engine: за годы разработки у проекта сформировались собственная архитектура, система процедурной генерации мира и довольно специфические требования к обработке больших карт.

Сегодня хочу рассказать об одной небольшой, но интересной оптимизации.

Мы решили ускорить генерацию природных ресурсов, написали три реализации одного алгоритма и протестировали их на трёх компьютерах с процессорами AMD Ryzen.

Результаты оказались любопытными: более компактный вариант с parallel().collect() в большинстве измерений уступил реализации с ручным разбиением массива на части.

Но обо всём по порядку.

Читать далее

Новости

Linux из Java без JNI: от FFM и /dev/kvm до интерактивной консоли

Уровень сложностиСложный
Время на прочтение9 мин
Охват и читатели8K

Да, направление здесь немного непривычное: обычно Java запускают в Linux, а здесь я решил попробовать запустить Linux из Java.

Обычно Java и KVM находятся довольно далеко друг от друга: с одной стороны JVM и управляемая память, с другой /dev/kvm, ioctl, регистры vCPU и физическая память guest ОС. В этой статье разберём, как связать эти два мира через Foreign Function & Memory API без JNI. На примере panama-kvm пройдём путь от первого вызова KVM API до загрузки Linux, настройки памяти, обработки VM exits и интерактивной консоли внутри гостевой системы.

Запустить VM из Java

Hibernate getReference(): когда SELECT вообще не нужен

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели6.8K

Проблема N+1 запросов — классическая проблема ORM, с которой сталкивается практически каждый разработчик, работающий с Hibernate. Обычно рекомендуемыми решениями являются использование JOIN FETCH или EntityGraph, но существует еще один инструмент, который часто остается в тени — метод load().

Читать далее

Платёж списывается дважды. Найдите причину в коде, который прошёл ревью

Уровень сложностиСредний
Время на прочтение28 мин
Охват и читатели9.6K

Платёжный сервис прошёл ревью, тесты зелёные, в базе один успешный платёж — а с карты списали деньги дважды. Причём в двух инцидентах к дублю привели разные сценарии. Разбираемся по коду и логам, откуда взялись повторные списания и как построить идемпотентность, которая закрывает оба случая.

Проверить решение

Java Digest 40: что изменилось в Java 27 и почему Spring ускоряет релизы

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели7.4K

Всем привет! 👋👋👋👋 Мы — Java-разработчики Т-Банка: Андрей, Арсений, Роман и Константин. Собираем интересные новости, статьи, туториалы и другие материалы из мира Java-разработки и делимся этим со всем сообществом.

В этом выпуске рассказываем о том, что Java 27 вышла с компактными заголовками объектов и G1 по умолчанию, Сбер представил собственный SberJDK, а Spring меняет подход к релизам из-за потока AI-найденных уязвимостей. Разбираем новые фичи, смотрим, как Netflix применяет AOT Cache, и выясняем, почему Spring Data JDBC — это не просто упрощенный Hibernate. Обо всем этом читайте в выпуске 🙂

Читать выпуск 40

Spring Config Import. Без Магии

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели7.2K

Всем привет! Меня зовут Дмитрий Мазуров, я контрибьютор проекта Axelix. Это open-source продукт, который помогает находить типичные проблемы и неэффективности в Spring Boot приложениях.

В прошлой статье Михаил разбирал EnvironmentPostProcessor и мимоходом упомянул ConfigDataEnvironmentPostProcessor, который грузит application.yml, разбирается с профилями и обрабатывает spring.config.import. Сегодня заглянем внутрь него.

Поводом стала вполне практическая задача. Нам понадобилось подружить Axelix Master с Vault так, чтобы пользователь настраивал его через наши собственные свойства под axelix.master.*, а не через spring.cloud.vault.*. Чтобы сделать это аккуратно, пришлось разобраться, как вообще работают spring.config.import.

Читать далее

Виртуальные потоки после JDK 24: что изменилось в Java

Время на прочтение25 мин
Охват и читатели6.7K

JEP 491 в JDK 24 устранил закрепление виртуальных потоков за потоками-носителями при работе с мониторами. Именно из-за этого механизма переход на виртуальные потоки в Java 21 был рискованным для блокирующего кода внутри synchronized. Однако закрепление всё ещё возможно при выполнении нативного кода, загрузке классов и локальных файловых операциях в Linux. Поэтому событие JDK Flight Recorder (JFR) jdk.VirtualThreadPinned по-прежнему должно входить в контрольный список перед внедрением.

Читать далее

Может ли локальная 27B-модель расследовать продакшен-инцидент как Claude? Две RTX 5090, около 40 прогонов и одна гонка

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели6K

Реальный продакшен-инцидент: пул соединений забит, активных запросов дюжина, рестарт помогает. Claude нашёл причину за двадцать минут. Нормальный человек на этом обновил бы библиотеку и пошёл дальше, но у меня две RTX 5090 стояли без дела, и зудел вопрос: а локальная 27B-модель смогла бы? Тот же промпт, тот же код, та же песочница, семь локальных моделей, около 40 прогонов. В промпте, кстати, осталась одна правдоподобная, но ложная гипотеза инженера. Я не планировал делать из неё ловушку. Она стала главным фильтром всего эксперимента.

Читать далее

Как я сделал лыжный тренер на датчиках и вайб‑кодинге — вместо подписки на готовый

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели6.1K

На рынке есть готовые продукты: пара датчиков на ботинки, приложение считает технику катания, подсказывает, что тренировать. Работает неплохо. Но по подписке — и недёшево: например, у Carv безлимитный сезонный доступ стоит $249 / £199 в год. И вот тут возникает вопрос: насколько эта подписка вообще оправдана? Датчик — это акселерометр с гироскопом за пару долларов и Bluetooth‑модуль, приложение — по сути обработка сигнала и немного статистики. Разовая покупка железа плюс разработка — понятные, конечные затраты. А подписка — плата за то, что уже посчитано один раз и с тех пор просто работает. Есть ощущение, что здесь платишь не за вычисления, а за то, что вход на рынок для конкурентов высокий: откалибровать алгоритмы, написать мобильное приложение, а потом ещё поддерживать серверы, пользователей и производство железа — дорого и долго. Подписка отбивает эти инвестиции. Но большая часть этого барьера — стоимость разработки, а она за последние пару лет резко упала: с ИИ‑инструментами то, что раньше требовало команды, становится посильным для одного человека. Продукт для рынка так не сделать — там нужна калибровка на тысячах лыжников, поддержка и сертификация. А вот любительский инструмент — вполне.

Второй мотив — практический: проверить на реальном, не игрушечном проекте, что сейчас умеют ИИ‑инструменты в разработке. Не автодополнение строк, а весь путь: от идеи и архитектуры до калибровки алгоритмов на реальных данных с настоящего железа. Ниже, в разделе 9, — про то, как это было на практике, а не в презентациях.

Читать далее

Senior Java — это кто? Почему одинаковый title ещё не означает одинаковую работу

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели4.8K

Две вакансии называются Senior Java. В одной ищут Spring/PostgreSQL/Kafka backend, в другой JMM, GC, lock‑free и low latency. А в третьей Senior уже незаметно превращается в Tech Lead. Я посмотрела реальные Java‑вакансии глазами IT‑рекрутера и проверила, насколько вообще название позиции помогает понять, кого на самом деле ищет компания.

Читать далее

Строим стены в SCAD++ в турбо режиме

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели10K

В этой статье мы немного оживим SCAD++ и немного сэкономим времени на чай :-) Конструктора, проектировщики милости просим.

Читать далее

Прощай, Кинопоиск

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели94K

В октябре 2013 года яндекс выкупил КП. Для меня на тот момент это ничего не значило, ведь сервис остался прежним и продолжал работать. И перезапуск 2015 года не сильно повлиял на мое мнение, ведь все вернули обратно. Но всё-таки они реализовали свою идею в 2018 году и добавили онлайн просмотр. Следующая неприятность случилась в 2019 году, когда авторизацию сделали только через яндекс. Именно тогда мне и пришлось зарегистрироваться в этой экосистеме. А в 2020 году изменили систему оценок. Все это, несомненно, не доставляло положительных эмоций. Но то, что происходит в последние годы, совершенно другая история...

Читать далее

Не каждый AI-вызов должен генерировать текст

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели7.4K

Иногда от модели нужен не красивый ответ, а быстрое решение. Пропустить запрос или заблокировать, выбрать маршрут, оценить результат, отфильтровать документы для RAG.

Для этого появился Spring AI TypeSafe. Проект интегрирует Jev API, который отвечает на типизированные вопросы числовыми значениями и не генерирует текст.

Читать далее

Ближайшие события

DSL в эпоху ИИ: делать или не делать…

Уровень сложностиСложный
Время на прочтение12 мин
Охват и читатели6.5K

Всем привет. Меня зовут Сергей и я руковожу разработкой автоматизации внутренних бизнес-процессов в рамках Центра управления процессами Московской Биржи.

В эпоху повсеместного распространения инструментов на базе искусственного интеллекта (ИИ) вопрос применения доменно-специфичных языков (DSL, domain specific language) вызывает неоднозначную реакцию. С одной стороны, большие языковые модели прекрасно понимают широкое многообразие естественного языка и могут работать напрямую с ним. С другой стороны, присущая любому человеческому общению неоднозначность оставляет простор для неправильных трактовок и ошибок.

Интересно. Давай дальше...

DBML Diagram для IntelliJ IDEA с офлайн превью и открытым исходным кодом

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели5.8K

Привет! На связи Boost for Java. Развиваем DBML Diagram — open source плагин для IntelliJ IDEA и других совместимых IDE на платформе IntelliJ. Он строит ER-диаграмму рядом с открытым .dbml-файлом: меняете описание таблиц и связей — превью обновляется прямо в редакторе. Построение диаграммы работает локально, без отправки схемы во внешний сервис.

В этой статье покажем возможности версии 0.1.0, пользу работы со схемами прямо в IntelliJ IDEA и устройство плагина. Отдельно расскажем о планах интеграции с dbdiagram.io для публикации локальных изменений в общую схему.

Проект открыт: будем рады предложениям, примерам проблемных схем и участию в разработке.

Плагин в JetBrains Marketplace · Исходный код на GitHub

Читать далее

«Динамические» аспекты — как я писал стартер для создания аспектов прямо из конфига

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели7.8K

Всем привет, я - Нуждин Дмитрий, Backend Java разработчик в ГК Иннотех. Хотел поделиться небольшой историей о том, как я писал spring boot стартер для создания сквозной логики в приложениях через одну только конфигурацию (application.yaml), не затрагивая сам исходный код.

Сначала проведу небольшой экскурс в аспекты для тех, кто не сталкивался/редко сталкивался с ними, для того, чтобы появилось понимание, а зачем вообще был создан стартер "динамических" аспектов. Затем уже расскажу про сам стартер и решаемые им задачи.

Читать далее

Мой первый outbox

Уровень сложностиПростой
Время на прочтение13 мин
Охват и читатели7.4K

Привет! Меня зовут Серёжа. Я работаю Java‑разработчиком. В этой статье хочу поделиться своим первым опытом реализации паттерна «outbox».

Решил я это сделать по нескольким причинам:

1. Зафиксировать для себя «на бумаге» архитектурное решение и полученный опыт.

2. Поделиться знаниями и идеями с теми разработчиками, кому только предстоит впервые выполнить похожую задачу.

3. Получить от профессионалов комментарии и замечания по улучшению моего решения.

Итак, давайте начнём!

Посмотреть на реализацию

Консенсус без Raft: ORCHID в Grid (фаза Курамото + quorum)

Уровень сложностиСложный
Время на прочтение12 мин
Охват и читатели5.6K

Три узла, одна база, клиент шлёт UPSERT. Нужно решить две вещи сразу: разрешить запись только на согласованном кластере и не допустить, чтобы после обрыва связи между узлами в журналах оказались разные версии одних и тех же данных.

В стеке вроде Raft логика такая: узлы голосуют за лидера, пишет только он; у каждого периода лидерства есть порядковый номер (term), чтобы отличать старые голоса от новых; лидер пропал — новые выборы. В Grid допуск записи устроен иначе. Лидер не выбирается голосованием. Вместо этого узлы обмениваются числовым параметром синхронизации (фазой, в смысле модели Курамото) и отдельно подтверждают каждую операцию контрольной суммой её содержимого. Этот протокол называется ORCHID.

Читать далее

Мы обновили Spring Boot до 4. Вот что сломалось

Уровень сложностиСредний
Время на прочтение25 мин
Охват и читатели4.9K

Это наш опыт миграции со Spring Boot 3.5.12 и Spring Cloud 2025.0.1 на Boot 4.0.6 и Spring Cloud 2025.1.x в большом коммерческом проекте, дополненный ссылками на официальные изменения Boot 4. В спорных местах ссылки стоят прямо в тексте, а в конце есть раздел «Источники».

Читать далее

Нашёл ошибки в моде Create и проверил их в игре

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели7.6K

В этой статье мы разберём ошибки в одном из самых популярных модов для Minecraft — Create. Посмотрим, как они проявляются прямо в игре, и отправим пулл-реквесты с исправлениями.

Поехали!
1
23 ...