Обновить
128K+

Java *

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

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

Как две строки GLSL едва не свели меня с ума

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

Недавно столкнулся с весьма неприятным багом в движке The Great Tribes.

После обновления драйвера AMD игра начала намертво зависать при перемещении камеры, особенно когда на карте открывалась большая территория. Иногда зависал графический драйвер, иногда JVM падала внутри atio6axx.dll.

Самое интересное — на старом драйвере и других видеокартах всё работало нормально!

Начались поиски. Под подозрение попало практически всё: многопоточность OpenGL, VAO, VBO, индексные буферы, тени, модели юнитов и даже glfwSwapBuffers().

Постепенно удалось выяснить, что зависание вызывает отрисовка поверхности карты. А затем внимание переключилось на фрагментный шейдер.

В нём обнаружилась вот такая конструкция:

Читать далее

Новости

Need for Speed Underground 2 на телефоне. Не эмулятор. Сейчас объясню

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

Need for Speed Underground 2 работает на Android без эмулятора: оригинальный exe 2005 года перевели в 8,9 миллиона строк на C и собрали под ARM64. Немного ностальгии, немного техники и пустой файл foobar.

Читать далее

Тестовые данные отдельно, код отдельно: 5 способов изолировать данные в автотестах на Java

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

Статья о том, как развести тестовые данные и код проверок в Java + TestNG. Пять способов — от параметров сборщика до Test Data Factory. С примерами, схемами и разбором ограничений. Для тех, кто только начинает писать автотесты на Java.

Читать далее

Почему BigDecimal считает 1.0 и 1.00 разными числами — и к чему это приводит в Java

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

Цена в базе осталась прежней, но приложение считает, что она изменилась, и повторно отправляет событие. Причина может скрываться в масштабе BigDecimal: equals() сравнивает не только числовое значение, но и количество знаков после запятой, поэтому 1.0 и 1.00 для него не равны. Разберём, как эта особенность влияет на коллекции, денежные расчёты и сравнение данных из разных источников, а также как нормализовать суммы и избежать подобных ошибок.

Разобрать BigDecimal

Переход с Java 21 на Java 25: что действительно перестаёт работать

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

Просто поменять версию в pom.xml может быть недостаточно.

На JDK 25 могут перестать запускаться процессоры аннотаций, сломаться старые параметры JVM и измениться разбор дат. Иногда приложение упадёт сразу. Иногда проблема всплывёт позже, что даже веселее.

В новом переводе от команды Spring АйО собрали реальные несовместимости и проверки, которые стоит выполнить до переезда.

Читать далее

Giga IDE Pro больше не будет. Но это хорошая новость

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

Pro-сборка была важным этапом в развитии GigaIDE: она позволила быстрее развивать профессиональные инструменты, собирать обратную связь от корпоративных пользователей и проверять сценарии, которые выходят за рамки Community-версии. Но у отдельного дистрибутива есть и обратная сторона: пользователю нужно выбирать сборку, командам — отдельно управлять установками, а продукту — поддерживать лишнюю развилку там, где её уже можно убрать.

Читать далее

Java 24 убрала пиннинг synchronized. Почему виртуальные потоки всё ещё тормозят?

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

После перехода на Java 24 виртуальные потоки перестали блокировать носители внутри synchronized. Казалось бы, одним тормозом меньше. Но производительность по‑прежнему упирается в ограничения ресурсов, а старые способы диагностики уже не помогают. Разбираемся, где теперь искать причины задержек и какие настройки стоит пересмотреть.

Найти причину тормозов

Реактивная Java: когда она ускоряет систему, а когда просто усложняет жизнь (часть 1)

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

Часть моей работы — помогать джунам разбираться с архитектурными решениями.

Иногда у нас возникают обсуждения на тему: «Зачем заморачиваться с WebFlux, если можно продолжать писать на Spring MVC?». Чтобы предметно обсуждать эту тему, мы с командой провели внутренний бенчмарк, написали методичку и решили поделиться некоторыми соображениями в этом цикле статей.

В этой — первой — статье я расскажу, как устроены три основные модели обработки запросов в Java, покажу их сильные и слабые стороны и дам критерии, которые помогут выбрать подходящий вариант для вашего проекта. 

Дисклеймер: для Java-сеньоров в этой статье скорее всего ничего нового не будет.

Читать далее

Неожиданный антивайб разработки через ИИ-агентов

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

