androidstudio内存泄漏的分析过程

ly570 ly570     2022-12-16     429

关键词:

前言部分
这次泄漏是自己代码写的太随意引起的,讲道理,代码写的太为所欲为了,导致有些问题根本就很难发现。

泄漏产生的原因,由于activity未被回收导致。这里给我们提出的一个警示,在使用上下文的时候,我们要特别注意,尤其是一些实例的上下文,如:activity、fragment等。

这次的错误原因就是我把activity作为上下文传给了Glide使用,结果后期我做夜间模式,需要重启activity让夜间模式生效的时候忘记Glide还在持有activity的引用导致了泄漏。

内容部分
产生了泄漏的时候我们需要一些分析工具,leakcanary算是一个必备工具了。我们通过leakcanary可以收集到app产生的泄漏信息,然后通过信息可以找到具体的类,定位到泄漏的类中,在顺着引用连接就可以找到了。下面看一个泄漏的图:


上图中可以看出一些重要信息:
MainActivity的实例发生了泄漏,这表明我们的MainActivity在实例销毁的时候由于被Glide引用,并没有被回收。

导致这个结果的原因就是下面这段代码:

Glide.with([email protected])
.load(R.drawable.head_photo)
.apply(RequestOptions.bitmapTransform(CircleCrop()))
.into(ivPersonPhoto!!)
1
2
3
4
这里传入Glide中的上下文我没有使用applicationContext,结果在启用夜间模式的时候进行重启activity的时候出现了泄漏。

一些简单的泄漏通过leakcanary帮助我们收集的信息是可以处理的。但是如果有很多地方都引用一个实例的话,我们就需要使用一下分析工具了。

下面我们来看一下如何通过studio查看泄漏的步骤
我们先通过操作产生泄漏,这个时候我们的内存已经出现了泄漏。
然后点击Profile如图:
下面我们手动触发GC来回收无用的内存。如图:
然后内存不在减少后我们点击一下小垃圾桶旁边的箭头。就可以获取到内存的情况了。
我们点击MainActivity这个类,在右侧我们发现有两个对象在内存中。
点击后发现MainActivity被GlideRequests引用。如图

上面基本定位完成,这里我们在去找Glide引用MainActivity的地方就可以了。

上面讲的其实不太实用,因为实在通过leakcanary中确定MainActivity发生了泄漏,然后去直接去找的MainActivity,并且找到了Glide引用了MainActivity的实例才能顺利解决。

实际场景中还有很多复杂的内容,比如我的MainActivity可能被很多地方引用,找起来还是很麻烦的。所以这篇文章也只是最简单的应用。就像以前我写的查找应用超时的问题一样,基本也是找到trace文件,在里面找到自己项目相关的代码,在进行定位(猜测)。

结语部分
很多人都会问怎么进行内存泄漏的排查,其实我觉得更多的还是看经验了。因为有些泄漏真的是很难发现,如果是偶然才会发生的泄漏,那就真的更难查找了。
--------------------- 

网页内存泄漏的方案定位分析解决

