Распределение памяти на JVM без блокировки - PullRequest
10 голосов
/ 16 ноября 2011

Когда вы делаете new Object() в Java, jvm использует алгоритм без блокировки для выделения памяти или он должен блокироваться?

JVM, о которой я говорю в этом случае, - это Hotspot VM. Из того небольшого, что я знаю об этом, просто нужно увеличить указатель, чтобы выделить память очень быстро. Но в случае нескольких потоков требуется ли для этого приращения блокировка или CAS?

Ответы [ 2 ]

6 голосов
/ 16 ноября 2011

как уже упоминалось, по умолчанию используется 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's TLAB, successfully allocating an object if the bumped mark falls before a TLAB-specific limit address.

Более подробная информация о размерах в этом блоге и все подробности, которые вы можете пожелать в этом блоге.

Короче говоря, он является локальным для потока, если только TLAB не заполнен, в этом случае вам нужно будет подключиться к общему пулу, а это операция CAS.

Другим осложняющим фактором может быть thisошибка , которая описывает ложное совместное использование в маркировке карты, которая не является блокировкой как таковой, но ухудшит производительность (если именно поэтому вы спрашиваете о блокировке).Похоже, это исправлено в java7.

5 голосов
/ 16 ноября 2011

Зависит от :) Я полагаю, что если вы используете опцию -XX:+UseTLAB (которая по умолчанию для виртуальных машин Sun / Oracle, как отметил Питер), она будет без конфликтов в "счастливом"путь "из-за локальных потоков кучи.Конечно, если требуется сборка мусора из-за недостатка места, мы попадаем на территорию параллельных сборщиков мусора и т. Д., Где есть различные реализации, и все это очень сложно ... и, конечно, это происходит постоянно.

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

...