android内存管理-MAT与防范手段
内存分析工具MAT的使用
内存分析工具MAT的使用
MAT(Memory Analyzer Tool)是一个开源的Java内存分析工具,可
以帮助开发人员分析和优化Java应用程序的内存使用情况。在开发和调
试过程中,MAT可以帮助我们找到内存泄漏、大对象、重复对象以及内存
使用高的地方,从而提高应用程序的性能和稳定性。
以下是使用MAT进行内存分析的一般步骤:
2. 创建内存快照:在使用MAT进行内存分析之前,我们需要创建
Java应用程序的内存快照。可以通过以下几种方式创建内存快照:- 在Eclipse中启动的Java应用程序中,可以使用"Eclipse Memory Analyzer"菜单中的"Dump HPROF File"选项来创建内存快照。
- 在Java命令行应用程序中,可以通过添加JVM参数"-
XX:+HeapDumpOnOutOfMemoryError"来在内存溢出错误发生时自动创建内
存快照。
- 对于正在运行的Java进程,可以使用jmap命令手动创建内存快照。
3. 打开内存快照:启动MAT后,可以通过"File"菜单中的"Open Heap Dump"选项打开已经创建的内存快照。MAT支持打开多种格式的内存
快照文件,包括HPROF、IBM PHD、Eclipse MAT等。
4. 分析内存使用情况:在打开内存快照后,MAT会对内存进行解析
和分析,并显示内存使用的概览信息。在"Overview"选项卡中,我们可以
查看内存占用的总大小、对象数量和最常见的对象类型。
5. 查找内存泄露:MAT提供了多种工具和视图,可以帮助我们找到
内存技术使用中的风险与应对策略(一)
内存技术使用中的风险与应对策略
在当今数字化时代,内存技术的使用已经渗透到了我们生活的方
方面面。无论是在个人电脑上,还是在智能手机、平板电脑和各种智
能设备上,内存技术都扮演着重要的角色。然而,尽管内存技术带来
了便利和效率的提升,但同时也存在一些潜在的风险。本文将对内存
技术使用中的风险进行探讨,并提出相应的应对策略。
一、数据丢失风险
无论是在个人使用还是在企业环境中,数据丢失都是一种常见的
风险。内存技术由于其易受电力中断、病毒攻击或数据损坏等因素影响,可能导致数据丢失。为了应对这种风险,我们可以采取以下策略:
1. 定期备份数据:及时备份重要数据是防止数据丢失的最基本措施。可以选择使用云存储服务或外部硬盘进行定期备份,以确保数据
的安全性和可靠性。
2. 使用可靠的内存设备:选择品牌可信、质量可靠的内存设备,能够减少因设备本身导致的数据丢失的风险。在购买内存设备时,可
以进行详细的比较和调查,选择经过认证的供应商和产品。
3. 定期检查和更新软件:更新操作系统和相关软件补丁,能够帮助解决存在安全漏洞的问题,减少病毒感染和数据损坏的风险。
二、数据泄露风险
随着互联网的普及和数据交换的频繁进行,数据泄露风险也越来
越凸显。因为内存中的数据很容易被恶意程序或黑客窃取,所以必须
采取一些措施来应对这种风险。
1. 强化系统安全设置:通过设置密码、启用双重认证等措施来保护系统的安全性。此外,还可以使用安全软件和防火墙来阻止潜在的
攻击,并监测和预警可能的数据泄漏事件。
2. 加密敏感数据:对于特别重要和敏感的数据,可以使用加密技术来保护其安全性。采用强大的加密算法,能够有效防止数据被未经
(完整版)Android智能手机安全风险及防范策略
Android智能手机安全风险及防范策略
摘要
智能手机相对于传统的手机拥有更丰富的功能和更强的数据处理能力,而近年来发展迅速的Android 系统具有开,可移植性强等优点,因此,越来越多的智能手机采用Android 系统作为手机操作系统。随着Android 智能手机的普及和人们安全意识的提高,Android 智能手机的安全性也越来越受到人们的重视。手机中包含了大量的用户私密信息,并与用户的经济利益直接相关,因此如何保护Android 智能手机的信息安全,是一个非常重要的课题。
关键词:Android手机,手机安全,手机病毒,个人隐私
The Android intelligent mobile phone security risks and Countermeasures
Abstract
Compared with traditional mobile phone, smart phone has much more rich functionality and strong ability in data processing, besides, Android has been developing rapidly in recent years, it is an open source system, has strong portability advantages, therefore, more and more intelligent mobile phone use Android system as their mobile phone operating system. With the popularity of Android smart phone, and improvement of people's security consciousness, the security of Android smart phone get more and more of people’s attention. People’s mobile phone contains a large number of user’s private information, and is directly related to user’s economic interests, so how to protect the information security of Android smart phone, is a very important topic.
Android避免内存溢出(OutofMemory)方法总结
of Memory)方法总Android避免内存溢出(Out
结
避免内存溢出的方法,主要是对以下三个方面对程序进行优
化武汉Android培训
内存引用
在处理内存引用之前,我们先来复习下什么是强引用、软引用、弱引用、虚引用
强引用:强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java 虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
软引用:如果一个对象只具有软引用,但内存空间足够时,
垃圾回收器就不会回收它;直到虚拟机报告内存不够时才会回
收,只要垃圾回收器没有回收它,该对象就可以被程序使用。
软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象
被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之
关联的引用队列中。
弱引用:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间是否足够,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此
不一定会很快发现那些只具有弱引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关
联的引用队列中。
虚引用:虚引用可以理解为虚设的引用,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的
Android 性能优化之内存管理
Android 性能优化之内存管理Android 是一款广泛应用的移动操作系统,然而,由于手机硬件的
限制以及开发者在编写应用时的一些不当操作,常常导致Android应用在运行时出现内存不足的情况。因此,对于Android应用的开发者来说,合理高效地管理内存是非常重要的。本文将介绍一些Android性能优化中的内存管理技巧,帮助开发者优化应用的内存使用。
一、使用合适的数据结构
在Android开发中,选择合适的数据结构对于内存管理至关重要。
例如,当需要存储大量数据时,应使用SparseArray代替HashMap,这
样可以节省大量的内存空间。此外,考虑到内存的占用情况,应根据
实际需求选择合适的ArrayList或LinkedList等集合类。
二、避免内存泄漏
内存泄漏是Android应用中常见的问题之一。当对象在不再使用时
没有被垃圾回收器回收,就会导致内存泄漏。为了避免内存泄漏,开
发者应养成良好的编码习惯,及时释放不再使用的对象。例如,及时
取消对Context的引用,避免静态对象持有Activity的引用等。
三、使用软引用和弱引用
在Android开发中,使用软引用和弱引用可以有效地管理内存。软
引用用于缓存数据,当内存不足时,垃圾回收器会自动回收这些对象。弱引用用于存储非关键性的对象,当内存紧张时,垃圾回收器会回收
这些对象,以释放内存供其他重要对象使用。
四、优化布局文件
在Android应用中,布局文件也占用一定的内存。为了减少内存的
占用,开发者应尽量避免过度嵌套布局,并使用合适的布局控件和属性。另外,使用ConstraintLayout代替RelativeLayout也能有效地减少
android mat用法
Android MAT(Memory Analyzer Tool)是一款用于分析Android应用程序内存使用情况的工具。以下是使用Android MAT的一般步骤:
1. 下载MAT:可以从Android官方网站或其他可靠来源下载MAT。
2. 安装MAT:将MAT安装到您的计算机上,并确保您具有足够的权限来运行它。
3. 创建heap dump:在Android设备或模拟器上运行应用程序,并使用Android Profiler工具(在Android Studio中)创建一个heap dump。您可以在MAT中使用此heap dump文件。
4. 打开MAT并打开heap dump:启动MAT,并选择“File”菜单中的“Open Heap Dump”选项。然后,选择您刚刚创建的heap dump 文件。
5. 分析内存使用情况:在MAT中,您可以看到应用程序的内存使用情况,包括对象的内存使用情况、内存泄漏等。您可以使用MAT提供的各种工具和功能来分析内存使用情况,例如标记对象、查看内存泄漏等。
6. 解决问题:根据MAT的分析结果,您可以找到应用程序中的内存泄漏和其他问题,并采取适当的措施来解决它们。
请注意,以上步骤是一般性的指导,具体步骤可能会因您使用的MAT版本和具体情况而有所不同。因此,在使用MAT时,请参考官方文档或相关教程以获得更详细和准确的指导。
使用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会自动分析堆转储文件,并提供一些潜在的内存泄漏嫌疑对象。我们可以点击这些对象来查看详细信息,包括对象的引用链。
MAT的使用(一)使用方法介绍
MAT的使用(一)使用方法介绍
MAT(即Memory Analysis Toolkit)是一款内存分析工具,提供了多种功能和工具,可以帮助安全研究人员、取证人员和系统管理员对内存进行深入分析和调试。接下来将介绍MAT的使用方法。
MAT的安装
内存镜像获取
在进行内存分析之前,需要先获取目标系统的内存镜像。通常有以下几种获取内存镜像的方法:
1. 内存转储工具:可以使用第三方工具(如winpmem、LiME等)在目标系统上生成内存快照,并将其保存到文件中。这些工具通常需要在目标系统上运行,并且需要管理员权限。
2. 虚拟机快照:如果目标系统是在虚拟机中运行的,可以通过虚拟机管理软件(如VMware、VirtualBox等)创建系统快照,然后将快照文件作为内存镜像进行分析。
3. 物理设备拷贝:可以通过硬件取证设备(如Write Blocker、Logicube等)将目标系统的物理内存复制到外部存储介质(如硬盘、USB 设备等)中,然后将其用作内存镜像。
加载内存镜像
将获取到的内存镜像加载到MAT中进行分析。在MAT的主界面上,点击"File"->"Load Profile",选择要加载的内存镜像文件。MAT支持多种内存镜像格式,如Raw、LiME等,用户可以根据实际情况选择合适的格式进行加载。
内存分析
一旦内存镜像加载完成,用户就可以利用MAT提供的各种功能进行内存分析了。下面介绍几个常用的功能:
1. 进程查看:点击"Processes"选项卡,用户可以查看系统中运行的所有进程和线程的详细信息,包括进程ID、进程名、执行路径、父进程等。
mat 判断内存泄露规则 -回复
mat 判断内存泄露规则-回复
MAT(Memory Analyzer Tool)是一种Java应用程序分析工具,用于检测和分析Java应用程序的内存泄漏问题。内存泄漏是指当一个对象在不再使用时仍然被保留在内存中,从而导致内存的浪费。内存泄漏问题可能会导致应用程序的性能下降甚至崩溃。MAT通过提供一组规则来帮助开发人员检测并解决内存泄漏问题。本文将详细介绍MAT的内存泄漏规则,并一步一步回答相关问题。
第一步:了解内存泄漏规则
在MAT中,内存泄漏规则用于自动检测可能导致内存泄漏的代码模式。MAT提供了一些预定义的规则,但也支持自定义规则。以下是MAT常用的内存泄漏规则:
1. Unfinalized Object(未终结的对象):当一个对象被创建后没有被终结(即没有被垃圾回收)就被丢弃,会导致内存泄漏。
2. Collection with explict termination method(具有显式终结方法的集合):当一个集合类拥有显式的终结方法,但该方法在集合被丢弃时没有被调用,会导致内存泄漏。
3. Classloader leak(类加载器泄漏):当一个类加载器被丢弃时,其加载的类仍被引用,导致类加载器无法被垃圾回收,从而导致内存泄漏。
4. Finalizer refer to unbounded memory(终结器引用无界内存):当一个终结器(Finalizer)持有对无限内存的引用,会导致内存泄漏。
5. ThreadLocal leak(线程本地泄漏):当一个ThreadLocal变量持有对无用对象的引用,会导致无用对象无法被垃圾回收,从而导致内存泄漏。
Android开发中的内存管理及优化方法
Android开发中的内存管理及优化方法
Android操作系统随着技术的不断发展和升级,在内存管理和
优化方面也不断变化和提高。内存管理是非常重要的,它直接关
系到应用程序的性能和稳定性。本文将介绍Android开发中的内存管理及优化方法,从而让开发者在开发过程中更好地利用内存资源,提高应用程序的性能和稳定性。
一、内存管理
1. 内存类型
在Android开发中,确保正确的内存类型分配非常重要。Android平台上有两种类型的内存:Java堆和本地堆。Java堆是Java代码所使用的标准内存,包括对象和数组实例,同时还包括Java虚拟机组件和类实例。本地堆是非Java代码使用的内存,例
如本地C代码和存储映射的文件等。
2. 内存限制
Android设备的内存容量非常有限,因此在开发时必须保留很
小的内存限制。每个应用程序都有一个分配给它的最大内存大小,这是由Android操作系统动态分配控制的。在Android平台上,每
个应用程序都有256MB的堆大小限制,这个限制会根据不同设备
的配置自动调整。
3. 内存泄漏
内存泄漏是指由于未正确释放资源而导致内存不断增加,从而
导致应用程序崩溃或者出现其他问题的情况。在Android开发中,内存泄漏不可避免。为避免内存泄漏,应该使用清理资源的方法,这样可以防止不必要的内存使用。
二、内存优化
1. 优化代码
优化代码是最好的内存管理方法之一。为了更好地管理内存,
应该尽可能减少使用不必要的变量和对象。定义变量时必须确保
变量在使用时只会占用必要的内存空间。在开发Android应用程序时,最好遵循“无用代码不做”原则,以减少内存占用。
内存马原理
内存马原理
内存马是一种特殊的恶意软件,其攻击方式是将恶意代码注入到
受感染计算机的内存中,以实现对计算机的控制和操纵。与传统的病
毒不同,内存马不需要将自己保存在磁盘上,而是直接将恶意代码加
载到内存中,掩盖自己的身份,从而避免被杀毒软件检测和清除。本
文将从内存马的原理、特点和防范措施等方面进行详细介绍。
内存马的原理
内存马的攻击原理是利用计算机在运行程序时需要借助内存空间
的特点,将自己的代码注入到受感染计算机的内存区域中。当用户启
动计算机并打开某个程序时,内存中就会出现恶意代码的痕迹。这时,攻击者就可以通过内存马来获取用户的敏感信息、控制用户的计算机,或者进行其他恶意行为。
内存马的特点
内存马具有以下几点特点:
1. 难以检测
内存马可以避开杀毒软件的侦测,这是由于内存马不需要自己在受感染计算机上建立文件或者修改系统配置等操作,因此不容易被发现。杀毒软件通常是通过扫描计算机文件系统中的文件与数据库进行匹配,但是对于内存马则无能为力。
2. 难以清除
由于内存马加载到内存中,不与任何文件关联,并且没有自己的文件名,因此杀毒软件无法对其进行清除。内存马在计算机重启之前一直存在,直到重启后内存被清空,内存马才会被清除。
3. 控制范围广
内存马可以操纵整个计算机系统的内存空间,因此具有广泛的控制范围。攻击者可以利用内存马来执行各种恶意活动,例如操纵网络连接、启动其他程序、传输文件等。
4. 传播能力低
相比于传统的网络病毒,内存马传播能力较差。内存马的攻击方式主要通过利用漏洞来感染计算机,因此其传播范围受到漏洞影响较大。
手机应用开发中的性能优化与内存管理技巧
手机应用开发中的性能优化与内存管理技巧随着智能手机的普及和移动应用市场的蓬勃发展,手机应用开发成为了一个热门的领域。而在手机应用开发过程中,性能优化和内存管理是非常重要的环节。本文将介绍手机应用开发中的一些性能优化与内存管理的技巧和方法。
一、性能优化技巧
1. 布局优化
在手机应用开发中,布局是一个非常重要的部分。合理优化布局结构可以提高应用的加载速度和渲染性能。一些布局优化的方法包括:- 使用相对布局和线性布局,避免使用嵌套布局;
- 使用布局优化工具,如Hierarchy Viewer来分析布局的层次结构,找出布局中的性能瓶颈;
- 使用ConstraintLayout等高效的布局管理器;
- 使用布局缓存来避免重复计算布局。
2. 图片加载优化
图片加载是手机应用中非常常见的操作,但不合理的图片加载方式会导致应用性能下降。一些图片加载优化的方法包括:
- 使用合适的图片格式,如WebP格式可以提供更小的文件体积;
- 压缩图片,降低图片的分辨率和质量;
- 使用图片缓存,避免重复加载图片;
- 使用图片压缩库,如Glide、Picasso等,可以自动缩放和加载图片。
3. 数据加载优化
手机应用通常需要从服务器加载大量的数据,不合理的数据加载方
式会导致应用的性能下降。一些数据加载优化的方法包括:- 使用异步加载数据,避免在主线程中进行网络请求;
- 使用分页加载,只加载当前可见区域的数据;
- 使用缓存来避免重复加载数据;
- 压缩数据,减少数据的传输量。
4. 内存优化
内存是手机应用开发中需要重点考虑的一个方面。一些内存优化的
内存分析工具MAT的使用
内存分析工具MAT的使用
一、MAT插件安装
MAT(Memory Analyzer Tool) 是基于heap dumps来进行分析的,它的分析速度比jhat快,分析结果是图形界面显示,比java内置jhat的可读性更高,通过Eclipse市场安装方法/步骤1
打开Eclipse - >help - > Eclipse Marketplace
2
点击install,等待下面的进度条加载完毕后,勾选全部,点击Next
3
同意协议后,点击Finish就开始安装MAT了
直接输入URL安装方法/步骤2
1.打开Eclipse - >help - > Install New Software
2.在work with输入图中下载地址,勾选Memory Analyzer for
Eclipse IDE选项
3.若没有勾选Memory Analyzer for Eclipse IDE选项,点击地址栏
旁边的Add,在location里输入以上地址,点击OK即可。
4.安装完成后提示重启Eclipse,重启后打开window - > open
perspective,看到Memory Analysis证明安装成功。
二、MAT的使用
案例一
问题
线上某一台机器出现异常.接口调用的rt达到了万级别..基本可以判断这个机器已经挂了.进而分析该机器一直在fgc.然后马上dump内存,进而进行分析(中间一些异常的gc日志没有截图).之前学习的jvm知识都是纯理论的,这次是实打实线上出现的问题.所以记录一下.
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”窗口中查看它的引用链。通过分析引用链,您可以确定对象是否被正确地释放。
MAT相关资料
前言
在平时工作过程中,有时会遇到OutOfMemoryError,我们知道遇到Error一般表明程序存在着严重问题,可能是灾难性的。所以找出是什么原因造成OutOfMemoryError非常重要。现在向大家引荐Eclipse Memory Analyzer
tool(MAT),来化解我们遇到的难题。如未说明,本文均使用Java 5.0 on Windows XP SP3环境。
为什么用MAT
之前的观点,我认为使用实时profiling/monitoring之类的工具,用一种非常实时的方式来分析哪里存在内存泄漏是很正确的。年初使用了某profiler工具测试消息中间件中存在的内存泄漏,发现在吞吐量很高的时候profiler工具自己也无法响应,这让人很头痛。后来了解到这样的工具本身就要消耗性能,且在某些条件下还发现不了泄漏。所以,分析离线数据就非常重要了,MAT正是这样一款工具。
为何会内存溢出
我们知道JVM根据generation(代)来进行GC,根据下图所示,一共被分为young generation(年轻代)、tenured generation(老年代)、permanent generation(永久代, perm gen),perm gen(或称Non-Heap 非堆)是个异类,稍后会讲到。注意,heap空间不包括perm gen。
绝大多数的对象都在young generation被分配,也在young generation被收回,当young generation的空间被填满,GC会进行minor collection(次回收),这次回收不涉及到heap中的其他generation,minor collection根据weak generational hypothesis(弱年代假设)来假设young generation中大量的对象都是垃圾需要回收,minor collection的过程会非常快。young generation中未被回收的对象被转移到tenured generation,然而tenured generation也会被填满,最终触发major collection(主回收),这次回收针对整个heap,由于涉及到大量对象,所以比minor collection慢得多。
利用Android Studio、MAT对Android进行内存泄漏检测
利用Android Studio、MAT对Android进行内存泄漏检测
Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现
内存越用越大,可能会因为内存泄漏导致出现各种奇怪的crash,甚至可能出
现因内存不足而导致APP崩溃。
内存泄漏分析工具
Android的内存泄漏分析工具常用有Android Studio和基于eclipse的MAT (Memory Analyzer Tool)。通过两者配合,可以发挥出奇妙的效果。
Android Studio能够快速定位内存泄漏的Activity,MAT能根据已知的
Activity快速找出内存泄漏的根源。
第一步:强制GC,生成Java Heap文件
我们都知道Java有一个非常强大的垃圾回收机制,会帮我回收无引用的对象,这些无引用的对象不在我们内存泄漏分析的范畴,Android Studio有一个Android Monitors帮助我们进行强制GC,获取Java Heap文件。
强制GC:点击Initate GC(1)按钮,建议点击后等待几秒后再次点击,尝试多次,让GC更加充分。然后点击Dump Java Heap(2)按钮,然后等到一段时间,生成有点慢。
生成的Java Heap文件会在新建窗口打开。
第二步:分析内存泄漏的Activity
点击Analyzer Tasks的Perform Analysis(1)按钮,然后等待几秒十几秒不等,即可找出内存泄漏的Activity(2)。
那么我们就可以知道内存泄漏的Activity,因为这个例子比较简单,其实在(3)就已经可以看到问题所在,如果比较复杂的问题Android Studio并不够直观,不够MAT方便,如果Android Studio无法解决我们的问题,就建议使用MAT来分析,所以下一步我们就生成标准的hprof文件,通过MAT来找出泄漏的根源。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内存管理与防范手段
目录
内存管理与防范手段 (1)
一.内存分配跟踪工具DDMS–>Allocation tracker 使用 (2)
二.内存监测工具DDMS-->Heap (2)
三.内存分析工具MAT(MemoryAnalyzerTool) (3)
1.生成.hprof文件 (4)
2.使用MAT导入.hprof文件 (5)
3.使用MAT的视图工具分析内存 (5)
四.MAT使用实例 (5)
1.生成heap dump (7)
2.用MAT分析heap dumps (9)
3.使用MAT比较heap dumps (11)
五.防范不良代码 (11)
1.查询数据库没有关闭游标 (11)
2.缓存convertView (12)
3.Bitmap对象释放内存 (13)
4.释放对象的引用 (13)
5.Context的使用 (14)
6.线程 (17)
7.其他 (20)
六.优化代码 (20)
1.使用自身方法(Use Native Methods) (20)
2.使用虚拟优于使用接口 (20)
3.使用静态优于使用虚拟 (20)
4.尽可能避免使用内在的Get、Set方法 (20)
5.缓冲属性调用Cache Field Lookups (21)
6.声明Final常量 (21)
7.慎重使用增强型For循环语句 (22)
8.避免列举类型Avoid Enums (23)
9.通过内联类使用包空间 (23)
10.避免浮点类型的使用 (24)
11.一些标准操作的时间比较 (24)
12.为响应灵敏性设计 (25)
一.内存分配跟踪工具DDMS–>Allocation tracker 使用
运行DDMS,只需简单的选择应用进程并单击Allocation tracker标签,就会打开一个新的窗口,单击“Start Tracing”按钮;然后,让应用运行你想分析的代码。运行完毕后,单击“Get Allocations”按钮,一个已分配对象的列表就会出现第一个表格中。单击第一个表格中的任何一项,在表格二中就会出现导致该内存分配的栈跟踪信息。通过allocation tracker,不仅知道分配了哪类对象,还可以知道在哪个线程、哪个类、哪个文件的哪一行。
尽管在性能关键的代码路径上移除所有的内存分配操作不是必须的,甚至有时候是不可能的,但allocation tracker可以帮你识别代码中的一些重要问题。举例来说,许多应用中发现的一个普遍错误:每次进行绘制都创建一个新的Paint对象。将Paint的创建移到一个实例区域里,是一个能极大提高程序性能的简单举措。
二.内存监测工具DDMS-->Heap
无论怎么小心,想完全避免badcode是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方。Androidtools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使eclipse的ADT插件,并以真机为例,在模拟器中的情况类似)。用Heap 监测应用进程使用内存情况的步骤如下:
1.启动eclipse后,切换到DDMS透视图,并确认Devices视图、Heap视图都是打开的;
2.将手机通过USB链接至电脑,链接时需要确认手机是处于“USB调试”模式,而不是作为“MassStorage”;
3.链接成功后,在DDMS的Devices视图中将会显示手机设备的序列号,以及设备中正在运行的部分进程信息;
4.点击选中想要监测的进程,比如system_process进程;
5.点击选中Devices视图界面中最上方一排图标中的“UpdateHeap”图标;
6.点击Heap视图中的“CauseGC”按钮;
7.此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况
a)点击“CauseGC”按钮相当于向虚拟机请求了一次gc操作;
b)当内存使用信息第一次显示以后,无须再不断的点击“CauseGC”,Heap视图界面会
定时刷新,在对应用的不断的操作过程中就可以看到内存使用的变化;
c)内存使用信息的各项参数根据名称即可知道其意思,在此不再赘述。
如何才能知道我们的程序是否有内存泄漏的可能性呢。这里需要注意一个值:Heap视图
中部有一个Type叫做dataobject,即数据对象,也就是我们的程序中大量存在的类类型的对象。在dataobject一行中有一列是“TotalSize”,其值就是当前进程中所有Java数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。可以这样判断:
a)不断的操作当前应用,同时注意观察dataobject的TotalSize值;
b)正常情况下TotalSize值都会稳定在一个有限的范围内,也就是说由于程序中的的代码
良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对象,而在虚拟机不断的进行GC的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;
c)反之如果代码中存在没有释放对象引用的情况,则dataobject的TotalSize值在每次GC
后不会有明显的回落,随着操作次数的增多TotalSize的值会越来越大,直到到达一个上限后导致进程被kill掉。
d)此处已system_process进程为例,在我的测试环境中system_process进程所占用的内存
的dataobject的TotalSize正常情况下会稳定在2.2~2.8之间,而当其值超过3.55后进程就会被kill。
三.内存分析工具MAT(MemoryAnalyzerTool)
如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题
的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定会把人逼疯,特别是在维护别人写的代码的时候。这里介绍一个极好的内存分析工具MemoryAnalyzerTool(MAT)。
MAT是一个Eclipse插件,同时也有单独的RCP客户端。官方下载地址、MAT介绍和详细的使用教程请参见:/mat,在此不进行说明了。另外在MAT安装后的帮助
文档里也有完备的使用教程。在此仅举例说明其使用方法。我自己使用的是MAT的eclipse
插件,使用插件要比RCP稍微方便一些。