案例1
系統高峯期fullGC頻繁,優化後恢復正常。
導致原因:
系統中有一個調用頻繁的接口會調用下面這個方法,目的是獲取圖片的寬高信息,但是Image這個對象用完不會自動釋放,需要手動調用 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));
參考博文:http://itindex.net/detail/53283-%E7%B3%BB%E7%BB%9F-full-gc