【发布时间】:2015-12-16 12:51:35
【问题描述】:
在我的项目中,我有最简单的列表视图和适配器,可以使用 Picasso 加载图像。每个解码的图像大约是 140-150 kbytes.. 但是在最初的 30-60 秒内(Picasso 内存 LruCache 填充时)滚动很慢。
这是logcat的一部分:
09-19 14:11:01.435 4676-5700/com.test D/dalvikvm﹕ GC_FOR_ALLOC freed 270K, 11% free 34374K/38228K, paused 60ms, total 61ms
09-19 14:11:01.435 4676-5700/com.test I/dalvikvm-heap﹕ Grow heap (frag case) to 34.487MB for 148408-byte allocation
09-19 14:11:01.505 4676-4676/com.test D/dalvikvm﹕ GC_FOR_ALLOC freed 9K, 11% free 34510K/38376K, paused 66ms, total 66ms
09-19 14:11:06.875 4676-5701/com.test D/dalvikvm﹕ GC_FOR_ALLOC freed 132K, 11% free 34497K/38376K, paused 39ms, total 39ms
09-19 14:11:06.875 4676-5701/com.test I/dalvikvm-heap﹕ Grow heap (frag case) to 34.606MB for 147760-byte allocation
09-19 14:11:06.915 4676-4676/com.test D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 11% free 34641K/38524K, paused 41ms, total 41ms
09-19 14:11:11.375 4676-5702/com.test D/dalvikvm﹕ GC_FOR_ALLOC freed 110K, 11% free 34650K/38524K, paused 58ms, total 59ms
09-19 14:11:11.385 4676-5702/com.test I/dalvikvm-heap﹕ Grow heap (frag case) to 34.757MB for 149704-byte allocation
09-19 14:11:11.445 4676-4676/com.test D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 11% free 34796K/38672K, paused 64ms, total 64ms
09-19 14:11:14.615 4676-5699/com.test D/dalvikvm﹕ GC_FOR_ALLOC freed 119K, 11% free 34796K/38672K, paused 53ms, total 53ms
09-19 14:11:14.625 4676-5699/com.test I/dalvikvm-heap﹕ Grow heap (frag case) to 34.900MB for 149704-byte allocation
09-19 14:11:14.655 4676-4676/com.test D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 10% free 34942K/38820K, paused 37ms, total 37ms
我在这里看到的:
堆为非常图像下载和解码而增长。
在堆增长之前,Dalvik 尝试 GC 一些内存。
根据每个 GL_FOR_ALLOC,当前活动堆大小大约有 3 MB 空闲。
对于列表视图中的每个下一张图像,我们需要大约 300-500kbytes 的内存 = 下载字节(大约 60-100kb)+ 位图(140kb)+ 网络人员 + 视图人员。 我使用 Android Studio 中的内存分配跟踪确认了这一点。
所以在堆增长之前收集了一些没有引用的内存和对象(释放了 270K,释放了 119K,...),似乎只剩下位图。
所以我的问题:
为什么 Android 不能分配 140 甚至 500 KB,即使当前有大约 3000 KB 的空闲堆?
可能是特定设备或 Android 版本的问题吗?
【问题讨论】:
标签: java android performance memory garbage-collection