Glide 导致内存无法回收的问题

447 阅读1分钟

内存无法回收

Glide 默认是会将加载的资源缓存到内存里,GC 无法回收。

所以如果不需要缓存到内存的情况下,需要跳过缓存

Glide.load(item.thumbnail)
    //跳过磁盘缓存
    .diskCacheStrategy(DiskCacheStrategy.NONE)
    //跳过内存缓存
    .skipMemoryCache(true)
例子

Android Studio Profiler 看 .hprof文件

image.png Class Name:对象的类型,比如byte[]就是说这里的对象都是byte数组类型;

 

Allocations:生成对象的数量

 

Shallow Size:这些对象所占用的内存(不包括引用对象),单位是B。

这里就是198个 Bitmap 对象所占的内存,9900 B 但是不包括引用的对象

 

Retained Size:这些对象所占用内(包括引用对象),内存释放时,实际释放的大小就是这里的大小;

 

有两个对象,对象A的大小是20kb,对象B的大小是10kb,对象B是对象A的成员变量,那么:

 

Class Name:A     Allocations:2    Shallow Size:2*20*1024     Retained Size:2*20*1024+2*10*1024


Class Name:B     Allocations:1   Shallow Size:10*1024     Retained Size:10*1024

 

查看 Reference 引用链,可以看到这个BitMap对象是被谁引用了。

点击Go To Instance 可以看到引用它的地方。

image.png 点击 Jump To Source 可以看到代码引用的地方,最终可以看到时壁纸缩略图引用无法回收。   image.png

发现加载的地方,使用了Glide。

Glide 默认会将load 的资源缓存到内存里,需要加上 .skipMemoryCache(true)

image.png