Thumbnailator处理图片时OOM
OOM while Process Image with Thumbnailator
Thumbnailator处理图片,使用的是Java原生的 ImageIO.read
方法读取原始图片,得到一个 BufferedImage
对象,该对象将图片的数据全部存放在内存中,因此当原始图片太大时,会消耗很多内存。如果机器内存较小、或JVM设置的内存较小时,就会出现OOM。
严格来说,这个问题不属于BUG,属于图片大小与内存大小之间的博弈😂,因此只能从以下几个角度进行优化:
限制图片大小
如果图片来源于前端,则可以在前端上传图片时,对文件大小进行限制。
如果图片已经存储在后端,则可以在处理图片前,对文件大小进行限制。
调整内存大小
如果有条件,可以更换内存更大的机器。
还可以通过 -Xmx
参数调整JVM最大可使用的内存。
Thumbnailator官方提供的优化
官方提供了一种变通方案(Workaround),来减少OOM出现的可能性,该Workaround可通过以下方式启用:
第一种,直接在启动时添加JVM参数:
第二种,在main函数中使用 System.setProperty
来设置:
具体内容可参考:OutOfMemoryError Workaround。
⚠️注意,该方法只能减少OOM出现的可能性,当图片大小不加限制时,OOM还是必然会出现。因此根本办法是对要处理的图片大小进行限制,否则超出了内存,这个锅Thumbnailator可不背😂。