一 概述
最近项目中使用BufferImage进行图片操作,当时经常出现OOM的情况。
BufferedImage backGroundImage = new BufferedImage(width, height, imageType);
错误日志:线上OOM问题_calm_encode的博客-CSDN博客_oom现象
关键日志:
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:75)
at java.awt.image.Raster.createPackedRaster(Raster.java:467)
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1032)
at java.awt.image.BufferedImage.<init>(BufferedImage.java:324)
二 解决过程
根据关键日志信息,分别定位到BufferedImage.java:324,DirectColorModel.java:1032,Raster.java:467,DataBufferInt.java:75的源码信息。
BufferedImage.java:324
DirectColorModel.java:1032
Raster.java:467
DataBufferInt.java:75
至此可以得知,提示OOM的原因为图片的宽度和高度的像素乘积过大导致在初始化int的数组的时候出现 java.lang.OutOfMemoryError: Java heap space。
经过思考,对原因为图片的宽度和高度的像素乘积进行边缘测试,在4核16G的服务器上的最大值为:116957500
暂时分析的结果如此,如果有什么更深层次的理解环境留言指教。谢谢!