Является ли распределение памяти на 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, как отмечено Питер), это будет бесспорным в "счастливом пути" из-за ниток-локальных куч. Конечно, если сбор мусора требуется из-за нехватки места, мы попадаем на территорию параллельных ГЦ и т.д., Где есть различные реализации, и все это очень сложно... и, конечно же, это все время движется.

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