gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:33:28 25 4
gpt4 key购买 nike

我正在尝试确定给定的 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);
}
}

(打印值是 int[] 的预期大小,其中存储了 BufferedImage 的像素数据。)我期望找到的是required max heap 类似于 x + c,其中 x 是数据数组的大小,c 是由以下大小组成的常量加载的类、BufferedImage 对象等。这是我找到的(所有值均以 MB 为单位):

4*w*h   min max heap-----   ------------  5          - 10         15 20         31 40         61 80        121160        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 需要超出其数据数组大小的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3854200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com