2011-01-19 2 views
5

У меня есть ArrayList<Obj>, и я хочу знать, сколько памяти он использует.Каков размер памяти ArrayList в Java

Obj вариант, поэтому не так просто, как умножить количество элементов в массиве на размер объекта.

+3

см. Http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object –

ответ

4

Вы можете использовать что-то наподобие Runtime.getRuntime().totalMemory() и его коллега Runtime.getRuntime().freeMemory(), чтобы получить обоснованное предположение, но это не учитывает объекты, которые GC'ed между вызовами.

+1

Спасибо. Хорошо, он не на 100% точнее, но его легко реализовать. – magallanes

3

Вы можете вычислить его, если вы знаете распределение контента по объектам.

Однако самый точный метод, о котором я могу думать, - это посмотреть на него в профилировщике. Есть бесплатные инструменты, некоторые из которых поставляются с JDK. Однако лучшим инструментом, который я использовал, является Yourkit. Это не значит, что это единственное решение, просто моя любимая.

+0

jmap достаточно хорошее и бесплатное :) – bestsss

18

Это емкость java.util.ArrayList, умноженная на контрольный размер (4 bytes on 32bit, 8bytes on 64bit) + [Object header + one int and one references].

Емкость отличается (always >=), чем размер, но вы хотите, чтобы заставить их равны, называют trimToSize()

Технически говоря, ArrayList имеет Object[], где он хранит данные.

3

Это то, к чему предназначен профайлер памяти. Он расскажет вам о вашей платформе. Минимальный размер для пустого ArrayList - 64 байта. Очень вероятно, что вам не нужно знать это, если у вас нет элементов 100K или более.

0

Способ работы ArrayList состоит в том, что он просто содержит массив определенного размера (который может быть указан в конструкторе, я считаю, что 10 по умолчанию?). Всякий раз, когда количество элементов становится слишком большим для внутреннего массива, размер внутреннего массива удваивается. Поэтому вам нужно умножить размер объекта на размер внутреннего массива.

3

Возможно, вам понадобится использовать profiler, как в Netbeans, который покажет вам потребление памяти нашей программой и даст вам подробную информацию о каждом объекте.

1

Ответ: это зависит от того, как вы измеряете. Если бы вы спросили меня о размере ArrayList, я бы дал вам мелкие размеры. То есть ArrayList состоит из массива ссылок и целого числа, указывающего количество содержащихся элементов. Если вы хотите знать размер, это просто 4 + * array.length.

Если вы хотите узнать размер массива ArrayList и все содержащиеся в нем элементы, то есть некоторые анализаторы кучи, которые могут понять это. Я считаю, что YourKit является одним из них.

1

Использование java-памяти зависит от реализации JVM. Единственный реальный метод определения использования памяти экземпляра, который я знаю, - это использовать агент Java 5 instrumentation. Для этого есть немного tutorial.

Смежные вопросы