Я пытаюсь определить, сколько кучи любого данного TYPE_INT_ARGB BufferedImage
будет использовать, так что для программы, которая выполняет некоторую обработку изображений, я могу установить разумную максимальную кучу на основе размера изображения, которое мы его кормим.Почему BufferedImage требует столько памяти за пределами размера массива данных?
я написал следующую программу в качестве теста, который я затем используется для определения наименьшей максимальной кучи, под которым он будет работать без OutOfMemoryError
:
import java.awt.image.BufferedImage;
public class Test {
public static void main(String[] args) {
final int w = Integer.parseInt(args[0]);
final int h = Integer.parseInt(args[1]);
final BufferedImage img =
new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
System.out.println((4*w*h) >> 20);
}
}
(печататься значение является ожидаемый размер int[]
в котором хранятся данные пикселя BufferedImage
.) Я ожидал найти, что требуемая максимальная куча - это что-то вроде x + c
, где x
- это размер массива данных, а c
- это константа, состоящая из размеров классов, которые загружены, объект BufferedImage
и т. д. Это то, что я нашел вместо этого (al л значения в МБ):
4*w*h min max heap ----- ------------ 5 - 10 15 20 31 40 61 80 121 160 241
1.5x
хорошо подходит для наблюдений. (Обратите внимание, что я не нашел минимума для изображения 5 МБ.) Я не понимаю, что вижу. Каковы эти дополнительные байты?
Может быть вопрос о нобе, но почему 4 * w * h? –
'w * h' - количество пикселей. В изображении 'TYPE_INT_ARGB' каждый пиксель хранится в' int', который должен быть 4 байта.Итак, '4 * w * h' должно быть числом байтов, используемых' int [] 'для хранения своих данных. – uckelman