在使用Thumbnailator时出现了OOM问题,但是其使用方法只有一行代码,无法针对其内部使用的对象进行资源释放,所以使用原生的Java类库中ImageIO来处理图片。 关键有三个类:ImageIO、BufferedImage、Graphics
public static BufferedImage read(File input) throws IOException
public static boolean write(RenderedImage im,String formatName,File output)throws IOException
BufferedImage.java:324,DirectColorModel.java:1032,Raster.java:467,DataBufferInt.java:75
至此可以得知,提示OOM的原因为图片的宽度和高度的像素乘积过大导致在初始化int的数组的时候出现 java.lang.OutOfMemoryError: Java heap space。
BufferedImage
的一些坑BufferedImage
的一些坑:
BufferedImage
的读取加载流程是:下载图片 -> 通过ImageIO.read()
转成BufferedImage
。很有可能的是,下载的图片过大,那么转成BufferedImage
的对象也会很大。BufferedImage
存储的内容是不经过压缩的,你本地磁盘上读取了一个图片文件,转成BufferedImage
对象后,大小可能是文件大小的数倍。这是因为BufferedImage
的对象大小是要按照位图那一套算法计算的,即像素数 * 单个像素存储大小
。一般项目中都是用彩图,即24位。 ImageIO.read()
就是这么处理的),且size = 1200 * 900 * 24 / 8 = 3240000 bytes
。所以当要缓存图片或者大对象(包含大量字节串)的时候,可以考虑:
BufferedImage
压缩比较困难,可以用第三方库?)byte[]
对象),应该利用磁盘缓存或者用类似Redis那样的缓存,而不是保存在本机内存里参考链接
https://keys961.github.io/2018/05/28/JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90/
https://blog.csdn.net/calm_encode/article/details/120427312
https://juejin.cn/post/6844903892543602702
https://blog.csdn.net/loophome/article/details/101773866
本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有