系统频繁Full gc问题分析及解决办法
2017-01-18 15:03
501 查看
一、场景描述
上周开始系统在业务高峰期一直收到Full gc报警,监控显示fgc频繁,下图是监控图,左边红框是优化前效果,右边是优化后,优化后fgc基本为0
二、原因查找
1.查看gc日志,发现old区fgc后大小没有变化,如下图:
2.去线上dump内存看是什么对象,用memory analyzer分析,Retained Size竟然有2.4G,全是sun.awt.SunToolkit这个对象,其实到这一步已经可以确定是什么问题了,只是自己对系统不是很熟悉,导致定位具体的问题代码花了一些时间
三、原因分析
系统中有一个调用频繁的接口会调用下面这个方法,目的是获取图片的宽高信息,但是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));
上周开始系统在业务高峰期一直收到Full gc报警,监控显示fgc频繁,下图是监控图,左边红框是优化前效果,右边是优化后,优化后fgc基本为0
二、原因查找
1.查看gc日志,发现old区fgc后大小没有变化,如下图:
2.去线上dump内存看是什么对象,用memory analyzer分析,Retained Size竟然有2.4G,全是sun.awt.SunToolkit这个对象,其实到这一步已经可以确定是什么问题了,只是自己对系统不是很熟悉,导致定位具体的问题代码花了一些时间
三、原因分析
系统中有一个调用频繁的接口会调用下面这个方法,目的是获取图片的宽高信息,但是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));
相关文章推荐
- 系统频繁Full gc问题分析及解决办法
- freebsd系统/: write failed, filesystem is full问题解决办法
- 关于施用full gc频繁的分析及解决
- java-jvm-full gc频繁的分析及解决
- 关于应用full gc频繁的分析及解决
- full gc频繁的分析及解决案例
- MYSQL 执行Insert语句throws "The table 'xxx' is full" 的问题分析及解决办法
- 关于施用full gc频繁的分析及解决
- XP系统桌面图标透明问题的解决办法
- Exchange 2010,删除系统默认地址列表后, OWA 通讯簿失败问题解决办法 推荐
- gentoo 系统中 mysql 5.1 与 amarok相互block问题的解决办法
- Windows7 64位系统网卡驱动安装问题解决办法
- 常见问题及解决办法 整理之5(一些有用的系统存储过程及用法)
- 文件系统不同步问题resource is out of sync with the file system的解决办法
- GHOST版本WinXP SP2系统的IIS安装的问题及解决办法
- 白苹果问题解决办法以及原因简单分析
- 文件系统不同步问题resource is out of sync with the file system的解决办法
- (IE6下)png透明问题分析及解决办法
- MPlayer在x86_64位的系统中的安装以及出现的问题的解决办法
- 64位Linux系统下Not able to load mod_wl_20.so问题解决办法总结