fullGC過於頻繁的原因和解決方案

案例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

發佈了55 篇原創文章 · 獲贊 11 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章