Android减少内存占用专题
Android应用内存优化与性能调优技巧

Android应用内存优化与性能调优技巧第一章:内存管理基础Android应用内存管理是确保应用平稳运行的重要环节,开发者需要了解内存管理的基础知识,以便进行有效的优化和调优。
在本章中,我们将介绍Android应用的内存管理原理、内存泄漏和内存溢出的区别以及常见的内存优化工具和技巧。
1.1 Android应用内存管理原理在Android应用中,每个应用都有一定的内存限制,称为最大堆(Max Heap)。
Android系统通过垃圾回收机制(GC)来回收未使用的内存,使其可供其他应用或系统使用。
内存管理器(Memory Manager)会根据应用的内存需求,动态分配和回收内存。
1.2 内存泄漏与内存溢出的区别内存泄漏(Memory Leak)和内存溢出(Memory Overflow)是常见的内存问题。
内存泄漏是指应用持有某些资源的引用,但无法释放这些资源,导致内存的持续增长。
内存溢出是指应用所需的内存超出了系统分配的内存限制,导致应用崩溃或系统变慢。
优化内存泄漏和避免内存溢出是提高应用性能的关键。
1.3 常见的内存优化工具和技巧为了帮助开发者有效地进行内存优化,Android提供了一系列的内存优化工具和技巧。
其中包括内存分析工具(如Android Profiler和MAT)、内存优化插件(如LeakCanary和MemoryMonitor)以及一些开发技巧(如使用弱引用和使用集合类的优化)。
第二章:内存优化技巧本章将介绍一些实用的内存优化技巧,帮助开发者减少内存消耗、降低应用占用内存的风险,提高应用的性能和响应速度。
2.1 减少内存消耗的技巧在开发应用时,可以采取以下技巧来减少内存消耗:- 使用资源引用(Resource References)来引用大型资源,减少内存占用;- 优化图像资源的大小和压缩方式,减少内存占用;- 使用懒加载(Lazy Loading)来延迟加载大型资源,减少应用启动时的内存占用。
app内存越来越大 怎么清除

app内存越来越大怎么清除当手机上的应用程序占用越来越多的内存空间时,这可能会导致设备变得缓慢,运行不稳定,或者存储空间不足。
为了解决这个问题,你可以采取一些措施来清除应用内存,释放设备内存空间,提高性能。
以下是一些建议:1. 清除应用缓存:在大多数应用中,你可以在设置中找到“缓存清除”或“存储清除”选项。
清除应用缓存将释放一些内存空间,但不会影响应用的功能。
2. 删除不常用的应用:检查你的手机,看看是否有一些你不再使用或很少使用的应用。
卸载这些应用可以释放大量内存空间。
3. 管理应用数据:有些应用可能会存储大量数据,如照片、视频、音频文件等。
你可以通过在应用内或通过手机设置来删除或清理这些数据。
4. 更新应用:确保你的应用是最新版本。
开发者通常会修复和优化应用,以减少内存使用和提高性能。
5. 限制后台运行应用:在手机的设置中,你可以查找“应用管理”或“应用权限”选项,然后限制某些应用在后台运行。
这可以减少内存占用。
6. 使用存储管理工具:一些手机提供内置的存储管理工具,可以帮助你识别和清除不必要的文件和数据。
7. 云存储:将一些照片、视频和文件上传到云存储服务,如Google云端硬盘或iCloud,以释放手机存储空间。
8. 恢复出厂设置:如果你的手机内存问题非常严重,你可以考虑进行恢复出厂设置。
但请注意,这将清除所有手机上的数据,包括照片、联系人等。
在执行此操作之前,请务必备份重要数据。
9. 外部存储设备:如果你的手机支持外部SD卡,你可以考虑将一部分数据移至SD卡以释放内部存储空间。
需要注意的是,清理内存可能会影响某些应用的性能,特别是在你删除缓存或数据时。
在进行任何内存清理操作之前,确保你了解清理操作的影响,并仔细审查应用和数据,以确保你不会删除重要信息。
综上所述,通过清理缓存、卸载不常用的应用、管理应用数据、更新应用等方法,你可以有效地清除手机内存,提高设备性能,以确保手机运行顺畅。
希望这些建议对你有所帮助。
Android开发常见问题解决方案

