Android开发内存泄漏及检查工具使用培训资料
Android中常见的内存泄漏问题和解决方案
Android中常见的内存泄漏问题和解决方案Android是目前最流行的移动操作系统之一,但由于其开发过程中
的一些特殊性,导致了一些常见的内存泄漏问题。本文将针对这些问
题进行深入的探讨,并提供相应的解决方案。
1. 概述
内存泄漏是指在程序运行过程中,由于错误的内存管理导致无法释
放已经不再使用的内存资源,从而造成内存消耗过大或者内存溢出的
问题。在Android开发中,内存泄漏是常见的问题之一,特别是在长时间运行的应用中,更容易引发内存泄漏。
2. 常见的内存泄漏问题
2.1 匿名内部类造成的泄漏
在Android开发中,经常使用匿名内部类来实现事件监听器等功能。但如果在匿名内部类中持有外部类的引用,并且没有及时释放该引用,就会造成内存泄漏。解决这个问题的方法是,使用弱引用(WeakReference)或者静态内部类来持有外部类的引用,从而避免内
存泄漏。
2.2 非静态内部类的静态引用
在Android开发中,非静态内部类持有外部类的引用是很常见的。
但如果这个非静态内部类的实例被长时间持有,并且这个非静态内部
类持有了外部类的引用,那么就会造成内存泄漏。解决这个问题的方
法是,将非静态内部类声明为静态内部类,或者将内部类持有的引用
设置为弱引用。
2.3 资源未正确释放
在Android开发中,经常使用各种资源,如数据库连接、文件流等。如果在使用完这些资源后没有正确释放,就会造成内存泄漏。解决这
个问题的方法是,在使用完资源后及时关闭或者释放这些资源。
2.4 单例模式导致的泄漏
在Android开发中,经常使用单例模式来管理某些全局的对象。但
解决客户端开发中常见的闪退问题(一)
解决客户端开发中常见的闪退问题
现如今,移动应用的快速发展已经成为了当今社会的潮流。作为
移动应用的开发者,我们必须时刻提高自己的技术水平,以便为用户
提供更好的体验。然而,无论我们做得多好,闪退问题似乎总是不可
避免地出现在我们的应用程序中。本文将探讨一些常见的客户端开发
闪退问题,并提供一些解决方案。
一、内存泄漏
内存泄漏是一个常见的闪退问题,尤其是在移动设备资源有限的
情况下。当应用程序使用完内存后没有及时释放,导致内存占用过高,最终导致闪退。解决内存泄漏的最佳方法是使用工具来分析和检测内
存泄漏。
1. 使用性能监测工具进行检测。Android开发中常用的性能监测
工具有Android Profiler和LeakCanary。它们可以检测和定位内存泄漏问题,并提供解决方案。
2. 注意资源的生命周期管理。及时释放不再使用的对象,避免对象持有不必要的引用。
二、线程问题
多线程是客户端开发中常见的技术,但不正确地处理线程操作可
能导致闪退问题。
1. 避免在主线程执行耗时操作。主线程负责用户界面的响应,如果在主线程中执行耗时操作,就会导致界面卡顿,甚至闪退。应该使
用异步线程或线程池来执行耗时操作,保证主线程的流畅运行。
2. 合理处理线程间的通信。线程间的通信可能引发线程安全问题,导致应用程序闪退。使用线程安全的机制,例如volatile关键字、synchronized关键字等,可以解决线程安全问题。
三、异常处理
异常处理在客户端开发中起着至关重要的作用。未捕获或不正确
处理的异常会导致应用程序直接闪退。
1. 使用try-catch块捕获异常。在关键代码块中使用try-catch
安卓测试如何进行内存泄漏测试以保证应用程序的稳定性
安卓测试如何进行内存泄漏测试以保证应用
程序的稳定性
在安卓应用程序的开发过程中,内存泄漏是一个常见的问题,可能
会导致应用程序出现稳定性问题和性能下降。因此,进行内存泄漏测
试是很重要的,本文将介绍安卓测试如何进行内存泄漏测试,以保证
应用程序的稳定性。
一、什么是内存泄漏
内存泄漏是指在程序运行过程中,由于某些原因导致无法释放不再
使用的内存空间,进而影响系统性能和稳定性。安卓应用程序的内存
泄漏通常会导致内存占用不断增加,最终导致应用崩溃或运行缓慢。
二、内存泄漏测试方法
1. 手动检查:开发人员可以通过代码审查和运行时观察来检查潜在
的内存泄漏问题。这种方法需要开发人员具备一定的经验和对内存管
理的理解。通过检查代码中的对象引用、资源释放等情况,可以发现
潜在的内存泄漏问题。
2. 垃圾回收日志分析:安卓系统提供了垃圾回收日志,开发人员可
以通过分析日志来检测内存泄漏问题。垃圾回收日志会记录内存分配
和释放的情况,通过比较内存分配和释放的数量,可以初步判断是否
存在内存泄漏问题。
3. 内存分析工具:安卓开发工具包(Android SDK)提供了一些内
存分析工具,例如Android Profiler和MAT(Memory Analyzer Tool)。
这些工具可以帮助开发人员分析应用程序的内存使用情况,找出内存
泄漏的原因和位置。
4. 自动化测试框架:使用自动化测试框架可以更全面地检测应用程
序中的内存泄漏问题。例如,可以编写针对应用程序内存管理的测试
用例,模拟用户的操作和场景,观察应用程序的内存使用情况,并进
行分析和报告。常见的自动化测试框架包括Monkey、Robolectric等。
【推荐下载】Android 5.1 WebView内存泄漏问题及解决
Android 5.1 WebView 内存泄漏问题及解决
2016/11/21 1736 问题背景在排查项目内存泄漏过程中发现了一些由WebView 引起的内存泄漏,经过测试发现该部分泄漏只会出现在android 5.1 及以上
的机型。虽然项目使用WebView 的场景并不多,但秉承着一个泄漏都不放过的精
神,我们肯定要把它给解决了。
遇到的问题项目中使用WebView 的页面主要在FAQ 页面,问题也出现在多次
进入退出时,发现内存占用大,GC 频繁。使用LeakCanary 观察发现有两个内存泄
漏很频繁:
我们分析一下这两个泄漏:从图一我们可以发现是WebView 的ContentViewCore 中的成员变量mContainerView 引用着AccessibilityManager 的mAccessibilityStateChangeListeners 导致activity 不能被回收造成了泄漏。
引用关系:mAccessibilityStateChangeListeners- ContentViewCore- WebView- SettingHelpActivity
从图二可以发现引用关系是:mComponentCallbacks- AwContents- WebView- SettingHelpActivity
问题分析我们找找mAccessibilityStateChangeListeners 与mComponentCallbacks 是在什么时候注册的,我们先看看mAccessibilityStateChangeListeners
使用AndroidStudio提供的AndroidProfiler工具和mat进行内存泄漏分析
使用AndroidStudio提供的AndroidProfiler工具和
mat进行内存泄漏分析
AndroidProfiler是Android Studio 提供的一个强大的性能分析工具,它可以帮助我们识别和解决应用中的内存泄漏问题。同时,我们还可以使用MAT(Memory Analyzer Tool)来进一步分析内存泄漏的原因。
首先,我们需要运行我们的应用程序,并连接我们的设备或模拟器。然后,我们可以打开Android Studio并选择“Android Profiler”选项卡。在这个选项卡中,我们可以看到CPU、内存、网络和电池等资源的使用情况。
在内存部分,我们可以看到应用程序的内存使用情况和堆栈跟踪。我们可以使用堆栈跟踪来分析哪些对象正在使用内存,以及它们是如何被创建和释放的。
当我们发现内存使用量异常高时,我们可以使用MAT工具来进一步分析内存泄漏的原因。首先,我们需要导出堆转储文件(heap dump)。
在Android Studio中,我们可以通过运行应用程序并在内存部分的右上角点击“Dump Java Heap”按钮来导出堆转储文件。导出文件后,我们可以使用MAT工具进行分析。
打开MAT工具后,我们可以选择导入我们刚刚导出的堆转储文件。然后,MAT会分析堆转储文件,并提供一些有用的功能来分析内存泄漏。
在MAT工具中,我们可以使用“Histogram”功能来查看内存中的对象数量和大小。这将帮助我们找到可能造成内存泄漏的对象。
另一个有用的功能是“Leak Suspects”。MAT会自动分析堆转储文件,并提供一些潜在的内存泄漏嫌疑对象。我们可以点击这些对象来查看详细信息,包括对象的引用链。
AndroidHandler内存泄漏详解及其解决方案
AndroidHandler内存泄漏详解及其解决⽅案
关联篇:
关联篇:
在android开发过程中,我们可能会遇到过令⼈奔溃的OOM异常,⾯对这样的异常我们是既熟悉⼜深恶痛绝的,因为造成OOM 的原因有很多种情况,如加载图⽚过⼤,某已不再使⽤的类未被GC及时回收等等......本篇我们就来分析其中⼀种造成OOM的场景,它就是罪恶的内存泄漏。对于这样的称呼,我们并不陌⽣,甚⾄屡次与之"并肩作战",只不过它就是⼀个猪队友,只会不断送塔.......
本篇分为3部分:
1.Handler内存泄漏例⼦说明以及原理阐明
2.问题验证(如果感觉繁琐请直接跳过)
3.Handler内存泄漏解决⽅法
1.Handler内存泄漏例⼦说明以及原理阐明
Handler,我们已经相当熟悉了,⽽且经常⽤得不亦乐乎,但就是因为太熟悉了,才会偶尔被它反捅⼀⼑,⾎流不⽌......还记得我们曾经满怀信⼼地使⽤着如下的优美⽽⼜简洁的代码不?
不怕你吓着,实话告诉你,这个代码已经造成内存泄漏了不相信?我们使⽤Android lint⼯具检测⼀下该类的代码:
⾯对现实吧,那为什么会这样呢?在java中⾮静态内部类和匿名内部类都会隐式持有当前类的外部引⽤,由于Handler是⾮静态内部类所以其持有当前Activity的隐式引⽤,如果Handler没有被释放,其所持有的外部引⽤也就是Activity也不可能被释放,当⼀个对象⼀句不需要再使⽤了,本来该被回收时,⽽有另外⼀个正在使⽤的对象持有它的引⽤从⽽导致它不能被回收,这导致本该被回收的对象不能被回收⽽停留在堆内存中,这就产⽣了内存泄漏(上⾯的例⼦就是这个原因)。最终也就造成了OOM.......我们再来段清晰的代码,我们来使⽤mHandler发送⼀个延迟消息:
leakcanary用法 -回复
leakcanary用法-回复
使用LeakCanary进行内存泄漏检测与解决
引言:
在开发Android应用程序时,我们经常需要处理大量的对象和资源。如果我们在使用完后不适时进行释放,就可能导致内存泄漏。内存泄漏可能会导致应用程序性能下降、占用更多的内存、导致程序崩溃,甚至可能导致应用程序被系统杀死。为了避免这些问题,我们可以使用LeakCanary工具进行内存泄漏检测与解决。本文将介绍如何使用LeakCanary来检测和解决内存泄漏问题。
第一步:集成LeakCanary
要开始使用LeakCanary,我们首先需要在项目的build.gradle文件中添加LeakCanary的依赖项。在dependencies块中添加以下代码:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.6'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:2.6'
这段代码会在debug版本中引入LeakCanary,并在release版本中禁用它。这样可以避免在发布版本中不必要的性能开销。
第二步:初始化LeakCanary
在应用程序的Application类中,我们需要初始化LeakCanary。我们可以通过以下代码完成初始化:
kotlin
class MyApplication : Application() {
override fun onCreate() {
在Android Studio中分析内存泄漏
在Android Studio中分析内存泄漏内存泄漏是开发过程中常见的问题之一,在Android应用程序中尤为突出。当我们在开发应用时忽略了内存管理,或者对内存泄漏的检测不够敏感,就容易造成内存泄漏。而Android Studio作为一款强大的集成开发环境,提供了丰富的工具和功能来帮助我们分析和解决内存泄漏问题。本文将介绍如何在Android Studio中分析内存泄漏,并提供一些常见的解决方案。
一、内存泄漏的概念及影响
内存泄漏是指在程序中分配了一块内存后,由于某种原因导致无法再次访问和释放这块内存,从而造成内存的浪费。在Android应用中,内存泄漏的存在会导致一系列问题,包括但不限于:
1. 应用程序占用内存过高,导致系统资源消耗过多,从而影响整体性能;
2. 应用程序运行速度变慢,响应时间延长,用户体验差;
3. 频繁的垃圾回收(Garbage Collection)导致界面卡顿或卡死。
二、分析工具介绍
Android Studio提供了一些实用的工具和插件,帮助我们检测和分析内存泄漏。以下是其中一些常用的工具和插件:
1. Android Profiler:官方内置的性能分析工具,可以监控应用的CPU、内存、电量等性能数据,并提供实时的数据图表展示,帮助我
们发现内存泄漏的位置。
2. LeakCanary:一款非常流行的开源库,专门用于检测内存泄漏。
只需要引入该库,并通过简单的配置即可在应用中实时检测内存泄漏,并生成详细的分析报告。
3. MAT(Memory Analyzer Tool):一款功能强大的Java内存分析器,可以用于分析Java应用程序的内存占用情况、泄漏对象的引用链等。
Android内存管理、泄漏调试技巧
public View getView(int pos
ition, View
convertVi
ew•, 构V造ieAdwapGtrero时u,p没p有a使r用e缓nt存)的convertView。
{
View view = null;
初始化时ListView会从BaseA
if (convertView != null dapter中根据当前屏幕布局
ockScreen 个一义定中PhoneStateListener 到册注它将时同,象对的TelephonyManager 于对。中务服LockScreen 当,象对 个一建创会就候时的面界屏锁示显要需LockScreen 候时的失消面界屏锁当而,象对LockScreen 。掉放释被会就象对
放释在果如是但LockScreen 的册注前之们我消取记忘候时的象对PhoneStateListener 致导会则,象对LockScreen 的量大于由会终最则,失消和示显面界屏锁使的断不果如。收回圾垃被法无LockScreen 起引而收回被法办有没象对OutOfMemo ry,得使system_process 。掉挂程进
• 如果分析不出来,需要通过MAT工具进行进一步的查找。
MAT(Memory Analyzer Tool)
• 下载HPROF文件。 • 使用Eclipse Memory Analyzer工具打开。 • 如果无法打开需要使用Android自带的hprof-conv.exe 工具进行转换。
kotlin leakcanary使用实例
kotlin leakcanary使用实例
LeakCanary 是一个针对Android 应用的内存泄漏检测库,它可以帮助开发者及时发现和解决内存泄漏问题。下面是一个简单的Kotlin 示例,演示了如何在Android 项目中使用LeakCanary:
1. 首先,在你的项目的build.gradle 文件中添加LeakCanary 的依赖:
```kotlin
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
}
```
2. 在你的Application 类中初始化LeakCanary:
```kotlin
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
if (LeakCanary.isInAnalyzerProcess(this)) {
return
}
LeakCanary.install(this)
}
}
```
3. 运行你的应用程序,并在应用中制造一个内存泄漏。
4. 当你退出应用后,LeakCanary 会在通知栏中显示内存泄漏的通知,并提供详细的内存泄漏信息,帮助你定位和解决问题。
这只是一个简单的演示,实际上LeakCanary 还提供了更多高级的功能和配置选项,比如自定义Heap 分析、定制内存泄漏检测策略等。你可以根据你的实际需求来进一步配置和使用LeakCanary。
android addresssanitizer用法
android addresssanitizer用法
全文共四篇示例,供读者参考
第一篇示例:
Android AddressSanitizer 是Android 平台上的内存错误检测工具,通过在编译时将AddressSanitizer (ASan) 编译器插入到代码中,可以对内存错误进行检测和定位。它可以帮助开发人员及时发现和解决内存错误问题,提高应用程序的稳定性和安全性。本文将介绍Android AddressSanitizer 的用法和优势。
1. 开启AddressSanitizer 功能
在Android 平台上,开启AddressSanitizer 功能需要修改应用的构建脚本,添加编译选项-fsanitize=address 。在Android Studio 中,可以在app/build.gradle 文件中添加以下配置:
android {
compileOptions {
externalNativeBuild {
cmake {
cppFlags "-fsanitize=address"
}
}
}
}
2. 运行应用程序
开启AddressSanitizer 功能后,可以运行应用程序进行测试。在运行应用程序时,AddressSanitizer 会对内存进行监控。如果发现内存错误,会在日志中输出错误信息,并指明错误发生的位置,方便开发人员进行定位和修复。
3. 分析日志信息
4. 定位和修复内存错误
根据AddressSanitizer 输出的错误信息,开发人员可以定位内存错误的具体位置。常见的内存错误包括堆溢出、缓冲区溢出、内存泄漏等。通过分析错误信息,可以找到引发问题的代码片段,并进行修复。
android mat用法 -回复
android mat用法-回复
Android MAT(Memory Analysis Tool)是一种用于Android应用程序的内存分析工具。它可以帮助开发人员在应用程序开发的各个阶段,特别是在内存泄漏和性能问题方面进行调试和修复。
作为一个开发人员,使用MAT工具可以帮助我们更好地理解我们的应用程序在内存方面的问题,并提供相应的解决方案。下面将详细介绍如何使用Android MAT工具来分析和调试应用程序的内存问题。
第一步:安装Android MAT工具
首先,您需要从Eclipse MarketPlace或者Android开发者官网下载并安装MAT工具。安装完成后,您可以在Eclipse的菜单栏中找到MAT工具。
第二步:运行应用程序并生成HPROF文件
当您的应用程序运行时,通过点击Eclipse的“Dump HPROF file”按钮或者使用adb命令来生成应用程序的HPROF文件。例如:adb shell am dumpheap -n com.example.app /sdcard/heapdump.hprof。
第三步:打开HPROF文件
打开MAT工具后,您需要点击菜单栏中的“Open Heap Dump”按钮来加载应用程序的HPROF文件。选择相应的文件之后,MAT将会进行分析。
第四步:分析内存泄漏
在MAT工具的“Overview”选项卡中,您可以首先查看整个应用程序的总体情况。通过分析柱状图和饼状图,您可以了解应用程序的内存使用情况。
接下来,在“Dominator Tree”选项卡中,您可以找到内存中最大的对象。这些对象可能是内存泄漏的源头。选择其中一个对象,然后在右侧的“Paths from GC Roots”窗口中查看它的引用链。通过分析引用链,您可以确定对象是否被正确地释放。
Android开发中的内存管理和垃圾回收机制
Android开发中的内存管理和垃圾回收机制
随着移动设备的迅速普及,Android操作系统成为了人们最为熟悉和广泛使用的移动操作系统之一。作为开发者,了解Android开发中的内存管理和垃圾回收机制至关重要。本文将介绍Android开发中的内存管理和垃圾回收机制,帮助开发者更好地应用于实践中。
一、了解内存管理
在Android应用程序开发中,内存是一种非常宝贵的资源。正确的内存管理可以提高应用程序的性能,并避免出现内存溢出等问题。Android系统为每个应用程序分配了自己的进程,每个进程限制了使用的内存大小。因此,开发者需要关注应用程序的内存使用情况,以确保程序的正常运行。
内存分区
Android系统将内存分为几个不同的区域,每个区域都对应着一种不同的内存使用方式。其中,堆内存和栈内存是我们最常接触的两种内存分区。
堆内存是用于存储对象实例的内存区域,它的大小在应用程序运行时可以动态调整。开发者需要注意堆内存的使用,避免出现内存泄漏等问题。
栈内存是用于存储局部变量和方法调用信息的内存区域。栈内存的使用由系统自动管理,不需要开发者进行额外的操作。
内存泄漏
内存泄漏是指应用程序在使用过程中,因为一些原因导致已不再
使用的对象无法被垃圾回收的现象。内存泄漏会导致内存占用过高,
最终导致应用程序崩溃或者变得非常卡顿。
开发者可以通过正确地使用对象的生命周期管理来避免内存泄漏。例如,在不再使用对象时,及时将对象设置为null,以便垃圾回收机
制将其回收。
二、认识垃圾回收机制
垃圾回收是一种自动化的内存管理技术,用于在应用程序运行过
kotlin leakcanary使用实例 -回复
kotlin leakcanary使用实例-回复
Kotlin LeakCanary使用实例
在移动应用开发领域,内存泄漏一直是一大头痛问题。如果不及时解决内存泄漏问题,应用程序的性能和稳定性都会受到严重影响。为了检测并解决内存泄漏问题,许多开发者使用了一些强大的工具,如LeakCanary。本文将以Kotlin LeakCanary的使用示例为主题,详细介绍如何使用LeakCanary来检测和解决内存泄漏问题。
一、什么是LeakCanary?
LeakCanary是一个针对Android应用程序的内存泄漏检测库,它由Square公司开发,并且已经成为Android开发者们的首选工具之一。LeakCanary能自动检测和报告内存泄漏,并为开发者提供详细的内存泄漏报告。使用LeakCanary,开发者可以快速定位和解决内存泄漏问题,提高应用程序的性能和稳定性。
二、如何集成LeakCanary到Kotlin项目中?
要在Kotlin项目中使用LeakCanary,我们需要在项目的build.gradle文件中添加以下依赖:
dependencies {
debugImplementation
'com.squareup.leakcanary:leakcanary-android:2.x.x'
releaseImplementation
'com.squareup.leakcanary:leakcanary-android-no-op:2.x.x'
}
leakcanary-android是在Debug构建类型中使用的依赖,而leakcanary-android-no-op是在Release构建类型中使用的依赖。
在Android Studio中使用LeakCanary检测内存泄漏
在Android Studio中使用LeakCanary检测
内存泄漏
Android Studio是广泛使用的Android应用开发集成开发环境(IDE),它为开发人员提供了丰富的工具和功能来简化应用程序的创建和调试过程。然而,在开发过程中,内存泄漏是一个常见的问题,特别是对于长时间运行的应用程序。为了解决这个问题,开发者经常使用内存泄漏检测工具来帮助定位并修复泄漏问题。其中,LeakCanary是一个颇受欢迎的工具,它能够快速而准确地检测出内存泄漏,并提供详细的报告来帮助开发者解决这些问题。
本文将介绍如何在Android Studio中使用LeakCanary来检测和修复内存泄漏问题。以下是具体的步骤和注意事项:
一、首先,我们需要在项目的build.gradle文件中添加LeakCanary 依赖。在dependencies部分添加以下代码:
```
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0'
}
```
这将在我们的项目中引入LeakCanary库,以便于我们在调试过程中使用它。
二、接下来,在我们的Application类中进行初始化。在你的Application类的onCreate()方法中,添加以下代码:
```
if (LeakCanary.isInAnalyzerProcess(this)) {
// 这个进程是LeakCanary分析进程,不监控这个进程的对象
return;
MAT概述--Android内存泄露检查工具
MAT概述
对于大型JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现。JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储(Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。
通常内存泄露分析被认为是一件很有难度的工作,一般由团队中的资深人士进行。不过,今天我们要介绍的MAT(Eclipse Memory Analyzer)被认为是一个“傻瓜式“的堆转储文件分析工具,你只需要轻轻点击一下鼠标就可以生成一个专业的分析报告。和其他内存泄露分析工具相比,MAT 的使用非常容易,基本可以实现一键到位,即使是新手也能够很快上手使用。
MAT 的使用是如此容易,你是不是也很有兴趣来亲自感受下呢,那么第一步我们先来安装MAT。
准备环境和测试数据
我们使用的是Eclipse Memory Analyzer V1.2.0,JDK 6
安装MAT
和其他插件的安装非常类似,MAT 支持两种安装方式,一种是“单机版“的,也就是说用户不必安装Eclipse IDE 环境,MAT 作为一个独立的Eclipse RCP 应用运行;另一种是”集成版“的,也就是说MAT 也可以作为Eclipse IDE 的一部分,和现有的开发平台集成。
1、单机版安装方式
单机版可到可到/mat/downloads.php下载,解压运行后如下图所示:
在MAT中打开获取的转储文件,文件夹在完成后自动生成分析报告,如图所示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android 开发内存泄漏及检查工具使用培
训资料
目录
1内存泄露 (3)
1.1 内存泄露的概念 (3)
1.2 开发人员注意事项 (4)
1.3 Android(java)中常见的引起内存泄露的代码示例 (4)
1.3.1查询数据库没有关闭游标 (6)
1.3.2 构造Adapter时,没有使用缓存的convertView (6)
1.3.3 Bitmap对象不在使用时调用recycle()释放内存 (7)
1.3.4 释放对象的引用 (8)
1.3.5 其他 (9)
2内存泄露的分析工具 (9)
2.1 内存监测工具DDMS --> Heap (9)
2.2 内存分析工具MAT (Memory Analyzer Tool) (10)
2.2.1 生成.hprof文件 (10)
2.2.2 使用MA T导入.hprof文件 (11)
2.2.3 使用MA T的视图工具分析内存 (12)
1内存泄露
Android 应用程序开发以Java语言为主,而Java编程中一个非常重要但却经常被忽视的问题就是内存使用的问题。Java的垃圾回收机制(Garbage Collection 以下简称GC)使得很多开发者并不关心内存使用的生命周期,只顾着申请内存,却不手动释放废弃的内存,而造成内存泄露,引起很多问题,甚至程序崩溃。Android的虚拟机Dalvik VM和java虚拟机JVM没有什么太大的区别,只是在字节码上稍做优化,所以Android应用开发中同样会出现内存泄露的问题。而且由于Android智能平台主要用于嵌入式产品开发,可用的内存资源更加稀少,所以对于我们Android应用开发人员来说,就更该了解Android程序的内存管理机制,避免内存泄露的发生。
1.1 内存泄露的概念
在计算机科学中,内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,严格意义上来说这是不准确的。
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。
这里我们只简单的理解,在java程序中,如果已经不再使用一个对象,但是仍然有引用指向它,GC就无法收回它,当然该对象占用的内存就无法再被使用,这就造成内存泄露。可能一个实例对象的内存泄露很小,并不会引起很大的问题。但是如果程序反复做此操作或者长期运行,造成内存不断泄露,终究会使程序无内存可用,只好被系统kill掉。在以下情况,内存泄漏导致较严重的后果:
* 程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
* 新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
* 程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
* 泄漏在操作系统内部发生;
* 泄漏在系统关键驱动中发生;
* 内存非常有限,比如在嵌入式系统或便携设备中;
* 当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。
1.2 开发人员注意事项
对于开发者,对待内存泄露应该以防为主,以治为辅,因为一旦造成内存泄露,追查原因并不容易,虽然有工具可以利用,但是还是会耗费不必要的时间和精力来分析内存使用报告和反复搜查代码。为了开发高性能和高质量的软件,防止出现豆腐渣工程的出现,我们要知道什么时候用gc什么时候用recycle以及到底用不用finalization,因为Java 对内存的分配只需要new开发者不需要显示的释放内存,但是这样造成的内存泄露问题的几率反而更高。我们还需要:
1.了解Java 的四种引用方式,比如强引用,软引用,弱引用以及虚引用。一些复杂些的程序在长期运行很可能出现类似OutOfMemoryError 的异常。
2.并不要过多的指望gc,不用的对象可以显示的设置为空,比如obj=null,这里提示大家,java的gc使用的是一个有向图,判断一个对象是否有效看的是其他的对象能到达这个对象的顶点,有向图的相对于链表、二叉树来说开销是可想而知。
3.Android 为每个程序分配的对内存可以通过Runtime类的totalMemory() freeM emory() 两个方法获取VM的一些内存信息,对于系统heap内存获取,可以通过Da lvik.VMRuntime 类的getMinimumHeapSize()方法获取最小可用堆内存,同时显示释放软引用可以调用该类的gcSoftReferences()方法,获取更多的运行内存。
4.对于多线程的处理,如果并发的线程很多,同时有频繁的创建和释放,可以通过concurrent类的线程池解决线程创建的效率瓶颈。
5.不要在循环中创建过多的本地变量。
Java中的引用简介:
在Java中内存管理,引用分为四大类,强引用HardReference、弱引用WeakReference、软引用SoftReference 和虚引用PhantomReference。它们的区别也很明显,HardReference 对象是即使虚拟机内存吃紧抛出OOM 也不会导致这一引用的对象被回收,而WeakReference等更适合于一些数量不多,但体积稍微庞大的对象,在这四个引用中,它是最容易被垃圾回收的,而我们对于显示类似Android Market 中每个应用的AppIcon时可以考虑使用SoftReference来解决内存不至于快速回收,同时当内存短缺面临JavaVM崩溃抛出OOM前时,软引用将会强制回收内存,最后的虚引用一般没有实际意义,仅仅观察GC 的活动状态,对于测试比较实用同时必须和ReferenceQueue一起使用。对于一组数据,我们可以通过HashMap的方式来添加一组SoftReference对象来临时保留一些数据,同时对于需要反复通过网络获取的不经常改变的内容,可以通过本地的文件系统或数据库来存储缓存。
1.3 Android(java)中常见的引起内存泄露的代码示例
Android 主要应用在嵌入式设备当中,而嵌入式设备由于一些众所周知的条件限制,通常都不会有很高的配置,特别是内存是比较有限的。如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机。为了能够使得Android应用程序安全且快速的运行,Android 的每个应用程序都会使用一个专有的Dalvik 虚拟机实例来运行,它是由Zygote 服务进程孵化出来的,也就是说每个应用程序都是在属于自己的进程中运行的。一方面,如果程序在运行过程中出现了内存泄漏的问题,仅仅会使得自己的进程被kill 掉,而不会影响其他进程(如果是system_process 等系统进程出问