Рассмотрим очень большую виртуальную машину 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 должны быть настолько требовательны к памяти?