У меня есть ArrayList<Obj>
, и я хочу знать, сколько памяти он использует.Каков размер памяти ArrayList в Java
Obj
вариант, поэтому не так просто, как умножить количество элементов в массиве на размер объекта.
У меня есть ArrayList<Obj>
, и я хочу знать, сколько памяти он использует.Каков размер памяти ArrayList в Java
Obj
вариант, поэтому не так просто, как умножить количество элементов в массиве на размер объекта.
Вы можете использовать что-то наподобие Runtime.getRuntime().totalMemory()
и его коллега Runtime.getRuntime().freeMemory()
, чтобы получить обоснованное предположение, но это не учитывает объекты, которые GC'ed между вызовами.
Спасибо. Хорошо, он не на 100% точнее, но его легко реализовать. – magallanes
Вы можете вычислить его, если вы знаете распределение контента по объектам.
Однако самый точный метод, о котором я могу думать, - это посмотреть на него в профилировщике. Есть бесплатные инструменты, некоторые из которых поставляются с JDK. Однако лучшим инструментом, который я использовал, является Yourkit. Это не значит, что это единственное решение, просто моя любимая.
jmap достаточно хорошее и бесплатное :) – bestsss
Это емкость java.util.ArrayList, умноженная на контрольный размер (4 bytes on 32bit, 8bytes on 64bit) + [Object header + one int and one references]
.
Емкость отличается (always >=)
, чем размер, но вы хотите, чтобы заставить их равны, называют trimToSize()
Технически говоря, ArrayList
имеет Object[]
, где он хранит данные.
Это то, к чему предназначен профайлер памяти. Он расскажет вам о вашей платформе. Минимальный размер для пустого ArrayList - 64 байта. Очень вероятно, что вам не нужно знать это, если у вас нет элементов 100K или более.
Способ работы ArrayList состоит в том, что он просто содержит массив определенного размера (который может быть указан в конструкторе, я считаю, что 10 по умолчанию?). Всякий раз, когда количество элементов становится слишком большим для внутреннего массива, размер внутреннего массива удваивается. Поэтому вам нужно умножить размер объекта на размер внутреннего массива.
Возможно, вам понадобится использовать profiler, как в Netbeans, который покажет вам потребление памяти нашей программой и даст вам подробную информацию о каждом объекте.
Ответ: это зависит от того, как вы измеряете. Если бы вы спросили меня о размере ArrayList, я бы дал вам мелкие размеры. То есть ArrayList состоит из массива ссылок и целого числа, указывающего количество содержащихся элементов. Если вы хотите знать размер, это просто 4 + * array.length.
Если вы хотите узнать размер массива ArrayList и все содержащиеся в нем элементы, то есть некоторые анализаторы кучи, которые могут понять это. Я считаю, что YourKit является одним из них.
Использование java-памяти зависит от реализации JVM. Единственный реальный метод определения использования памяти экземпляра, который я знаю, - это использовать агент Java 5 instrumentation. Для этого есть немного tutorial.
см. Http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object –