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

superxlcr superxlcr     2022-12-07     232

关键词:

什么是内存泄漏

Android虚拟机的垃圾回收采用的是根搜索算法。GC会从根节点(GC Roots)开始对heap进行遍历。到最后,部分没有直接或者间接引用到GC Roots的就是需要回收的垃圾,会被GC回收掉。而内存泄漏出现的原因就是存在了无效的引用,导致本来需要被GC的对象没有被回收掉。
比如:

public class LeakActivity extends AppCompatActivity 

    public static Leak mLeak;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_leak);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mLeak = new Leak();
    

    class Leak 

    


mLeak是存储在静态区的静态变量,而Leak是内部类,其持有外部类Activity的引用。这样就导致Activity需要被销毁时,由于被mLeak所持有,所以系统不会对其进行GC,这样就造成了内存泄漏。

另外一个例子

public class Singleton 
    private static Singleton singleton;
    private Context mContext;

    private Singleton(Context context) 
        this.mContext = context;
    

    public static Singleton getSingleton(Context context) 
        if (singleton == null) 
            synchronized (Singleton.class) 
                if (singleton == null) 
                    singleton = new Singleton(context);
                
            
        
        return singleton;
    


如果我们在在调用Singleton的getInstance()方法时传入了Activity。那么当instance没有释放时,这个Activity会一直存在。因此造成内存泄露。
解决方法可以将new Singleton(context)改为new Singleton(context.getApplicationContext())即可,这样便和传入的Activity没关系了。

内存泄漏的检测方法

打开Android Studio,编译代码运行App,然后点击Android Monitor,然后点击Monitor对应的Monitors Tab,界面如下:

在Memory一栏中,可以观察不同时间App内存的动态使用情况,点击Memory 右侧第二个按钮可以手动触发GC,点击第三个按钮可以进入HPROF Viewer界面,查看Java的Heap,如下图

Reference Tree代表指向该实例的引用,可以从这里面查看内存泄漏的原因,Shallow Size指的是该对象本身占用内存的大小,Retained Size代表该对象被释放后,垃圾回收器能回收的内存总和。

内存泄漏检测的方法
点击手动进行GC,再点击观看JavaHeap,点击Analyzer Task,Android Monitor就可以为我们自动分析泄漏的Activity啦,分析出来如下图所示:

在Reference Tree里面,我们直接就可以看到持有该Activity的单例对象,直接定位到该单例中的代码,发现代码中出现了

public class LeakActivity extends AppCompatActivity 

    public static Leak mLeak;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_leak);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mLeak = new Leak();
    

    class Leak 

    


android性能优化之利用leakcanary检测内存泄漏及解决办法(转)(代码片段)

利用LeakCanary检测内存泄漏及解决办法利用LeakCanary检测内存泄漏及解决办法什么是内存泄漏内存泄漏造成什么影响什么是LeakCanaryLeakCanary捕获常见内存泄漏以及解决办法错误使用单例造成的内存泄漏Handler造成的内存泄漏线程造成... 查看详情

android性能优化之利用leakcanary检测内存泄漏及解决办法(转)(代码片段)

利用LeakCanary检测内存泄漏及解决办法利用LeakCanary检测内存泄漏及解决办法什么是内存泄漏内存泄漏造成什么影响什么是LeakCanaryLeakCanary捕获常见内存泄漏以及解决办法错误使用单例造成的内存泄漏Handler造成的内存泄漏线程造成... 查看详情

简单内存泄漏检测方法解决detectedmemoryleaks!问题

最近在一个项目中,程序退出后都出现内存泄漏:Detectedmemoryleaks!Dumpingobjects->{98500}normalblockat0x05785AD0,152byteslong.Data:<<NNx7>3CAC4E1000000000BCA44E1078B63700Objectdumpcomplete. 而且每次退出都是一样的.泄漏的内存 查看详情

内存泄漏检测

内存泄漏检测DebugHook与ReportMemoryLeaksOnShutdown都是System下的变量.DebugHook:程序中母体中运行时,此值是1;独立运行时,它是0.在程序的任何地方加上一句ReportMemoryLeaksOnShutdown:=True;这样程序在关闭时可检测是否有内存泄漏.如果这样使用:R... 查看详情

