Проверьте, сколько памяти используется bufferedImage в Java? - PullRequest
8 голосов
/ 02 декабря 2011

У меня есть bufferedImage в Java. Как я вижу, сколько памяти это занимает? Заранее спасибо.

Ответы [ 3 ]

13 голосов
/ 02 декабря 2011

Вы можете определить, сколько байтов занимают только данные изображения, используя это:

DataBuffer buff = image.getRaster().getDataBuffer();
int bytes = buff.getSize() * DataBuffer.getDataTypeSize(buff.getDataType()) / 8;

Само изображение занимает немного больше места для цветовой модели и другой бухгалтерской информации, но для больших изображений,bytes будет доминирующим термином.

0 голосов
/ 02 декабря 2011

Используя Runtime#totalMemory и Runtime#gc, вы сможете получить очень близкое приближение. Пример:

Runtime.getRuntime().gc();Runtime.getRuntime().gc();Runtime.getRuntime().gc();
long totalUsed = Runtime.getRuntime().totalMemory();

BufferedImage image = ...

Runtime.getRuntime().gc();Runtime.getRuntime().gc();Runtime.getRuntime().gc();
totalUsed = Runtime.getRuntime().totalMemory() - total;

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

0 голосов
/ 02 декабря 2011

Я не уверен, что есть простой способ вычислить это со 100% точностью до количества байтов, не вычисляя его самостоятельно (принимая во внимание цветовую модель, размер изображения и другие факторы).

Вы можете вычислить totalMemory () и freeMemory () в куче до и после выделения и получить оценку таким образом.Если другие объекты будут распределены (или собраны) между вашими проверками, ваш расчет не будет точным.

В этом обсуждении говорится о размере примитивных типов в JVM (объект, являющийсяколлекция многих примитивных объектов), которые вы можете использовать, чтобы понять это.

Эта статья дает обзор использования памяти в Java.

...