我现在用J2SE做一个Windows系统运行的软件,该软件显示大照片有时会内存溢出。哪位高手知道如何处理?

lzw8114 2013-06-27 02:47:58
我现在虚拟机设置的内存上限是320M(不能使用增加内存的方法,这样太占系统内存),使用ImageIO.read加载的照片,每次执行这句加载10几兆的照片后内存会暴涨上百兆,大概是照片大小的10倍,有时会出现内存溢出。现在试了好多办法,也尝试了好多第三方库,仍未找到如何用有限内存加载大照片的解决办法(安卓上有一个BitmapFactory可以做到这一点,PC机上没找到类似方法),还请知道的高手赐教。
...全文
132 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
MiceRice 2013-07-01
  • 打赏
  • 举报
回复
以Java的效率,你9楼的结果应该算是不错了。 可以尝试更换不同的读取、压缩组件来看能否提升能效,以前用些官方(sun)非公开组件处理过图片压缩(为了实现远程桌面监控),可以提升15%左右。不过忘了名字了。。。
lzw8114 2013-07-01
  • 打赏
  • 举报
回复
谢谢ldh911的回复,调用外部程序压缩也是我保留的最后一个选项,如果实在没有更好的办法再这样做。 我现在使用分块读取源图片,然后压缩再拼接到目标图片中的方法。块数和压缩尺寸合适的情况下8兆多的图片占用5、6十兆内存,6、7秒钟可以完成。这样的速度和占用的内存勉强能接受,我再研究研究有没有更好的办法。
地下室森林 2013-06-28
  • 打赏
  • 举报
回复
用图像流来读的话很费内存
钢筋裤衩蛋 2013-06-28
  • 打赏
  • 举报
回复
占个位置 留着以后看
MiceRice 2013-06-28
  • 打赏
  • 举报
回复
如果实在找不到Java组件,考虑直接用 Runtime 调用外部程序来实现后台自动压缩,Java只使用压缩后的。
lzw8114 2013-06-28
  • 打赏
  • 举报
回复
谢谢beichui给的链接! 这个我之前看到过,测试后发现toolkit.getImage时确实没有增大内存,但执行: wideth = srcImage.getWidth(null); // 得到源图宽 后,内存增长和ImageIO.read相当,所以这个方法只是将图片加载的时间挪后了而已,占用内存还是一样的多。 ldh911说的将图片先压缩再显示的思路是对的,我也是按这个思路找解决办法,但所有找到的方法在压缩图片前都是一次性将图片加载到内存中,还没压缩就已经占了太大的内存。 所以关键在于有什么方法可以在加载图片时就控制内存使用。
MiceRice 2013-06-27
  • 打赏
  • 举报
回复
变大很正常,jpg是有损压缩,压缩率还是比较高的;读入内存后,不仅压缩部分全部还原,而且1个像素点要消耗4个字节。 最好先做图形压缩(是指原始尺寸压缩,不是存储压缩),再读取进来,那么大的jpg文件,直接就显示出来没意义吧。 用Java Image Filters之类的组件试试看先做尺寸压缩。
北吹 2013-06-27
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/270058722
「已注销」 2013-06-27
  • 打赏
  • 举报
回复
能不能根据大小先保存到硬盘,然后从硬盘读出。比如用缓存,当图片缓存到了一定大小,就写入硬盘,然后继续放入缓存处理。读数据的时候就直接从保存到硬盘的数据读取。
十八道胡同 2013-06-27
  • 打赏
  • 举报
回复
这个应该是java自己类库设计的问题,需要问下有经验的coder

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