Является ли распределение памяти на JVM незатронутым
Когда вы выполняете new Object()
в Java, использует ли jvm блокирующий алгоритм для выделения памяти или блокировки?
JVM Я имею в виду, что в этом случае находится виртуальная точка Hotspot. Из того, что я знаю об этом, нужно просто увеличить указатель, чтобы быстро распределить память. Но в случае нескольких потоков, требуется ли для этого приращения блокировка или CAS?
Ответы
Ответ 1
как упоминалось, по умолчанию используется tlab. Описанное поведение описано в этом глоссарии следующим образом
TLAB
Thread-local allocation buffer. Used to allocate heap space quickly without synchronization. Compiled code has a "fast path" of a few instructions which tries to bump a high-water mark in the current thread TLAB, successfully allocating an object if the bumped mark falls before a TLAB-specific limit address.
Подробнее о размерах в в этом блоге и всех подробностях, которые вы могли бы захотеть в этот блог.
Вкратце это поток локальный, если TLAB не заполнен, и в этом случае вам нужно нажать на общий пул, и это операция CAS.
Другим осложняющим фактором может быть эта ошибка, которая описывает ложное совместное использование в маркировке карт, которая не является блокировкой как таковая, но может повредить производительность (если это почему вы спрашиваете о блокировке). Похоже, что это исправлено в java7.
Ответ 2
Это зависит:) Я считаю, что если вы используете параметр -XX:+UseTLAB
(который является значением по умолчанию для JVM Sun/Oracle, как отмечено Питер), это будет бесспорным в "счастливом пути" из-за ниток-локальных куч. Конечно, если сбор мусора требуется из-за нехватки места, мы попадаем на территорию параллельных ГЦ и т.д., Где есть различные реализации, и все это очень сложно... и, конечно же, это все время движется.
Даже в модели "одиночной кучи" я ожидаю, что распределение будет сильно оптимизировано - не столько приобретение блокировки в нормальном смысле, сколько возможное выполнение атомных приращений. Я не могу сказать, что знаю подробности.