Java Virtual Machine(JVM) - это посредник между скомпилированной кодом и операционной системой (ОС). Благодаря такой схеме можно легко запускать java приложения на разных платформах. Реализаций JVM много, но самой распространённой является бесплатная HotSpot от OpenJDK.
JVM не просто переводит java команды в команды ОС. Виртуальная машина реализуется так, чтобы выполнять код эффективнее и быстрее.
Рассмотрим, например, как HotSpot оптимизирует действие «взять блокировку».
У JVM есть 3 способа реализации:
▪️Fat или inflated : на основе мониторов объектов (мьютексов). Подходит для случаев, когда есть много претендентов на захват блокировки.
▪️Thin или deflated : с использованием CAS команд. Это быстрее, чем использовать мьютексы. Но из-за необходимости эксклюзивного доступа в условиях большой конкуренции между потоками этот подход неэффективен.
▪️Biased: оптимизированный тип блокировки для случаев, когда с объектом в основном работает один поток. При первом взаимодействии объект ассоциируется с потоком и дальнейшие действия происходят без лишних синхронизаций. Если другой поток захочет захватить блокировку, то начнётся глобальная перестройка или bulk revocation. Это очень неэффективно и для активно конкурирующих сценариев, например, producer-consumer, такой тип блокировки не подойдёт.
Biased блокировка отключена на старте приложения, потому что в этот момент происходит много междупоточных взаимодействий. Но спустя некоторое время она включается и является блокировкой по умолчанию.
Её можно отключить с помощью опции:
-
XX:-UseBiasedLocking
Время включения после старта регулируется флажком-XX:BiasedLockingStartupDelay=500
По умолчанию это значение равно четырём секундам.Для большинства приложений вам не потребуется использовать эти опции. Но для специфичных случаев флажки JVM могут поднять производительность в разы.
#теория