Распределен ли ThreadLocal в TLAB? - PullRequest
3 голосов
/ 07 февраля 2011

Я полагаю, что переменные ThreadLocal расположены в буфере (ах) или TLAB локального выделения потока, я прав?

Мне не удалось найти какой-либо документ, в котором указано, что именно делает некоторый класс, хранящийся в TLAB.Если вы знаете, пожалуйста, разместите ссылку.

Ответы [ 5 ]

7 голосов
/ 07 февраля 2011

Мне не удалось найти какой-либо документ, в котором указано, что именно делает некоторый класс, хранящийся в TLAB. Если вы знаете что-то, напишите ссылку.

На самом деле, это объяснение прямо в сообщении в блоге, на которое вы добавили:

Буфер локального выделения потока (TLAB) - это область Eden, которая используется для выделения одним потоком. Он позволяет потоку выполнять выделение объектов с помощью локальных указателей top и limit потока, что быстрее, чем выполнение атомарной операции над указателем top, совместно используемым потоками.

Каждый поток выделяет память из своего собственного блока Eden, части «Поколения 0» в куче. Практически все хранится в TLAB в течение некоторого времени - вполне возможно, и ваши ThreadLocal s - но они удаляются оттуда после сборки мусора gen0. TLAB предназначены для более быстрого выделения ресурсов, а не для недоступности памяти из других потоков. Более доступное описание из того же блога, на который вы ссылаетесь: Небольшая ветка конфиденциальности, пожалуйста, .

2 голосов
/ 07 февраля 2011

Насколько я понимаю, TLAB используется для размещения объектов всех малых и средних объектов. Ваш ThreadLocal не будет распределен по-другому.

2 голосов
/ 07 февраля 2011

Нет. Вот как это: Начиная с 1.4 каждый поток в Java имеет поле с именем threadLocals, в котором хранится карта. Каждый threadLocal имеет индекс для структуры, поэтому он не использует hashCode (). Представьте себе массив и каждый ThreadLocal хранит индекс слота.

Когда поток умирает и , больше нет ссылок на него, ThreadLocals GC'd. Очень простая идея

Вы можете реализовать свои собственные ThreaLocal (s), расширив Thread и добавив поле для хранения ссылки. Затем приведите Thread к своему классу и возьмите данные.

Так что это не TLAB, а куча, как и любой другой объект.


Исторически существовали реализации со статическим WeakHashMap, которые очень медленно обращались к данным.

1 голос
/ 07 февраля 2011

Я думаю, что только указатель на него есть, а сами данные находятся в какой-то другой области памяти.см http://blogs.oracle.com/jonthecollector/entry/the_real_thing и http://wikis.sun.com/display/MaxineVM/Threads#Threads-Threadlocalvariables

1 голос
/ 07 февраля 2011

Я почти уверен, что это на усмотрение разработчика JVM. Они могут помещать данные в TLAB, если хотят, или в глобальную таблицу с ключом идентификатора потока. Спецификация языка Java, как правило, не касается подобных проблем, поэтому авторы JVM могут развертывать Java на максимально возможном количестве и на разных платформах.

...