Каков объем памяти ArrayList в Java - PullRequest
7 голосов
/ 19 января 2011

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

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

Ответы [ 9 ]

21 голосов
/ 19 января 2011

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

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

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

5 голосов
/ 19 января 2011

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

4 голосов
/ 19 января 2011

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

3 голосов
/ 19 января 2011

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

3 голосов
/ 19 января 2011

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

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

1 голос
/ 19 января 2011

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

1 голос
/ 19 января 2011

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

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

0 голосов
/ 23 мая 2019

Источник: http://uttesh.blogspot.com/2015/04/get-byte-or-memory-size-of.html

public static long getBytesFromList(List list) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(baos);
    out.writeObject(list);
    out.close();
    return baos.toByteArray().length;
}
0 голосов
/ 19 января 2011

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

...