...可控的分析环境。1.隐私窗口,禁用所有扩展(避免影响内存分析)2.关闭开发模式HMR功能,因为VUE_HOT_RELOAD也会产生一层引用,我并不能完全信任它3.使用模拟数据,每次执行操作,都会渲染一样的可被人工计算清楚(知道哪个类... 查看详情

内存泄漏定位以及解决

1内存泄漏定位1.1 valgrind Valgrind包含下列工具:memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能cachegrind:分析CPU的cache命中率、丢失率,用... 查看详情

android内存优化三:内存泄漏检测与监控

...Bitmap优化MemoryProfiler是Profiler中的其中一个版块,Profiler是AndroidStudio为我们提供的性能分析工具,使用Profiler能分析应用的CPU、内存、网络以及电量的使用情况。进入了MemoryProfiler界面。点击Record按钮后,Profiler会为我们记录一段... 查看详情

基于androidstudio的内存泄漏检测与解决(代码片段)

什么是内存泄漏Android虚拟机的垃圾回收采用的是根搜索算法。GC会从根节点(GCRoots)开始对heap进行遍历。到最后,部分没有直接或者间接引用到GCRoots的就是需要回收的垃圾,会被GC回收掉。而内存泄漏出现的原... 查看详情

node.js内存泄漏分析二

概述在开发过程中,遇到了部分导致内存泄露的情况,本文主要是说明几种内存泄漏的问题,并简单分析一些关于内测泄漏分析的方法。内存泄漏分析1.使用heapdump模块模块介绍:https://github.com/bnoordhuis/node-heapdump... 查看详情

任何可以找到内存泄漏java代码的java静态代码分析器?

】任何可以找到内存泄漏java代码的java静态代码分析器?【英文标题】:AnyjavaStaticCodeanalyzerthatcanfindmemoryleakjavacode?【发布时间】:2012-10-1209:43:47【问题描述】:   是否有任何Java静态代码分析器可以检测可能导致内存泄漏的代... 查看详情

内存泄漏--2性能优化工具memoryanalyzer(mat)内存泄露的简单检测

...MemoryAnalyzer对内存泄漏的检测作简单介绍:   首先androidStudio自带MemoryMonitor可以分析内存泄漏问题,方法如下,当我们执行了一系列操作后点击垃圾回收(需要先进行垃圾回收,这样才能发现那些该回收的类... 查看详情

内存泄漏--2性能优化工具memoryanalyzer(mat)内存泄露的简单检测

...MemoryAnalyzer对内存泄漏的检测作简单介绍:   首先androidStudio自带MemoryMonitor可以分析内存泄漏问题,方法如下,当我们执行了一系列操作后点击垃圾回收(需要先进行垃圾回收,这样才能发现那些该回收的类... 查看详情

一个java内存泄漏的排查案例

这是个比较典型的java内存使用问题,定位过程也比较直接,但对新人还是有点参考价值的,所以就纪录了一下。下面介绍一下在不了解系统代码的情况下,如何一步步分析和定位到具体代码的排查过程(以便新人参考和自己回... 查看详情

排查内存泄漏最简单和直观的方法

...考:大部分博客的方法也来自于此。总的来说,就是使用androidstudio的monitormemory功能监测app主进程占用的内存,触发GC操作,而后观察内存的占用情况,如果在使用的过程中内存不断增加,没有回落,很有可能发生了内存泄漏,... 查看详情

java内存泄漏分析系列之一:使用jstack定位线程堆栈信息

...现在将这个过程做成一个系列的文章。基本概念在对Java内存泄漏进行分析的时候,需要对jvm运行期间的内存占用、线程执行等情况进行记录的dump文件,常用的主要有threaddump和heapdump。threaddump 主要记录JVM在某一时 查看详情

分享一个辅助分析内存泄漏的脚本(代码片段)

...后cpu使用率曲线变化情况。查看的时候意外发现上线前后内存占用相差不少,20%以上。本来我没怎么在意这个问题,因为我们系统会在运行过程中缓存部分数据内容。但客户觉得有异常,坚持要查。于是把一个月的内存使用情况... 查看详情

内存泄漏分析valgrind

...网https://www.valgrind.org/valgrind是Linux业界主流且非常强大的内存泄漏检查工具。在其官网介绍中,内存检查(memcheck)只是其其中一个功能。由于只用过其内存泄漏的检查,就不拓展分享valgrind其他功能了。valgrind这个工具不能用于... 查看详情

如何创建内存转储和分析内存泄漏?

】如何创建内存转储和分析内存泄漏?【英文标题】:HowcanIcreatememorydumpsandanalyzememoryleaks?【发布时间】:2009-11-1100:39:12【问题描述】:我需要获取以下信息来分析内存泄漏问题。该怎么做?孤立块地址孤立呼叫堆栈是否有任何... 查看详情

node.js内存泄漏分析

在极客教育出版了一个视频是关于《Node.js内存泄漏分析》,本文章主要是从内容上介绍如何来处理Node.js内存异常问题。如果希望学习可前往极客学院:本文章的关键词-内存泄漏-内存泄漏检测-GC分析-memwatch文章概要由于内存泄... 查看详情

jvm调优--05---内存泄漏案例分析(代码片段)

...自动生成,如何生成可参考右边的帮助文档文章目录内存泄漏概念何为内存泄漏?==只有对象不会再被程序用到了,但是GC又不能回收他们的情况,叫内存泄漏==内存泄漏与内存溢出的关系内存泄漏的分类java中----内存... 查看详情

分析仪结果与仪器泄漏:iPhone 内存泄漏

】分析仪结果与仪器泄漏:iPhone内存泄漏【英文标题】:AnalyzerResultsvsLeaksbyInstruments:iPhonememoryleaks【发布时间】:2011-07-0510:44:20【问题描述】:我使用修复了我的应用程序的内存泄漏X-Code->使用性能工具运行->泄漏我提交了我... 查看详情

重新仪器“内存泄漏”分析,其他工具是不是提供更多信息以找到泄漏的根本原因?

】重新仪器“内存泄漏”分析,其他工具是不是提供更多信息以找到泄漏的根本原因?【英文标题】:reInstruments\'MemoryLeak\'profiling,doothertoolsgiveanymoreinforefindingrootcauseofaleak?重新仪器“内存泄漏”分析,其他工具是否提供更多信息... 查看详情