Вопрос о модели памяти Java - PullRequest
0 голосов
/ 03 мая 2011

Несколько дней назад я поднял вопрос, чтобы спросить, как использовать ключевое слово 'volatile', и получил ответ. Здесь я хотел бы еще раз поблагодарить за людей, которые помогли мне. Тем не менее, у меня возник новый вопрос о JMM, который в настоящее время я знаю, что есть основная память и отдельная кэш-память потока (может быть, есть более профессиональные термины для них), теперь я хочу знать, что хранится в кэш-памяти потока, копия ссылки на общий объект (копия адреса объекта) или копия общего объекта? Например, я объявляю объект B b = new B (); и доступ к b возможен двумя потоками, тогда, когда поток обращается к b, объект ссылка b копируется и сохраняется в собственной кэш-памяти потока или является объектом , на который указывает b копируется и сохраняется в собственной кэш-памяти потока? Спасибо.

Ответы [ 3 ]

3 голосов
/ 03 мая 2011

Все, что доступно более чем одному потоку, может находиться в «кэше потоков».Это включает ссылки, если они являются частью объектов.Он не будет включать ссылки, хранящиеся в локальных переменных, так как они находятся в стеке и не могут быть доступны из других потоков.

Так что ответ на самом деле "оба".

0 голосов
/ 03 мая 2011

Как правило, вам не нужно знать, когда и где хранится ссылка. Память не просто двухуровневая, она намного сложнее. Сверху вниз у вас есть.

registers
L1 cache
L2 cache
L3 cache
local main memory
nonlocal main memory
swap space.

локальная основная память - это память, локальная для вашего процессора. Вы можете иметь локальную память для другого процессора. Так выполнить

B b = new B();

Он должен выделять некоторую память, которая обычно поступает из TLAB (локального буфера выделения потока). Это пространство памяти обычно находится где-то между L1 и локальной основной памятью. Там могут быть копии на всех уровнях. Однако ссылка должна быть в регистре, чтобы ее можно было присвоить локальной переменной. Он может быть сохранен в стеке и в памяти, а может и нет.

Даже внутри процессора «регистры» - это широкая категория. То, как процессор обращается к памяти и записывает ее в память, может быть удивительно сложной темой, поскольку может сильно повлиять на производительность.

0 голосов
/ 03 мая 2011

Переменная b является ссылкой на объект, который хранится в куче.

...