Quarkus: три промаха кеша, один вызов метода
Несколько запросов одновременно обращаются к отсутствующему ключу. В Quarkus 3.27 с кешем на Caffeine аннотация
Это работает в пределах одного кеша, одного ключа и одного экземпляра приложения. У объектов, входящих в ключ, должны корректно работать equals() и hashCode(). Разные ключи обрабатываются отдельно. Между экземплярами приложения такой блокировки нет.
При попадании в кеш тело метода не выполняется.
Кеширование в Quarkus 3.27
Несколько запросов одновременно обращаются к отсутствующему ключу. В Quarkus 3.27 с кешем на Caffeine аннотация
@CacheResult обрабатывает такие обращения вместе: первый вызов вычисляет значение, остальные ждут результат.Это работает в пределах одного кеша, одного ключа и одного экземпляра приложения. У объектов, входящих в ключ, должны корректно работать equals() и hashCode(). Разные ключи обрабатываются отдельно. Между экземплярами приложения такой блокировки нет.
lockTimeout задаёт предел ожидания блокировки. Это не таймаут выполнения самого метода. По умолчанию предел ожидания отключён.При попадании в кеш тело метода не выполняется.
Кеширование в Quarkus 3.27
ResourceLock в JUnit: параллельный доступ на чтение
В параллельных тестах JUnit Jupiter
Два теста с
Параллельный запуск нужно включить и задать режим выполнения, например через
Это координация тестов Jupiter, объявивших один ресурс, а не блокировка между процессами ОС.
Parallel Execution и Synchronization
В параллельных тестах JUnit Jupiter
@ResourceLock объявляет общий ресурс по строковому имени и режим доступа к нему.Два теста с
READ для одного ресурса могут выполняться одновременно. READ_WRITE конфликтует с любым другим доступом к тому же ресурсу. Для аннотации на тестовом методе блокировка захватывается до @BeforeEach и освобождается после @AfterEach.Параллельный запуск нужно включить и задать режим выполнения, например через
@Execution(CONCURRENT). Одного флага enabled для параллельного выполнения тестов недостаточно.Это координация тестов Jupiter, объявивших один ресурс, а не блокировка между процессами ОС.
Parallel Execution и Synchronization
NMT в HotSpot: сначала включить, потом искать рост
Native Memory Tracking нужно включить при старте JVM, например флагом
После прогрева сохраните базу командой
NMT учитывает внутренние аллокации HotSpot, но не всю память стороннего native-кода. Рост категории даёт направление для диагностики, а не готовое доказательство утечки.
На карточке — команды из руководства Oracle Java 25.
Native Memory Tracking в HotSpot
#jvm #java
Native Memory Tracking нужно включить при старте JVM, например флагом
-XX:NativeMemoryTracking=summary. Если процесс уже работает без NMT, включить сбор через jcmd не получится.После прогрева сохраните базу командой
jcmd <pid> VM.native_memory baseline. Позже jcmd <pid> VM.native_memory summary.diff покажет изменения по категориям относительно неё.NMT учитывает внутренние аллокации HotSpot, но не всю память стороннего native-кода. Рост категории даёт направление для диагностики, а не готовое доказательство утечки.
На карточке — команды из руководства Oracle Java 25.
Native Memory Tracking в HotSpot
#jvm #java