Thumbnailator处理图片时OOM

Thumbnailator处理图片,使用的是Java原生的 ImageIO.read 方法读取原始图片,得到一个 BufferedImage 对象,该对象将图片的数据全部存放在内存中,因此当原始图片太大时,会消耗很多内存。如果机器内存较小、或JVM设置的内存较小时,就会出现OOM。

严格来说,这个问题不属于BUG,属于图片大小与内存大小之间的博弈😂,因此只能从以下几个角度进行优化:

限制图片大小
如果图片来源于前端,则可以在前端上传图片时,对文件大小进行限制。
如果图片已经存储在后端,则可以在处理图片前,对文件大小进行限制。

调整内存大小
如果有条件,可以更换内存更大的机器。
还可以通过 -Xmx 参数调整JVM最大可使用的内存。
Thumbnailator官方提供的优化
官方提供了一种变通方案(Workaround),来减少OOM出现的可能性,该Workaround可通过以下方式启用:

第一种,直接在启动时添加JVM参数:
-Dthumbnailator.conserveMemoryWorkaround=true

第二种,在main函数中使用 System.setProperty 来设置:

public static void main(String[] args) {
System.setProperty(“thumbnailator.conserveMemoryWorkaround”, “true”);
// 以下是其余代码…
}具体内容可参考:OutOfMemoryError Workaround。

⚠️注意,该方法只能减少OOM出现的可能性,当图片大小不加限制时,OOM还是必然会出现。因此根本办法是对要处理的图片大小进行限制,否则超出了内存,这个锅Thumbnailator可不背😂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值