关于visualleakdetector的配置与使用(测试vector引起的内存泄漏问题)

之前在做一个音频特征提取的批量处理程序,老是出现内存泄露问题,用VisualLeakDetector(VLD)工具做了下检测,检测出了一些问题,解决后还是会有问题。之后继续排查,因为我的代码中,大量的音频相关处理的数据都存成了vec... 查看详情

如何在 Angular 应用程序中检测与 rxjs 相关的内存泄漏

】如何在Angular应用程序中检测与rxjs相关的内存泄漏【英文标题】:HowtodetectrxjsrelatedmemoryleaksinAngularapps【发布时间】:2019-07-0614:28:59【问题描述】:是否有任何工具或技术来检测“遗留”或“当前存在”的可观察对象、订阅。最... 查看详情

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

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

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

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

什么是内存泄漏?该如何检测?又该如何解决?(代码片段)

...这个问题是我之前翻看面经的时候见到的。那位小姐姐把内存泄漏当成了内存溢出问题去解答的,结果当场挂掉了。为此总结一下,之前和一位老哥也讨论过这个问题。可见不管是面试还是工作这都是一个极为重要的点... 查看详情

使用handyjson导致的内存泄漏问题相关解决方法

...--HandyJSON。在使用过程中,使用instruments的LeakChecks工具对内存泄漏进行检测时发现了这个框架导致了不少的内存泄漏, 查看详情

常见的内存泄漏原因及解决方法

参考技术A(MemoryLeak,内存泄漏)当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏。内存... 查看详情

_crtsetbreakalloc简单内存泄漏检测方法,解决detectedmemoryleaks!问题

我的环境是:XPSP2.VS2003最近在一个项目中,程序退出后都出现内存泄漏:Detectedmemoryleaks!Dumpingobjects->{98500}normalblockat0x05785AD0,152byteslong.Data:<<NNx7>3CAC4E1000000000BCA44E1078B63700Objectdumpcomplete.  查看详情

C的内存泄漏检测器?

】C的内存泄漏检测器?【英文标题】:MemoryleakdetectorsforC?【发布时间】:2010-09-0809:08:00【问题描述】:人们对哪些内存泄漏检测器有很好的体验?以下是迄今为止的答案摘要:Valgrind-用于构建动态分析工具的检测框架。ElectricFen... 查看详情

在 ASP.NET 中检测内存泄漏

】在ASP.NET中检测内存泄漏【英文标题】:DetectingMemoryLeaksinASP.NET[closed]【发布时间】:2011-07-1313:44:54【问题描述】:我的开发团队目前正在使用ASP.NET3.5/4.0,我们的网站在IIS7.5上运行。最近,我们遇到了一些问题(大约每周一次... 查看详情

andfroid内存溢出与内存泄漏的简单分析与解决

<一>内存溢出与内存泄露首先我们要知道内存溢出与内存泄露的概念,什么是内存溢出和内存泄露。内存溢出:就想杯子里得水满了,就溢出了。内存溢出就是分配的内存被用光了,不够用了。内存泄露:就如同杯子里面有... 查看详情

在合理的时间范围内检测到一定程度内存泄漏的工具

...工具来检测内存泄漏、使用Netbeans编写并部署在Tomcat6上的基于Java的应用程序中的文件打开问题,而无需花费数小时,这些工具可以在合理的时间范围内在一定程度上检测这些异常 查看详情

在没有 EventEmitter 的情况下检测到可能的 EventEmitter 内存泄漏

】在没有EventEmitter的情况下检测到可能的EventEmitter内存泄漏【英文标题】:PossibleEventEmittermemoryleakdetectedwithoutEventEmiter【发布时间】:2017-05-0800:40:26【问题描述】:我已经尝试了很长时间自己解决这个问题,但找不到适合我的问... 查看详情

检测代码中的 node.js/javascript 内存泄漏

】检测代码中的node.js/javascript内存泄漏【英文标题】:Detectnode.js/javascriptmemoryleakincode【发布时间】:2013-03-2108:27:01【问题描述】:我有somecode正在工作,但是它有内存泄漏。在node.js中跟踪内存泄漏有哪些好的策略?查找此类泄... 查看详情