Android开发常见问题解决方案随着移动互联网的快速发展,安卓市场的崛起不可阻挡,越来越多的开发者开始投身于安卓开发行业。
然而,尽管安卓开发领域有着巨大的商业价值,但各种程序问题也使安卓应用程序的开发过程变得举步维艰。
为此,这篇文章将结合我多年的安卓开发经验,为大家总结一些安卓程序开发中常见的问题及其解决方案。
一、内存溢出安卓应用程序在运行过程中如果占用的内存过多,就会出现内存溢出的情况,导致程序无法正常运行甚至直接崩溃。
为了解决这个问题,我们可以采用以下几个方法:1.及时回收无用的对象,防止内存泄漏,可使用虚拟机提供的GC(Garbage Collector)机制。
2. 使用缓存技术,对一些频繁访问的数据进行缓存,减少内存的占用。
3. 通过管理器来确保内存的被妥善释放,不再占用内存。
二、ANR(应用程序无响应)安卓开发中,当程序处理一些耗时操作时,就可能会导致ANR(Application Not Responding)现象出现。
此时,程序会停滞无动,用户无法正常使用。
为了避免ANR问题,我们可以采取以下几个措施:1. 在UI线程外执行耗时操作,如搜索网络、磁盘IO、图片加载等操作,可以通过启动一个新的线程或使用AsyncTask等异步任务处理机制来实现。
2. 使用Handler等机制通过消息机制实现非UI线程与主线程的交互,做到程序的快速响应。
3. 在开发阶段,使用DDMS中的traceview工具对应用程序进行评估和优化,及时找出导致ANR的问题点。
三、UI界面卡顿安卓应用程序在运行过程中,当UI界面过于复杂或处理大量数据时,会导致UI卡顿甚至崩溃的现象。
下面介绍一些解决方案:1. 通过异步任务等线程切换机制,将耗时操作放入子线程进行,保证UI 线程的干净与流畅。
2. 对于绘制复杂的UI元素,如ListView、GridView等,可以使用ViewHolder、异步框架等技术实现懒加载,单次绘制的数量不超过15个View。
安卓手机内存经常不够用怎么办

安卓手机内存经常不够用怎么办关于安卓手机内存经常不够用的问题,相信很多网友都遇到过,那么下面就由店铺来给你们说说安卓手机内存经常不够用的解决方法吧,希望可以帮到你们哦!安卓手机内存经常不够用的解决方法一:1、存储内存的清理:由于软件会缓存很多文件占用内存,卸载后的残留文件我们可以用一款叫做“猎豹清理大师”(原金山清理大师)的软件对垃圾文件进行清理。
2、运行内存的清理:可以长按Home键,调出近期任务列表,关闭不需要的程序,释放一定的内存空间。
在内存严重不足的情况下,可以尝试解除系统最高权限,卸载不需要的内置软件。
3、一般内存手机运行内存低于1G就会出现明显的卡顿,所以选购手机最好挑选2G以上的手机。
其次:手机内存空间所剩不多,需要做以下操作:1、清理垃圾。
用垃圾清理软件,清理一下手机的垃圾。
推荐猎豹清理大师、LBE安全大师、SD女佣等。
2、移走相册。
一般,手机中最大的空间占用处是相册,长时间拍照和拍摄视频,会占用大量的空间。
需要把这些照片和视频移到电脑里或移到云盘里,以节省空间。
3、压缩相片。
很多软件都有压缩相片的功能。
比如猎豹清理大师、360等。
可以在画质没有明显变化的前提下,把照片进行再一次压缩,占用空间至少节省一半。
4、删除系统内无用的软件。
这个需要root后,然后删除。
最好删除游戏和运营商增值应用,不要删不了解的系统程序。
5、把应用移动到SD卡上。
在应用管理器里,找到应用,移到SD卡上。
安卓手机内存经常不够用的解决方法二:1、终止后台不常用软件运行程序很多人,通常只是在界面关闭软件。
对于安卓机来说,这些程序可能还在后台运行,比如优酷等视频网站,如果后台同时开好几个,所占的运行内存RAM可想而知有多少,这时候需要关闭后台运行这些软件,释放RAM内存空间。
可以下载应用管家,一键隔离应用,关闭后台程序,彻底释放内存(前提是要root权限)。
2、限制后台一些软件自动启动有些软件我们安装时,被默认为开机“自动启动”了。
Android避免内存溢出(OutofMemory)方法总结

