Image这个对象用完不会自动释放,需要手动调用 flush()方法;调用 flush()这个方法,就导致一有请求就会有大对象进入old区,在业务高峰期old区一会就被打满,所以一直进行fgc。
反例:
public static Image getImage(String path) {
ImageIcon icon = new ImageIcon(path);
Image img = icon.getImage();
return img;
}
解决办法:
其实不管是用Image还是BufferedImage,读取图片的宽高不用把图片全部加载到内存,在图片的宽高信息其实是存储在文件头中的,只 要按不同的格式读取文件的头信息就可以拿到宽高信息
使用ImageReader代码如下
Iterator readers = ImageIO.getImageReadersByFormatName(StringUtil.getFileSuffix(filePath));
ImageReader reader = (ImageReader)readers.next();
iis = ImageIO.createImageInputStream(is);
reader.setInput(iis, true);
return Pair.of(reader.getWidth(0),reader.getHeight(0));
本文探讨了Image对象在使用后未自动释放导致的内存泄漏问题,特别是在业务高峰期触发频繁的FGC。通过分析,提出了解决方案,即利用ImageReader读取图片头信息来获取图片尺寸,避免整个图片加载到内存中。
1507

被折叠的 条评论
为什么被折叠?



