Thumbnailator处理图片时OOM

OOM while Process Image with Thumbnailator

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可不背😂。

 

文章评论
${fromAuthor ? '郄正元' : '游客'} 作者 ${gmtCreate}
${content}
${subList.length}
发表评论
${commentToArticle ? '' : parentContent}
字数:0/${maxCommentLength}
该邮箱地址仅用于接收其他用户的回复提醒,不会泄露