纯Java方式解析图片导致CPU过高

问题概述

1.1    问题概述
项目上线一段时间后,最近几天 在访问量不是很大的情况下 CPU持续上涨 只能通过手动重启Tomcat才能解决问题

 问题分析定位

1.2.1    分析结果
JDK中处理图片的对象 MediaTracker的BUG
 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6818960
为了解决此类问题,我们通过其它方式来避免JDK这个BUG,但是会存在图片失真的风险;



 

1.2.2    分析过程
通过部署我们提供的CPU监控脚本,发现其中有一个线程一直占用CPU 直至CPU超出预警线。线程信息 如下截图:
 
我们单独写了单元测试类,专门测试解析图片代码 并且使用 Jconsole 工具进行监控,最终找到一处处理CMYK的图片代码有异常. 而Oracle官方论坛也有此类问题的讨论
https://cn.forums.oracle.com/forums/thread.jspa?messageID=5358460

 

 

Image  image=Toolkit.getDefaultToolkit().getImage(imgFilePath);
//如果图片路径是不变,那么上面方法返回的 Image 对象就会是最开始那一个,通过对返回的 Image 调用 flush 方法,可以手动丢弃以前加载的信息
						image.flush();
						MediaTracker mediaTracker = new MediaTracker(new Container());
						mediaTracker.addImage(image, 0);
						mediaTracker.waitForID(0);

 既然这个有BUG ,那么我们不得不采用

Image image=ImageIO.read(file);
 

但是 ,ImageIO.read()方法无法读取CMYK编码的JPEG图片,见附件(cmyk_dog.jpg)

可以用以下方法解决:

http://stackoverflow.com/questions/2408613/problem-reading-jpeg-image-using-imageio-readfile-file

但是存在图片失真问题 ,

这个后期解决.......

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值