gpt4 book ai didi

Java BufferedImage 内存消耗

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:28:49 25 4
gpt4 key购买 nike

我们的应用程序生成图像。 BufferedImage 消耗的内存产生内存不足异常:

java.lang.OutOfMemoryError: Java heap space

这发生在以下行中:

BufferedImage result = new BufferedImage(2540, 2028, BufferedImage.TYPE_INT_ARGB);

在这条指令之前检查空闲内存时,它显示我有 108MB 空闲内存。我用来检查内存的方法是:

Runtime rt = Runtime.getRuntime();
rt.gc();
long maxMemory = rt.maxMemory();
long usedMemory = rt.totalMemory() - rt.freeMemory();
long freeMem = maxMemory - usedMemory;

我们不明白 BufferedImage 是如何消耗超过 100MB 内存的。它应该使用 2540 * 2028 * 4 字节,即 ~20 MB。

为什么在创建 BufferedImage 时消耗这么多内存?我们可以做些什么来减少这种情况?

最佳答案

在多线程环境中向运行时询问可用内存量并不是真正可靠的,因为内存可能会在您测量后立即被另一个线程用完。此外,您正在使用 maxMemory - usedMemory,这不是可用内存量,而是 VM 认为 它最多可以提供的内存量 - 可能是主机系统无法满足对更多内存的请求,而 VM 仍然相信它可以扩大堆。

也完全有可能您的 VM 有 108 MB 空闲空间,但一个 block 中没有 20MB 可用。您尝试创建的 BufferedImage 类型最终由一个 int[] 数组支持,该数组必须分配为连续的内存块。这意味着如果堆上没有连续的 20MB block 可用,则无论总可用内存有多少,都会出现 OutOfMemoryError。使用的垃圾收集器使情况更加复杂——每个 GC 都有不同的内存分配策略;堆的很大一部分可能会留出用于线程本地内存分配。

在没有任何信息的情况下,堆总共有多大,您正在使用哪个 GC(以及与此相关的 VM),变量太多,无法指责罪魁祸首。


编辑:找出使用了哪个 GC (Java 7 (JDK 7) garbage collection and documentation on G1) 并了解其具体优缺点 - 特别是它在堆压缩方面提供的功能以及默认情况下的代数。那将是要使用的参数。在 GC 消息开启的情况下运行应用程序也可以提供有关正在发生的事情的洞察力。

考虑到您的堆大小只有 900MB,100MB 空闲意味着您已经非常接近限制 - 我的首先要解决的问题是简单地为 VM 分配一个更大的堆,比如说 2GB .如果您需要节省内存,您唯一的选择就是调整 GC 参数(可能选择另一个 GC)——老实说,我没有这方面的经验。不过,有很多关于 GC 调优主题的文章。

关于Java BufferedImage 内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28440412/

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