Android下的内存泄漏很隐晦
(1) 不同的引用类型:
Java2平台里面引入了java.lang.ref包,这个包中的类可以让我们引用对象,但这些对象可以不用停留在内存中。这些引用类和Java本身的垃圾回收器还存在一定的交互(在垃圾回收的不同阶段)。
Java对引用的分类(Strong reference, SoftReference, WeakReference, PhatomReference):
级别
|
什么时候被垃圾回收
|
用途
|
生存时间
|
强
|
从来不会
|
对象的一般状态
|
JVM停止运行时终止
|
软
|
在内存不足时
|
对象简单?缓存
|
内存不足时终止
|
弱
|
在垃圾回收时
|
对象缓存
|
gc运行后终止
|
假象
|
Unknown
|
Unknown
|
Unknown
|
(2)Android下怎样避免内存泄漏?
Refer: http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
有人问:static的Drawable在被重新链入一个TextView后,其callback是否也被重置,即原来的callback被丢弃呢?如果不,Android的实现好像有问题哟!
(3)如何查找内存泄漏:
refer: http://www.cnblogs.com/lbeing/archive/2010/09/29/1838858.html
如何用Memory Analyzer Tool(MAT)来分析,前提是Android开发和测试的工具安装完整,SDK,Eclipse.
更多关于MAT的内容,refer:
http://blog.csdn.net/studyvcmfc/archive/2010/06/05/5649431.aspx
http://itnewsvendor.appspot.com/1780002-使用_memory_analyzer.html
1).打开Eclipse
2).选择 Help->Install New Software;
3).在Work with中添加站点:http://download.eclipse.org/mat/1.0/update-site/(这个地址可能会变化,但是新的地址可以在官方网站上找到:http://www.eclipse.org/mat/downloads.php )
4).生成.hprof文件:插入SD卡(Android机器很多程序都需要插入SD卡),并将设备连接到PC,在Eclipse中的DDMS中选择要测试的进程,然后点击Update Heap 和Dump HPROF file两个Button。
.hprof 文件会自动保存在SD卡上,把 .hprof 文件拷贝到PC上的\ android-sdk-windows\tools目录下。这个由DDMS生成的文件不能直接在MAT打开,需要转换。
运行cmd打开命令行,cd到\ android-sdk-windows \tools所在目录,并输入命令hprof-conv xxxxx.hprof yyyyy.hprof,其中xxxxx.hprof为原始文 件,yyyyy.hprof为转换过后的文件。转换过后的文件自动放在android-sdk-windows\tools 目录下。
OK,到此为止,.hprof文件处理完毕,可以用来分析内存泄露情况了。
5).打开MAT:
在Eclipse中点击Windows->Open Perspective->Other->Memory Analysis
6).导入.hprof文件
在MAT中点击 File->Open File,浏览到刚刚转换而得到的.hprof文件,并Cancel掉自动生成报告,点击Dominator Tree,并按Package分组,选择自己所定义的Package 类点右键,在弹出菜单中选择List objects->With incoming references。
这时会列出所有可疑类,右键点击某一项,并选择Path to GC Roots->exclude weak/soft references,会进一步筛选出跟程序相关的所有有内存泄露的类。据此,可以追踪到代码中的某一个产生泄露的类。
分享到:
相关推荐
详细可参考博文:原创 android内存泄露:3、Handler的错误使用导致内存泄露 ,这篇文章我们将介绍:Toast的错误使用导致内存泄露 二、Toast的错误使用导致内存泄露 我们通常,连续点击按钮多次提示的 Toast,它...
在Android开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多内存,影响性能甚至导致应用崩溃。本示例代码着重展示了如何避免Android应用中的内存泄漏,主要包括五个关键方面:关闭游标、重用适配器、回收...
Android Studio提供了多种工具帮助开发者检测和解决内存泄露,其中包括Memory Profiler和LeakCanary。 Memory Profiler是Android Studio内置的一个强大工具,它允许开发者实时监控应用的内存使用情况。在Memory面板...
对于Android内存泄漏的检测和解决,开发者可以使用多种工具和方法。Android Studio中就集成有Profiler工具,可以帮助开发者监控应用程序的内存使用情况,并识别内存泄漏。此外,还有一些第三方的内存泄漏检测工具,...
Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...
本文将深入探讨Android内存泄漏的检测和排查方法,并通过一个锁屏内存泄漏的例子进行具体分析。 首先,我们需要理解什么是内存泄漏。在计算机科学中,内存泄漏是指程序在申请内存后,无法释放已不再使用的内存空间...
本文将详细介绍如何使用 MAT 分析 Android 应用程序中的内存泄露,特别是如何根据 heap dump 分析泄漏根源。 ClassLoader 和 Java 类加载机制 在介绍 MAT 之前,需要了解 Java 类加载机制。ClassLoader 是 Java 中...
### Android内存泄露测试详解 在Android开发中,内存管理是一项至关重要的任务,不当的内存管理会导致应用运行缓慢、崩溃甚至耗尽系统资源。内存泄露是内存管理中的一个常见问题,它指的是应用程序分配了内存但未能...
内存监控工具能够帮助开发者检测和分析应用的内存使用情况,预防和解决内存泄漏等问题。"Emmagee.apk"可能是一个专用于Android设备的内存监控应用,它允许用户直接在手机上查看和分析内存使用状况。 一、Android...
JNI层内存泄漏检测工具是针对Android应用开发中的一个重要问题——JNI内存泄漏的解决方案。JNI,全称为Java Native Interface,允许Java代码与其他编程语言(如C++)交互,从而利用其性能优势。然而,由于Java和C/...
4. **内存泄漏检测库**:有许多第三方库,如Valgrind、LeakSanitizer(ASan的一部分),可以帮助检测内存泄漏。这些工具可以在运行时检查程序的行为,报告未释放的内存块。 5. **内存泄漏检测算法**:除了工具,还...
附件是Android下检测ndk和jni内存泄漏的demo,可以用于native中malloc和free的检测。使用方法(参见博客):https://blog.csdn.net/zhuyong006/article/details/88537499
Android Native 内存泄漏系统化解决方案 在 Android 平台上,C++ 内存泄漏问题的分析和定位一直是困扰开发人员的难题,因为地图渲染、导航等核心功能对性能要求很高,高德地图 APP 中存在大量的 C++ 代码。解决这个...
android检查内存泄露和用法 <!--==============================================================================--> android:name="com.squareup.leakcanary.internal.HeapAnalyzerService" android:enabled...
LeakCanary是一款由Square公司开发的强大的内存泄漏检测工具,特别为Android平台设计,可以帮助开发者轻松定位和修复内存泄露问题。下面将详细介绍LeakCanary的工作原理、使用方法以及如何分析其生成的报告。 ### 1...
Android Studio作为官方推荐的集成开发环境(IDE),提供了强大的内存泄漏检测工具,帮助开发者定位并解决这些问题。本文将详细讲解如何使用Android Studio进行内存泄漏分析。 **一、内存泄漏的概念** 内存泄漏是指...
上面是官方文档给出的介绍,LeakCanary是一个在android上检测内存泄漏的依赖。 使用方法 只需要在你的build.gradle中添加如下依赖即可。 debugImplementation ‘com.squareup.leakcanary:leakcanary-android:2.2’ ...
Android 内存泄露原因分析。通过原因分析,再接合代码可查明具体原因,发现对策
此外,还可以使用第三方库如LeakCanary,这是一个专门为Android设计的内存泄漏检测库。LeakCanary会在后台运行,当检测到内存泄漏时,会提供详细的泄漏信息,包括泄漏对象、泄漏路径以及泄漏的大小,帮助开发者快速...