我正在尝试确定任何给定TYPE_INT_ARGB 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);
}
}
(打印的值是存储BufferedImage的像素数据的int []的预期大小.)我期望找到的是所需的最大堆类似于xc,其中x是数据数组的大小和c是一个常量,由加载的类的大小,BufferedImage对象等组成.这是我找到的(所有值都以MB为单位):
4*w*h min max heap ----- ------------ 5 - 10 15 20 31 40 61 80 121 160 241
1.5x非常适合观察. (请注意,我发现5MB图像没有最小值.)我不明白我所看到的.这些额外的字节是什么?
解决方法:
在1.6.0_16和1.6.0_20之间的某个地方,Oracle的VM似乎有一个错误.您甚至可以减少分配int数组的问题,因为问题不仅与BufferedImage有关.
在1.6.0_16中,我需要至少413 MB的堆来分配一个带有100,000,000个元素的int数组,这看似合理.对于1.6.0_20,相同的操作需要至少573 MB的堆空间,尽管在分配数组后实际上只使用了400,000,000个字节.