2013-10-30 28 views
6

猜猜看,另一个Android位图 - OOM问题!Android内存管理:屏幕密度,请求的图像大小和可用堆

背景

虽然压力测试our application它已经注意到,有可能最高时的应用程序的进程的内存分配与被记录在随后的内OutOfMemory异常持续,大量使用(猴亚军等)后,堆栈跟踪。当选择ViewPager下的页面时,该应用下载图像(一次约3个)。当应用程序的长度和气息被执行时,可以有280多个图像可供下载。该应用程序使用Picasso by Square来进行图像下载抽象。值得注意的是,我们应用程序的代码中没有任何一点是我们直接操纵位图...我们相信,非常有才华的Square Inc.员工比我们做得更好。

这里是一个图片

的下面曲线图显示了在dalvikvm-heap日志消息下记录时的堆分配。红点指示用户带来了新鲜组文章到应用程序,以加强工作出色和应力的应用的量...

DALVIKVM heap allocations http://snag.gy/FgsiN.jpg 图1: Nexus之一堆分配;奥姆斯发生在80MB +

调查最新

反对使用Nexus S,的Nexus 4,野火,HTC难以置信和进一步测试设备万千,轶事测试已经示出的存储器管理是足够用DVM GC跟上由应用程序完成的繁重工作。但是,在Galaxy S II,III,IV和HTC One等高端设备中,OOM普遍存在。事实上,如果有足够的工作要做,我想我们所有的设备最终都会出现故障。

问题

显然有屏幕密度之间的进程的存储器分配和图像的数量在给定的大小会关系(该请求的图像尺寸基于关闭的ImageView的大小),导致该应用程序超出堆限制。我即将开始量化这种关系,但希望SO社群关注这个问题,并(a)同意或不同意这种关系是值得的,(b)提供文献说明如何最好地拟定这种关系。

重要的是要注意,如果我们破坏图像质量,我们的OOM全部消失,但是可惜的是UX更差,这就是为什么我们希望通过最有效地利用可用堆来切块。


备注:以下是负责将这些图像加载到已布置视图的代码部分;

picassoInstance.load(entry.getKey()) 
       .resize(imageView.getMeasuredWidth(), 
         imageView.getMeasuredHeight()) 
       .centerCrop() 
       .into(imageView); 

上面提到的“图像质量的横飞”简单地由若干像“4”除以imageView.getMeasured...

+0

毕加索还提供了多少内存用于位图的快照。您尝试加载的图片有多大?他们是全屏吗?即使是拥有大量内存的最佳手机,也会通过加载三张或更多图像而崩溃。你认为你的观点是在调用毕加索之前测量的吗?您也可以尝试使用'fit()'来代替。 – dnkoutso

+1

如果您的应用程序在位图上非常密集,您也可以考虑探索'largeHeap'属性。如果启用,毕加索将相应地调整内存。对我来说,黄金法则就是尽可能多地解码,而不是更多。看起来你正在这样做。我会密切关注你的使用情况。在我已经在多种设备上测试过的毕加索样本应用程序中,我从未得到过OOM异常,看起来高端设备在清理垃圾方面处理得非常好。 – dnkoutso

+0

感谢您的建议@dnkoutso。据我所知,毕加索表现良好;当OOM确实发生时总能恢复。我会让你张贴我的漏洞。不感兴趣;我是否应该明确地关闭毕加索? – OceanLife

回答

2

首先,你需要为位图需要大量的记忆,对于内存分配可以通过以下方式

  1. 把所有那些庞大的图像是减少管理存储器分配,其在Android的一个大问题大小的资产文件夹,而不是把它们放在drawabable文件夹中。因为可绘制资源需要内存来缓存它们。如果从资源文件夹加载,映像将无法缓存,并且占用的内存会更少。

    1. 研究用于高效内存管理的Lrucache。
    2. 将资源以微小格式进行检查TinyPNG
    3. 如果您的图像分辨率过大,则尝试使用SVG文件进行图像加载而不是图像加载SVG文件。检查这个SVG FOR ANDROID

最后我不是英语非常好希望这可以帮助你。

0

这篇文章有点老了,但我最近也有过这个问题。也许这会帮助别人。 这个巨大的线程/什么帮助我的一般概述。

- 确保您使用的是毕加索

的单一实例

- 使用合适的()

- 对于大的图像或多个图像或在FragmentPager/StatePager使用时,你应该使用skipmemorycache()和/或largeHeap声明

阅读主题获取更多提示。在发布这个问题时,没有人在picassos github上发布这个问题。

https://github.com/square/picasso/issues/305

祝你好运希望这有助于和快乐编码。