Много записей ThreadLocalMap в памяти - PullRequest
2 голосов
/ 21 октября 2010

Рассмотрим очень большую виртуальную машину Java с большим количеством потоков, на которых работает веб-сервер.

Теперь рассмотрим пример вывода, сгенерированного jmap -histo, который выглядит примерно так:

  4:       5989163      191653216  java.lang.ThreadLocal$ThreadLocalMap$Entry
 10:         46786       49012000  [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry;
 86:         23384        2619008  java.lang.Thread
144:         46750        1122000  java.lang.ThreadLocal$ThreadLocalMap

Если вы выполните деление, получается, что у нас есть 256 экземпляров java.lang.ThreadLocal$ThreadLocalMap$Entry на поток. Вид большого числа, и больше, чем я ожидал, учитывая, что большинство ThreadLocals не должно хранить много значений. Я не вижу так много в Tomcat, когда я использую его функцию обнаружения утечек ThreadLocal.

По какой причине эти ThreadLocalMaps должны быть настолько требовательны к памяти?

Ответы [ 3 ]

1 голос
/ 21 октября 2010

Может быть запущена эта ошибка:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6625723

1 голос
/ 21 октября 2010

Можете ли вы выяснить, каковы значения в локальной карте потока? Вы искали jhat или эквивалентный, чтобы увидеть, на что они ссылаются?

0 голосов
/ 21 октября 2010

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

Я подозреваю, что вы могли использовать ThreadLocal неправильно. Объект ThreadLocal должен быть создан (один раз) и назначен переменной static, как показано в примере в в javadoc .

Если вы создаете объект ThreadLocal в инициализаторе нестатической переменной, то каждый раз, когда выполняется объявление переменной, вы получаете новый локальный поток. Если вы объедините это с пулами потоков, то получите множество бесполезных записей локальной карты потоков.

...