gpt4 book ai didi

java - 为什么 BufferedImages 在程序运行时会增加它们使用的内存量?

转载 作者:行者123 更新时间:2023-11-30 07:11:19 25 4
gpt4 key购买 nike

在 Java 中,由于使用 BufferedImage,我遇到了 OutOfMemoryError。当我向控制台打印 BufferedImage 单独使用了多少内存(以字节为单位)时,我注意到使用的字节数呈指数增长。我的结果是这样的:

    7396
12996
23104
40804
71824
125316
217156
372100
630436
1060900
1763584
2903616
4726276
7595536
12054784
18887716
29181604
44435556
66650896
98446084
143089444
204547204
-249500608
-140383168

我使用以下代码来生成结果:

    while (true) {
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
DataBuffer buff = img.getRaster().getDataBuffer();
System.out.println(buff.getSize() * DataBuffer.getDataTypeSize(buff.getDataType()) / 8);
}

为什么这种增长如此之大?我怎样才能防止这种增长发生?另外,数字前面(最后2个)有负号是什么意思?

编辑:

请注意,宽度和高度不断变化,但我不希望它们增加(抱歉)

最佳答案

当您创建 TYPE_INT_ARGB(或任何 TYPE_INT_*,实际上)的 BufferedImage 时,您正在创建一个 int 支持数组来保存像素,其长度恰好是 width * height 。由于 Java int 是 32 位,即 4 个字节,因此该数组将使用 width * height * 4 字节。代码中的 DataBuffer 只是此后备数组的一个薄包装。

因此,您看到的增长完全是预料之中的。根据堆的大小,在尝试创建更大的 BufferedImage 时,您有时会耗尽内存。

突然出现负值的原因很简单,就是你的表达:

buff.getSize() * DataBuffer.getDataTypeSize(buff.getDataType()) / 8

将产生 integer overflow当 buff.getSize() 变得足够大时。

作为*/运算符have equal precedence在 Java 语言中,表达式将从左到右计算,即使最终结果(除以 8 后)应该是有效的 int,乘法也会溢出。您可以通过添加括号来强制首先进行除法来修复它:

buff.getSize() * (DataBuffer.getDataTypeSize(buff.getDataType()) / 8)

或者简单地使用longs:

(long) buff.getSize() * (long) DataBuffer.getDataTypeSize(buff.getDataType()) / 8L

关于java - 为什么 BufferedImages 在程序运行时会增加它们使用的内存量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39195370/

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