Все записи

Как ломался пиннинг в Java 21 и что починили в Java 24

Виртуальные потоки задумывались как способ удешевить конкурентность и ускорить I/O. В JDK 24 сняли проблему пиннинга в synchronized, а в JDK 25 довели до стабильности ключевые улучшения вокруг Loom. 

В этом материале Денис, руководитель группы R&D, рассказал, что это значит на практике и какие шаги стоит сделать уже сейчас.

Денис1.jpg

Виртуальные потоки кажутся простым способом ускорить I/O. Но на Java 21 многие сталкивались со стагнацией.

Причина — пиннинг: код входит в synchronized и внутри выполняет блокирующую операцию (I/O, wait(), ожидание монитора), виртуальный поток «прибивается» к carrier-потоку и не может отмонтироваться.

Под нагрузкой это быстро исчерпывает пул carrier-потоков и «замораживает» обработку.

Часто как побочный симптом растет число соединений в CLOSE_WAIT, потому что обработчики не успевают корректно закрывать сокеты.


Что изменилось в JDK 24

В JDK 24 реализован механизм, благодаря которому виртуальные потоки больше не пиннятся внутри synchronized, включая ожидание монитора и Object.wait()): JVM умеет корректно «размонтировать/перемонтировать» поток.

Это почти полностью снимает главный источник проблем с Loom и в большинстве случаев избавляет от необходимости переписывать synchronized на ReentrantLock ради масштабируемости. Редкие источники пиннинга остались вне synchronized, например, JNI — их стоит искать профилированием и наблюдаемостью (JFR-события).


Что стало удобнее в JDK 25

Scoped Values становятся финальными — надежная альтернатива ThreadLocal для передачи неизменяемого контекста без накладных расходов и утечек. Structured Concurrency остается в статусе preview и хорошо сочетается с моделью виртуальных потоков.


Что имеет смысл сделать уже сейчас без перелома архитектуры

  1. Планировать переход на JDK 25, чтобы получить финальные Scoped Values и полный набор улучшений Loom.
  2. Запускать задачи через Executors.newVirtualThreadPerTaskExecutor() или фабрику Thread.ofVirtual() — так вы используете Loom «как задумано».
  3. Проаудировать горячие пути — убрать блокирующие вызовы из-под synchronized, сузить критические секции. При необходимости оставлять ReentrantLock, но не рассчитывать на него как на универсальное лекарство от пиннинга.
  4. Включить наблюдаемость — отслеживать события пиннинга виртуальных потоков, рост очередей/времени ожидания и аномальный CLOSE_WAIT.
  5. Там, где сегодня используются тяжелые ThreadLocal, по возможности переносить на Scoped Values после обновления до JDK 25 и обновлять библиотеки до версий с поддержкой Loom.

Похожие новости

Как отдохнуть на майских и не потерять эффективность

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

Мы обсудили эту проблему с Машей — тренером в группе обучения и развития. Она поделилась советами, которые помогают пройти такие периоды без перегруза: сохранить эффективность и при этом действительно отдохнуть.

ИИ для бизнес-аналитика

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

Часто вопрос не в самих инструментах, а в том, как их применять в конкретных задачах. Если смотреть шире, ИИ может помочь увидеть слабые места в процессах, найти точки роста и повлиять на эффективность бизнеса.

Мы поговорили с Полиной, бизнес-аналитиком в команде Скорозвон, и задали ей несколько вопросов: где ИИ полезен на практике, какие результаты удалось получить и какие инструменты стоит попробовать.

Клиент + Продакт + Сервис = QBR

Иногда кажется, что продукт, сервис и клиент живут каждый в своей реальности. Клиентский сервис отвечает на входящие запросы, продукт приходит к клиенту, когда нужно что-то проверить, а сам клиент не всегда понимает, влияет ли он вообще на развитие продукта.

Даша, менеджер продукта в команде Скорозвон, рассказала, как они выстроили регулярное взаимодействие с клиентами и почему в таких встречах одновременно нужны продукт и клиентский сервис.

Все новости