2009-12-09 5 views
1

Как вычислить, сколько памяти Java TreeMap должно обрабатывать каждое сопоставление?Использование памяти TreeMap

Я делаю эксперимент с 128 потоками, каждый сбрасывающий 2^17 longs в своем собственном массиве. Все эти 2^24 longs затем отображаются в ints (TreeMap<Long,Integer>), каждая ссылка массива обнуляется перед переходом к следующему.

Это значение должно составлять 128 + 64 МБ для ключей + значений. Я удивлен, получив OutOfMemoryError во время сопоставления с 512 МБ, назначенным этой виртуальной машине.

+1

Вы рассчитываете, сколько места требуется самому дереву? –

ответ

4

Вы считаете, что длинная целая пара ключ/значение на карте занимает всего 12 байт памяти. Это не правильно.

Даже если вы скопируете из примитивного длинного массива, autoboxing автоматически создаст экземпляры объектов Long и Integer в качестве оболочек для примитивных значений, когда вы будете использовать их в качестве ключей и значений карты. Требования к памяти для экземпляров объекта специфичны для VM, но я думаю, что VM для Sun находится в диапазоне 32-48 байт для этих объектов, причем экземпляры в 64-битной VM немного больше. Кроме того, для управления внутренними структурами данных картам нужны дополнительные экземпляры объектов для каждой пары ключ/значение.

+0

Спасибо за указание на проблему бокса, которую я не рассматривал в своем вопросе. Однако 32-48 байт кажется неправильным. Если каждый длинный и целочисленный занимает 32 байта, а отображение (узел) занимает 32 байта (см. Ответ 280Z28), то это будет равно 2^24 * (32 + 32 + 32) = 1536 МБ. Мы наткнулись на ОЗУ и теперь можем успешно выполнить это с 1280 МБ. – 2009-12-10 23:36:48

+0

Я не был на 100% уверен в использовании памяти, но вы должны проверить ее в среде выполнения. С Sun JDK 1.6.0_10 оба экземпляра Integer и Long занимают 20 байтов в 32-битной виртуальной машине и 32 байта в 64-разрядной виртуальной машине. В TreeMap длинная/целая пара ключ/значение занимает 64 байта в 32-битной виртуальной машине и 112 байтах в 64-разрядной виртуальной машине. – jarnbjo

0

Приблизительно из этого Tree Map 4 Docs размер по умолчанию дерева 64M. Он сообщит об OutOfMemoryError, если вы его исключите. Если вы не укажете максимальный размер, он будет по умолчанию.

Надежда, что помогает Боб

EDIT: Игнорировать это. Все это неправильно.

+0

Я думаю, что он говорит о 'java.util.TreeMap', а не о третьем классе« Treemap ». –

1

Каждый длинный не менее 16 байт, и каждое целое число не менее 16 байт из-за 8-байтовых надстроек и 8-байтового выравнивания. На 32-битной машине каждый узел не менее 32 байта (заголовок объекта, ключ, значение, два дочерних элемента и флаги для балансировки). Это означает, что не менее 2^24 * (12 + 24 + 16) = 832MB .

Редактировать: Похоже, что объекты выровнены по 8 байт, поэтому используйте Integer для 16 байт. Кроме того, узел дерева, вероятно, имеет другое поле для балансировки дерева, поэтому для него рассчитывается 32 байта. Это приводит нас к минимуму 1024 МБ.

+0

Итак, в общей сложности 32 + 16 + 16 = 64 байта для ключа узла + (Long) + (Integer), отличный ответ! – 2009-12-10 23:23:52