Менеджеры считают, что ИИ-агенты ускорят разработку в десять раз. Математика говорит, что ускорится только написание. Проверять смысл по-прежнему будут люди, с конечной скоростью, и очередь выстроится к самым опытным. PostgreSQL 19 не вышел в срок. Не потому, что ИИ нашёл много багов, а потому что ИИ научился генерировать правдоподобные отчёты быстрее, чем люди успевают их читать. В статье разбираю, почему так, где настоящий предел и что меняется.

Читать далее

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

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

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

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

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Поехали!

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

Возвращаем трассировку логов Quartz-задач после перехода на Spring Boot 3+

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

Привет! Меня зовут Александр Каненков, я backend-разработчик в компании Домклик.

После перевода сервиса со второго Spring Boot на третий (а у кого-то уже и на четвёртый) мы с командой заметили следующую картину: HTTP-запрос журналируется с traceId, цепочка собирается в трейсе, но стоит сработать задаче Quartz — в журналах worker-потока гордо красуется [NoTrace, NoSpan]. Задача исполняется «в никуда» — без единого идентификатора, вне какого-либо трейса, и связать её с запросом, который её запланировал, невозможно.

Давайте разберём по шагам, почему это случилось и как починить так, чтобы работало и с RAM (in-memory), и с JDBC job store.

Читать далее

Переход на Java 27: гайд по GC, флагам и памяти в контейнере

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

Переход на новый JDK может изменить поведение сервиса даже без изменений в коде: JVM по-другому выбирает GC, расходует память и обрабатывает старые флаги запуска.

В статье разбираем, что меняет Java 27 внутри рантайма и как проверить готовность сервисов к обновлению.

Изучить изменения

Retry policy на практике: подводные камни внедрения

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

Что делать, если произошла ошибка? Житейская мудрость говорит, что можно попробовать еще раз. 

В контексте разработки ПО существует известный и простой паттерн для повышения отказоустойчивости — retry.

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

Привет! Меня зовут Петр Деменев, я Java-разработчик в MTC Web Services. В материале расскажу о нашем горьком, но успешном опыте внедрения политики ретраев в реальный проект и о неочевидных особенностях, с которыми мы столкнулись. В тексте будет акцент не на строгих теоретических канонах, а на реальной жизни, чтобы приземлиться на уровень практического опыта. И попутно расскажу о некоторых способах ретрая.

Читать далее

Отцы и дети. Java и Go

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

Не война двух языков (хоть и бывает), не разные идиомы и взгляды на реализацию делают инструмент “плохим”, а по классике - забивание гвоздей молотком и карго-культ

Читать далее

Трагедия версионирования ПО

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

As we say, two of the most complicated problems in software are naming things and versioning software

Когда-то в кулуарах Devoxx Belgium нечто подобное сказал Томас Вюртингер, лид проекта GraalVM, поясняя детали вот этой нашумевшей статьи. Это не точная цитата, а лишь фраза, призванная обратить внимание на проблему. О ней сегодня мы и поговорим.

Всем привет! Меня зовут Михаил Поливаха, я являюсь техническим лидером Open Source проекта Axelix.

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

Читать далее

Final должен быть final

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

В JDK 26 есть JEP 500 — Prepare to Make Final Mean Final. Теперь JVM предупреждает о попытках изменить через deep reflection final-поле объекта, не объявленное как static. В одном из будущих релизов такие операции планируется запрещать, если владелец приложения не разрешил их явно. В статье разберём:

Читать далее

Новые фичи Java нужны не только на собеседованиях

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

Всем привет! На связи Михаил Поливаха, технический лидер проекта Axelix.

Java переехала на шестимесячный релизный цикл уже довольно давно. Каждые полгода мы получаем новую версию, читаем про очередные JEP, смотрим доклады с конференций. Потом возвращаемся на работу и продолжаем писать примерно тот же самый код, который писали пять лет назад.

И это, кстати, не обязательно плохо. Тащить новую фичу в production только потому, что она новая, не самая выдающаяся инженерная стратегия. Более того, многие приложения всё ещё работают на Java 17, а где-то бодро живёт и Java 11.

Но отсюда возникает закономерный вопрос:

Есть ли у новых возможностей Java применение в обычных, реальных приложениях? Не в презентации, не в игрушечном pet project, а в коде, который решает вполне конкретную задачу?

Да, есть.

Читать далее
1
23 ...