of Memory)方法总Android避免内存溢出(Out结避免内存溢出的方法,主要是对以下三个方面对程序进行优化武汉Android培训内存引用在处理内存引用之前,我们先来复习下什么是强引用、软引用、弱引用、虚引用强引用:强引用是使用最普遍的引用。
如果一个对象具有强引用,那垃圾回收器绝不会回收它。
当内存空间不足,Java 虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
软引用:如果一个对象只具有软引用,但内存空间足够时,垃圾回收器就不会回收它;直到虚拟机报告内存不够时才会回收,只要垃圾回收器没有回收它,该对象就可以被程序使用。
软引用可用来实现内存敏感的高速缓存。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
弱引用:只具有弱引用的对象拥有更短暂的生命周期。
在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间是否足够,都会回收它的内存。
不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
虚引用:虚引用可以理解为虚设的引用,与其他几种引用都不同,虚引用并不会决定对象的生命周期。
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收器回收的活动。
虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。
当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
app内存越来越大 怎么清除

app内存越来越大怎么清除应用程序内存占用越来越大可能会导致手机性能下降,运行速度变慢。
为了清除应用程序的内存,你可以采取以下措施:1. 清除缓存:许多应用程序会在本地存储缓存数据,以便更快速地加载内容。
你可以在应用的设置中找到清除缓存的选项。
这将清除应用程序的临时数据,但不会影响你的个人信息。
2. 卸载不常用的应用:你可以检查手机上的应用列表,找出哪些应用你不再使用或很少使用,并将其卸载。
这将释放存储空间和内存。
3. 限制后台运行应用程序:在手机的设置中,你可以查看应用程序的后台运行权限,限制某些应用在后台运行。
这可以减少内存占用和电池消耗。
4. 更新应用程序:确保你的应用程序都是最新版本。
开发者通常会修复应用程序的内存管理问题,并提高性能。
5. 重启手机:有时,重启手机可以帮助释放内存并提高性能。
这将关闭所有运行的应用程序,并清空内存。
6. 使用内存清理应用:有很多第三方内存清理应用程序可供选择,它们可以扫描你的手机并建议清除哪些应用程序的缓存或数据。
但要注意,一些内存清理应用可能并不总是有效,而且可能会引入广告或降低性能。
7. 备份和重置:如果以上方法都无法解决问题,你可以考虑备份手机数据,然后进行出厂设置重置。
这将恢复手机到初始状态,通常会清除所有应用和数据。
请确保提前备份所有重要数据。
需要注意的是,清除应用程序内存可能会导致应用程序重新加载数据,但不会影响你的帐户信息或设置。
确保你知道每个应用程序的清除操作对你的数据和设置的影响,以避免不必要的麻烦。
维护好手机的内存清洁将有助于提高手机性能和延长其使用寿命。
android ontrimmeomory level值

android ontrimmeomory level值在Android 中,onTrimMemory 方法是用于处理内存不足情况的一种机制。
该方法在Android 4.0(API 级别14)及以上版本引入,用于允许应用程序根据系统内存的不同级别来释放资源或采取其他适当的措施,以确保应用程序的性能和用户体验。
1. onTrimMemory 方法概述:onTrimMemory 方法是ComponentCallbacks2 接口的一部分,用于监听系统的内存状况。
在应用程序的生命周期中,系统可能会调用这个方法,传递不同级别的参数,以指示当前系统内存的状态。
2. onTrimMemory 方法参数:onTrimMemory 方法的参数是一个整数,表示不同的内存级别。
以下是一些常见的内存级别值:•TRIM_MEMORY_COMPLETE (80):系统内存极度不足,应用程序应该释放所有非关键的资源。
此时应该考虑清理缓存、关闭不必要的后台进程等。
•TRIM_MEMORY_MODERATE (60):系统内存较低,应用程序应该释放一些资源。
此时可以考虑清理一些缓存,以便回收内存。
•TRIM_MEMORY_BACKGROUND (40):应用程序在后台,系统内存较低,可能会被终止。
此时应释放一些不必要的资源,以便在后台运行时减少内存占用。
•TRIM_MEMORY_UI_HIDDEN (20):应用程序的UI 不可见,可以释放与UI 相关的资源。
3. onTrimMemory 的使用:@Overridepublic void onTrimMemory(int level){super.onTrimMemory(level);switch(level){case ComponentCallbacks2.TRIM_MEMORY_COMPLETE:// 释放所有非关键的资源break;case ComponentCallbacks2.TRIM_MEMORY_MODERATE:// 释放一些资源break;case ComponentCallbacks2.TRIM_MEMORY_BACKGROUND: // 应用程序在后台,释放资源break;case ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN:// UI 不可见,释放与UI 相关的资源break;// 其他内存级别...}}4. 注意事项:•在实现onTrimMemory 方法时,应该根据应用程序的实际需求选择释放哪些资源。
minifyreleasewithr8 内存占用

minifyreleasewithr8 内存占用R8是一种在Android应用中减少代码与资源大小的工具,它能够通过移除无用的代码、优化和压缩代码来减少APK的大小。
R8还提供了在发布版本中进一步减小应用内存占用的功能,它能够对应用代码进行深入的分析,并采取一系列策略来最大程度地减少应用程序的内存使用。
在R8的发布版本中,主要有以下几个方面的优化来最小化应用的内存占用:1.代码压缩:R8能够提供比较出色的代码压缩效果,它能够移除掉未使用的代码、无用的资源,并使用代码混淆技术来优化代码结构,使得代码更加紧凑、高效。
这些优化手段可以有效地减少应用的内存占用。
2.优化资源文件:R8能够自动地识别出未使用的资源文件,并将其从APK中移除。
这些未使用的资源文件包括未使用的图片、布局文件等,通过移除这些无用的资源,可以进一步减小APK包的大小。
3.动态库过滤:R8还提供了对动态库的过滤功能,可以根据不同的设备架构过滤不需要的动态库,只保留需要的动态库。
这样就可以避免应用在安装过程中安装不必要的动态库,进一步减小应用的内存占用。
4.字节码优化:R8在编译时会对应用的字节码进行优化,包括移除无用的方法、合并重复的方法等。
这样可以减少运行时加载的类和方法数量,从而进一步减小应用的内存占用。
5. App Startup优化:R8还提供了App Startup优化的功能,通过静态分析应用的启动流程,找出冷启动过程中的依赖关系,并调整代码结构,以减少加载的类和资源。
这样可以有效地减少应用冷启动时的内存占用。
综上所述,使用R8进行release版本的混淆、压缩与优化能够很大程度地减小应用的内存占用。
其通过移除无用的代码与资源、优化字节码和资源文件、过滤动态库等一系列优化手段,使得应用变得更加紧凑、高效。
在发布版本中使用R8进行内存优化,对于提高应用的性能和用户体验非常重要。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android减少内存占用专题Android开发经验:不要动不动就分配内存2011-03-21开发Andorid应用的开发者都知道,要尽量减少new关键字的使用,因为在手机上GC释放一次内存是一件恐怖的事情,如果你查看一下调试记录,你会发现GC释放内存时有时会花上几百毫秒的时间。
可以想象,如果你开发的是游戏,这时你的FPS会下降到多少。
虽然这个原则大家都知道,我们还是会看到一些开发者会出现类似问题,这又是为什么呢?呵呵,其实这是一些隐式的对象创建在作怪,看看以下代码:原则1:如果可能,请不要使用可变参数当外部调用时:系统会自动创建一个临时的数组对象,类似于:如果该函数经常被调用,则会极大增加GC的压力。
所以,如果可能,请不要使用可变参数。
原则2:如果可能,请用StringBuilder代替字符串的相加我们来看一段代码:系统会将这句翻译成为如下格式:这本身没有什么问题,但如果是如下就有意思了:这段代码等效于:这样是不是悲剧,本来StringBuilder被无意义的重复创建了多次,期间还在数字转换到文本时创建了String,所以请直接使用显示的StringBuilder来链接字符串。
原则3:尽量将不变的东东设置为常数,特别是字符串较有效的办法是,你的代码可以这样来写:当然,即使这样做了,后续对文本操作(如整数到文本转换)仍然是一件费时费力的或,原因是JAVA中,String 是只读的,任何String的内容操作均隐含了new关键字。
作者在实际工作中只好采取了更笨笨的办法,自己实现了一个GString类来替代常用的文本操作,其原理时使用预分配的字节内存,只在需要时才转换为String对象。
Android进阶:性能优化篇2011-05-11一、图片载入过多出现OutOfMemoryError异常在使用Gallery控件时,如果载入的图片过多,过大,就很容易出现OutOfMemoryError异常,就是内存溢出。
这是因为Android默认分配的内存只有几M,而载入的图片如果是JPG之类的压缩格式,在内存中展开时会占用大量的空间,也就容易内存溢出。
这时可以用下面的方法解决:二、统一管理位图资源,适时释放资源三、网络连接往往是耗电量比较大的。
我们可以优化一下在需要网络连接的程序中,首先检查网络连接是否正常,如果没有网络连接,那么就不需要执行相应的程序。
检查网络连接的方法如下:四、网络间的数据传输也是非常耗费资源的,这包括传输方式和解析方式。
看下面的表格:其中Tree Parser是DOM方式解析,Event/Stream是SAX方式解析。
很明显,使用流的方式解析效率要高一些,因为DOM解析是在对整个文档读取完后,再根据节点层次等在内存中进行组织。
而流的方式是边读取数据边解析,数据读取完后,解析也就完毕了。
在数据格式方面,JSON和Protobuf效率明显比XML好很多,XML和JSON大家都很熟悉。
从上面的图中我们可以得出结论就是尽量使用SAX等边读取边解析的方式来解析数据,针对移动设备,最好能使用JSON之类的轻量级数据格式为佳。
五、传输数据经过压缩。
目前大部门网站都支持GZIP压缩,所以在进行大数据量下载时,尽量使用GZIP方式下载,可以减少网络流量。
使用方法如下所示:六、有效管理Service后台服务就相当于一个持续运行的Acitivity。
如果开发的程序后台都会一个service不停的去服务器上更新数据,在不更新数据的时候就让它sleep,这种方式是非常耗电的,通常情况下,我们可以使用AlarmManager来定时启动服务。
如下所示,第30分钟执行一次。
开发过程中应该注意一些细节,并经手机的整体性能和续航都是有很大的局限,很多个优化的细节会对软件产生本质的影响,这些需要引起重视,也要在开发过程中不断积累。
Android内存泄漏调试I2010-07-25一、概述Java编程中经常容易被忽视,但本身又十分重要的一个问题就是内存使用的问题。
Android应用主要使用Java 语言编写,因此这个问题也同样会在Android开发中出现。
本文不对Java编程问题做探讨,而是对于在Android 中,特别是应用开发中的此类问题进行整理。
由于作者接触Android时间并不是很长,因此如有叙述不当之处,欢迎指正。
二、Android(Java)中常见的容易引起内存泄漏的不良代码Android主要应用在嵌入式设备当中,而嵌入式设备由于一些众所周知的条件限制,通常都不会有很高的配置,特别是内存很有限。
如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机。
为了能够使得Android应用程序安全且快速的运行,Android的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出来的,也就是说每个应用程序都是在属于自己的进程中运行的。
一方面,如果程序在运行过程中出现了内存泄漏的问题,仅仅会使得自己的进程被kill掉,而不会影响其他进程(如果是system_process等系统进程出问题的话,则会引起系统重启)。
另一方面,Android 为不同类型的进程分配了不同的内存使用上限,如果应用进程使用的内存超过了这个上限,则会被系统视为内存泄漏,从而被kill掉。
Android为应用进程分配的内存上限如下所示:位置:/ANDROID_SOURCE/system/core/rootdir/init.rc部分脚本正因为我们的应用程序能够使用的内存有限,所以在编写代码的时候需要特别注意内存使用问题。
如下是一些常见的内存使用不当的情况。
(一)查询数据库没有关闭游标描述:程序中经常会进行查询数据库的操作,但是经常会有使用完Cursor后没有关闭的情况。
如果我们查询的结果集比较小,对内存的消耗则不容易被发现,只有在长时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。
示例代码:修正示例代码:描述:以构造ListView的BaseAdapter为例,在BaseAdapter中提高了方法:来向ListView提供每一个item所需要的view对象。
初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的view对象,同时ListView会将这些view对象缓存起来。
当向下滚动ListView时,原先位于最上面的list item的view对象会被回收,然后被用来构造新出现的最下面的list item。
这个构造过程就是由getView()方法完成的,getView()的第二个形参View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。
由此可以看出,如果我们不去使用convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。
ListView回收list item的view对象的过程可以查看:示例代码:修正示例代码:描述:有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存,当它不在被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。
可以看一下代码中的注释:描述:这种情况描述起来比较麻烦,举两个例子进行说明。
示例A:假设有如下操作我们有一个成员变量obj,在operation()中我们希望能够将处理obj实例的操作post到某个线程的MessageQueue中。
在以上的代码中,即便是mHandler所在的线程使用完了obj所引用的对象,但这个对象仍然不会被垃圾回收掉,因为DemoActivity.obj还保有这个对象的引用。
所以如果在DemoActivity中不再使用这个对象了,可以在[Mark]的位置释放对象的引用,而代码可以修改为:示例B:假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如信号强度等),则可以在LockScreen中定义一个PhoneStateListener的对象,同时将它注册到TelephonyManager服务中。
对于LockScreen对象,当需要显示锁屏界面的时候就会创建一个LockScreen对象,而当锁屏界面消失的时候LockScreen对象就会被释放掉。
但是如果在释放LockScreen对象的时候忘记取消我们之前注册的PhoneStateListener对象,则会导致LockScreen无法被垃圾回收。
如果不断的使锁屏界面显示和消失,则最终会由于大量的LockScreen对象没有办法被回收而引起OutOfMemory,使得system_process进程挂掉。
总之当一个生命周期较短的对象A,被一个生命周期较长的对象B保有其引用的情况下,在A的生命周期结束时,要在B中清除掉对A的引用。
(五) 其他Android应用程序中最典型的需要注意释放资源的情况是在Activity的生命周期中,在onPause()、onStop()、onDestroy()方法中需要适当的释放资源的情况。
由于此情况很基础,在此不详细说明,具体可以查看官方文档对Activity生命周期的介绍,以明确何时应该释放哪些资源。
Android内存泄漏调试II紧接《Android内存泄漏调试I》。
三、内存监测工具DDMS --> Heap无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方。
Android tools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使用eclipse的ADT插件,并以真机为例,在模拟器中的情况类似)。
用Heap监测应用进程使用内存情况的步骤如下:1. 启动eclipse后,切换到DDMS透视图,并确认Devices视图、Heap视图都是打开的;2. 将手机通过USB链接至电脑,链接时需要确认手机是处于“USB调试”模式,而不是作为“Mass Storage”;3. 链接成功后,在DDMS的Devices视图中将会显示手机设备的序列号,以及设备中正在运行的部分进程信息;4. 点击选中想要监测的进程,比如system_process进程;5. 点击选中Devices视图界面中最上方一排图标中的“Update Heap”图标;6. 点击Heap视图中的“Cause GC”按钮;7. 此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况[如图所示]。
说明:a) 点击“Cause GC”按钮相当于向虚拟机请求了一次gc操作;b) 当内存使用信息第一次显示以后,无须再不断的点击“Cause GC”,Heap视图界面会定时刷新,在对应用的不断的操作过程中就可以看到内存使用的变化;c) 内存使用信息的各项参数根据名称即可知道其意思,在此不再赘述。