java – 为什么BufferedImage需要的内存超出其数据数组的大小?

我正在尝试确定任何给定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个字节.

上一篇:Java检查BufferedImage是否为GIF


下一篇:java验证码