首页 > 系统相关 >一次glide内存泄漏排查分析

一次glide内存泄漏排查分析

时间:2024-05-10 11:12:18浏览次数:23  
标签:glide application 排查 内存 activity 加载

glide是一款非常优秀的图片加载框架,目前很多项目在使用。提供了非常方法,在此,笔者就不一一列举了,可以到官网查找。

目前项目在做内存排查,因为是车机项目,之前开发的时候没有注意内存方面的问题(车机项目你懂的),现在ota期间系统提出让我们优化内存,说出现过应用内存一直增加的情况。

一脸懵逼,第一想法是系统在甩锅,哥可不接。后来自己偷偷的排查下,是有些需要优化的地方。特此记录如下。

第一想法是,车机项目加载了很多背景图,有些都在200k~~400k,和UI沟通,无法再压缩,会糊。

第二是排查代码,一顿操作,各种点击,发现本地代码有需要优化的地方。静态内部类,弱引用搞起。

最后发现是报了glide内存泄漏,话不多说上图

 点进去一个

 RequestManager是glide内部一个类,查找使用方法

 从view 到application都可以传,传哪个就和哪个生命周期绑定

看了代码,当前我在fragment和adapter中传入的都是activity,修改写法,在activity中使用传入activity在fragment中使用传入fragment这也是官方推荐的使用方式。

AndroidStudio profiler 观察下内存情况

 heap dump文件

 

 

点开其中一个

 阿西吧,明明已经按照官方方法调用了,但是还是报了内存泄漏风险。我想静静。。。

moment later

我有到设置中去切换白天黑夜模式,看了下日志切换白天黑夜模式的时候并没有销毁activity,而是再次点击进入应用是才调用了ondestroy方法,是因为这个原因?

抱着这种想法,我多次切换白天黑夜模式,并且退出进入应用,没有报多个activity实例,一直都是2个,嗯...大概是这个原因了,这时候我想如果我进入应用中

这时候实例中activity应该只有一个实例了吧。然并卵,手动gc释放,没有变化。后来和后面一大佬聊天,被告知,androidstudio 手动gc并不能回收activity实例,

它是系统内存不足时被AMS回收的。如果这样的话那就能解释的同了。

后来我想如果传入application呢,上家公司做瀑布流列表我依稀记得是全局封装的application,说干就干。一顿操作

 

heap dump文件

 androidtudio peofiler没有再报溢出,差不多时间两种方式内存占用趋势也基本一致,最后内存也大体相同。

得出结论:

1.glide能很好的管理内部,引用。profiler虽然提醒了内存溢出,但是这只是有风险,并不一定会报

2.glide传入application 在应用没有动态列表图片加载的时候可以满足加载图片和内存两者之间的平衡,如果瀑布流图片较多,可考虑加入内存清理机制

大家有什么观点,欢迎共同探讨

                   

 

标签:glide,application,排查,内存,activity,加载
From: https://www.cnblogs.com/changhongshi/p/18183910

相关文章

  • 瑞萨问题排查记录
    P1当把RFD28F添加进项目时,报错如下:参考链接:https://www.sekorm.com/news/73776172.html栈溢出.textE0562330:Relocationsizeoverflow:"DefaultBuild\sample_control_codeflash.obj"-".text"-00000b(1)右键Subproject的CC-RH——LinkOptionsTab——S......
  • .NET 缓存:内存缓存 IMemoryCache、分布式缓存 IDistributedCache(Redis)
    .NET缓存:内存缓存IMemoryCache、分布式缓存IDistributedCache(Redis)  .NET缓存里分了几类,主要学习内存缓存、分布式缓存一、内存缓存IMemoryCache1、Program注入缓存builder.Services.AddMemoryCache();2、相关方法及参数Get、TryGetValue、GetOrCreate、GetOrCrea......
  • stm32 出现 hard fault 的排查记录
    参考链接:https://blog.csdn.net/qq_43118572/article/details/1327596261、先验知识先验知识1:cortexm3在中断/异常时,会把8个寄存器(xPSR、PC、LR、R12以及R3-R0)的值压入栈。入栈顺序以及入栈后堆栈中的内容如下(CM4是从低地址到搞地质):地址寄存器被保存的顺序......
  • stm32 将外部 Flash挂载在 SPI 出现数据传输时好时不好的排查过程
    现象:将外部Flash挂载在SPI,在hardware_init()->read_jedec_id()里的result=spi->wr(spi,cmd_data,sizeof(cmd_data),recv_data,sizeof(recv_data))中,recv_data的值经常不一致,result的值偶尔为SFUD_SUCCESS,大部分会Error。备注:正常情况下,recv_data的值为......
  • 20240509线上问题排查
    iotop-oPpidstat-d1mpstat-PALL5cat/proc/*/status|grep-E'State:.*Z.*|State:.*D.*'-A10-B2tophttps://blog.csdn.net/chrisy521/article/details/128532234db.system.profile.find({"millis":{$gte:500}}).limit(10).sort({ts:......
  • 云服务器遭到黑客入侵植入木马病毒排查过程
    1、问题说明在一个安静的下午,突然手机上面接收到云服务器厂商发的一条短信。短信内容为服务器疑似被木马病毒入侵,监测到病毒文件。然后我就使用FinalShell登录服务器准备进去看一看,刚登陆进去FinalShell左边监控程序显示cpu占用100%。服务器正常来说cpu只会在3%~9%之间,突然这个CP......
  • 记一次线上Redis内存占用过高、大Key问题的排查
    问题背景在一个风和日丽的下午,公司某项目现场运维同学反馈,生产环境3个Redis的Sentinel集群节点内存占用都很高,达到了17GB的内存占用量。稍加思索,应该是某些Key的Value数据体量过大,占用了过多的内存空间,我们在使用Redis的过程中,单个Value或者单个集合中的元素应该保证不超过10KB,......
  • 在Linux中,如何排查网络连接问题?
    排查Linux中的网络连接问题通常遵循一套标准流程,旨在识别并解决从硬件层面到软件配置的各类问题。以下是一个详细的排查步骤:1.检查物理连接确保网线连接稳固,无物理损坏,尝试更换网线或端口。检查网络设备(如交换机、路由器)的端口状态和连接。2.使用ping命令测试连通性ping......
  • 在Linux中,如何使用strace进行故障排查?
    在Linux中,strace是一个非常有用的工具,用于跟踪和诊断系统调用和信号。它可以帮助你理解程序如何与内核交互,并可以用来进行故障排查。以下是使用strace进行故障排查的详细步骤:1.理解strace的基本概念strace可以跟踪进程执行的每一个系统调用和信号。它可以显示系统调用的参数......
  • 在Linux中,如何排查硬件故障?
    排查Linux系统中的硬件故障是一个系统化的过程,涉及到对不同硬件组件的检查和分析。以下是排查硬件故障的详细步骤:1.使用系统日志和诊断工具dmesg:运行dmesg命令查看内核消息缓冲区,可以发现启动时的硬件错误信息。journalctl:对于使用systemd的系统,使用journalctl-k查......