搜档网
当前位置:搜档网 › android内存泄露测试方法

android内存泄露测试方法

android内存泄露测试方法
android内存泄露测试方法

1内存泄露

内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

2预置条件

1)使用专用user版本,获取root权限(可在网上下载可获得root权限工具如root大师),获取root权限后所做操作不会影响测试结果。

2)测试前卸载所有非内置的应用,注意在获取root权限后会生成一个授权管理应用不能被卸载。

3内存泄露的检测步骤:

1)对应用进行压力测试。(非系统进程采用monkeyrunner测试,系统进程采用monkey测试)

2)进行压力测试时同时使用自动化工具获得进程的内存数据。

3)压力测试结束后通过命令获取hprof文件。

4)对获取的内存数据进行处理,绘制进程的Uss曲线图。

5)通过曲线图判断是否存在内存泄露。

6)当曲线显示有内存泄露,分析hprof文件,进一步分析是否存在内存泄露。7)通过分析hprof文件确定存在内存泄露之后,定位内存泄露。

8)解决内存泄漏后,再次复测,直至不再出现内存泄露的情况。

流程图如下图所示:

注意:

测试结束后,将获得两个文件,一个是hprof文件,另一个是通过工具获取内存数据procrank.txt文件。

获取的内存数据有四组,分别是:VSS,RSS,PSS,USS,其中Uss真正表示一个进程运行时正在占有内存大小,处理数据时只对Uss数据进行处理。

hprof文件主要供开发人员准确定位内存泄露。MAT工具是通过分析hprof文件来快速定位内存泄露可疑代码的工具。

4压力测试

1.使用monkeyrunner测试非系统进程

测试方法为:monkeyrunner 测试脚本

测试开始前,首先安装获取内存数据AutoProcrankActivity.apk,开始获内存数据后开始执行脚本。使用AutoProcrankActivity获取的内存数据文件在sdcard的根目录下,文件名为procrank.txt。

2.使用monkey测试系统进程

Monkey测试前设置:

1)电脑装上获取内存数据文件的工具memorycheck,打开.

2)先使用命令将状态栏为禁止状态:

设置成功后重启手机,重启后才设置成功。

3)将设置以及授权管理加入黑名单,防止在monkey测试过程中进入设置将adb断开以及在授权管理中将root权限断开,设置方法如下:创建一

个名称为blacklist的txt文档,在文件中输入应用程序的包名,设置和

授权管理,则在文件中输入:

com.android.settingscom.mgyun.shua.su(不同包名使用回车键分开),再将blacklist.txt的文件放到手机的SD卡根目录下。

设置完成后,输入指令:adb shell monkey --throttle 500 --ignore

-timeouts --ignore-crashes --ignore-security-exceptions

--monitor-native-crashes --pkg-blacklist-file /sdcard/blacklist.txt -v -v -v 20000

注意:monkey测试次数视具体情况设,这里先设置为40000次。

Monkey开始后,立即启动memorycheck获取内存数据,生的procrank.txt 文件在E:/目录下。

5内存数据文件的处理

1.获取procrank.txt内存数据文件之后,将数据导入excel表格(图1),将

所测试的应用的数据(根据包命来筛选)筛选出来(图2),复制Uss一栏的数据另外一张表格,绘制曲线图(图3)。

图1

图2

图3

注意:在生成曲线图时,先要删除掉内存的单位K后再生成。

6内存泄露的初步判定

如若Uss曲线图一直呈稳定上升趋势,可初步判断为内存泄露(仍需要进一步分析hprof文件才能最后最终确定)如图所示;

非系统进程:信息的USS曲线图

系统进程launcher的USS曲线图

7获得hprof文件

1)测试结束后先生成hprof文件

压力测试结束后通过上图所示的命令生成设置的hprof文件,其中kill -10 18048(这里18048这里是设置进程的进程编号,生成的是设置的hprof,通过命令adb shell ps 查询所测试的应用进程编号)。

2)取出hprof文件

在手机安装RE管理器(安装好RE管理器后,首先在授权管理中允许root权限),进入目录/data/misc下能查看到之前生成的hprof文件,将文件复制到sdcard,再从sdcard中将文件拷出。

注意:此时获取的hprof文件暂时还不能被MAT工具识别,这里需要进行转换:

将图库的hprof文件转换后放置e盘中。

3)经过转换后的hprof文件通过MAT工具打开

工具分析出存在泄露的可疑点,研发人员根据上述信息最终定位泄露点。

7测试过程中注意事项

1)确保测试过程中手机不会关机

2)测试过程中,如果应用终止,将内存数据结果清除后重新再测。因为应用终

止后会重新开启另外一个进程,上一个进程的hprof文件已经无法获得。

3)压力测试的时间建议在2个小时左右,此时Uss曲线图已经可以比较明确表

示的内存情况了。

4)压力测试结束后,退出应用,不作任何操作让手机静置10分钟左右(获取

内存数据的工具暂不停止),目的是观察当应用恢复到初始状态时内存是否也恢复到原来的状态。

5)如若曲线略有上升趋势,但趋势并不明显,再复测后再确定是否存在问题。

6)使用excel处理数据时,注意某一应用的进程编号是否全部一致,不一致则

说明测试过程中进程终止过,随后开启了另一个进程,此时数据无效,需要重新测试。

android避免内存泄露

1、数据库的cursor没有关闭 2、构造adapter没有使用缓存contentview 衍生的listview优化问题:减少创建View的对象,充分使用contentview,可以使用静态类来处理优化getView的过程 3、Bitmap对象不使用时采用recycle()释放内存 4、Activity中的对象生命周期大于Activity 调式方法:DDMS->HEAPSIZE->adtaobject->total size Android应用程序被限制在16MB的堆上运行,至少在T-Mobile G1上是这样。对于手机来说,这是很大的内存了;但对于一些开发人员来说,这算是较小的了。即使你不打算使用掉所有的内存,但是,你也应该尽可能少地使用内存,来确保其它应用程序得以运行。Android在内存中保留更多的应用程序,对于用户来说,程序间切换就能更快。作为我(英文作者)工作的一部分,我调查了Android应用程序的内存泄露问题,并发现这些内存泄露大多数都是由于相同的错误导致的,即:对Context拥有较长时间的引用。 在Android上,Context常用于许多操作,更多的时候是加载和访问资源。这就是为什么所有的Widget在它们的构造函数里接受一个Context的参数。在一个正常的Android应用程序里,你会看到两种Context类型,Activity和Application。而一般在需要一个Context的类和方法里,往往传入的是第一种: Java代码 @Override protected void onCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); label.setText("Leaks are bad");

Android期末测试题(附带答案)

一、选择题 1、下列哪项不是Android四大组件( C ) A.Seivice B. Activity C. Handler D. Content Provider 2、Android是如何组织Activity的( B ) A.以堆的方式组织Activity B. 以栈的方式组织Activity C. 以树形方式组织Activity D. 以链式方式组织Activity 3、关于线程说法不正确的是( B ) A. 在 android 中,我们可以在主线程中,创建一个新的线程 B. 在创建的新线程中,它可以操作 UI 组件 C. 新线程可以和 Handler 共同使用 D. 创建的 Handler 对象,它隶属于创建它的线程 4、下列关于内存回收的说明,哪个是正确的(B ) A.程序员必须创建一个线程来释放内存 B.内存回收程序负责释放无用内存 C.内存回收程序允许程序员直接释放内存 D.内存回收程序可以在指定的时间释放内存对象 5、设置xml布局文件中的字体大小一般用什么单位( c ) A.dp B. px C. sp D. pt 6、关于service生命周期的onCreate()和onStart()说法正确的是( D ) A.当第一次启动的时候先后调用onCreate()和onStart()方法 B.当第一次启动的时候只会调用onCreate()方法 C.如果service已经启动,将先后调用onCreate()和onStart()方法 D.如果service已经启动,只会执行onStart()方法,不再执行onCreate()方法 7、Android项目工程下面的assets目录,以下说法正确的是( A ) A.这里的文件是原封不动的存储到设备上不会转换为二进制的格式 B.主要放置多媒体等数据文件 C.主要放置图片文件 D.放置字符串,颜色,数组等常量数据 8、在android中使用SQLiteOpenHelper这个辅助类,生成一个可操作的数据库,调用的方法是( A )A.getReadableDatabase() B.getDatabase() C.getEnbleDatabase() D.createDateBase() 9、Activity从可见状态变为半透明遮盖状态时,生命周期中哪个方法被调用( B )

Android开发规范参考文档

Android开发参考文档 一、Android编码规范 1. java代码中不出现中文,最多注释中可以出现中文.xml代码中注释 2. 成员变量,局部变量、静态成员变量命名、常量(宏)命名 1). 成员变量: activity中的成员变量以m开头,后面的单词首字母大写(如Button mBackButton; String mName);实体类和自定义View的成员变量可以不以m开头(如ImageView imageView,String name), 2). 局部变量命名:只能包含字母,组合变量单词首字母出第一个外,都为大写,其他字母都为小写 3). 常量(宏)命名: 只能包含字母和_,字母全部大写,单词之间用_隔开UMENG_APP_KEY 3. Application命名 项目名称+App,如SlimApp,里面可以存放全局变量,但是杜绝存放过大的实体对象4. activity和其中的view变量命名 activity命名模式为:逻辑名称+Activity view命名模式为:逻辑名称+View 建议:如果layout文件很复杂,建议将layout分成多个模块,每个模块定义一个moduleViewHolder,其成员变量包含所属view 5. layout及其id命名规则 layout命名模式:activity_逻辑名称,或者把对应的activity的名字用“_”把单词分开。

命名模式为:view缩写_模块名称_view的逻辑名称, 用单词首字母进行缩写 view的缩写详情如下 LayoutView:lv RelativeView:rv TextView:tv ImageView:iv ImageButton:ib Button:btn 6. strings.xml中的 1). id命名模式: activity名称_功能模块名称_逻辑名称/activity名称_逻辑名称/common_逻辑名称,strings.xml中,使用activity名称注释,将文件内容区分开来 2). strings.xml中使用%1$s实现字符串的通配,合起来写 7. drawable中的图片命名 命名模式:activity名称_逻辑名称/common_逻辑名称/ic_逻辑名称 (逻辑名称: 这是一个什么样的图片,展示功能是什么) 8. styles.xml 将layout中不断重现的style提炼出通用的style通用组件,放到styles.xml中; 9. 使用layer-list和selector,主要是View onCclick onTouch等事件界面反映

(完整版)Android应用开发期末考试题

试题 一、选择题 1 android虚拟设备的缩写是(AVD) 2 Android SDK目前支持的操作系统(DOS) 3 Android开发工具插件(ADT)没有提供的开发功能(自动更新) 4Android SDK提供一些开发工具可以把应用软件打包成Android格式文件(APK) 5 Android当中基本的所有的UI都是由(view)或者其子类实现的 6以下不是Android中调试项目的正确步骤(测试用例) 7下列不是Activity的生命周期方法之一的是(OnResume) 8以下可以做EditText编辑框的提示信息是(adroid:hint) 9以下不是Activity启动的方法是(gotoActivity) 10以下不是手机操作系统的是(windows vista) 二、填空题 1 Android平台由操作系统,中间件,用户界面和应用软件组成的。 2 Android平台提供了2D,3D的图形支持,数据库支持SQLite,并且集成了浏览器 3目前已知的可以用来搭建Android开发环境的系统有windows,Linux,Mac 等4开发中推荐使用的IDE开发组合为IDE,eclipse,ADI来开发 5 Android SDK主要以java语言为基础 6创建工程时需要填写的信息名称有工程名,包的名字,Activity的名字还有应用的名字

7 Android.jar是一个标准的压缩包,其内容包含的是编译后的class,包含了全部的API 三、简答题 1 Android SDK中API的包结构的划分?至少五个 android.util,android.os,android.content,android.view,android.graphics,android.text 2 Android软件框架结构自上而下可分为哪些层? 应用程序(Application)、应用程序框架(Application Framework)、各种库(Libraries)和Android运行环境(RunTime)、操作系统层(OS) 3 Android应用程序的4大组件是什么? Activity、Broadcast Intent Receiver、Service、Content Provider 4 Android应用工程文件结构有哪些? 源文件(包含Activity),R.java文件,Android Library,assets目录res目录,drawble目录,layout目录,values目录,AndroidManifest.xml 5 Android开发应用程序最有可能使用到的应用框架部分是哪些? 一组View(UI)组件,Content Providers,Resource Manger,Notification Manger,Activiy Manger 6 Android底层库包含哪些? 系统C库,媒体库,Surface Manager,LibWebCore,SGL 四、编程 1实现点击一个按钮,结束当前Activity并将需要返回的数据放置并关闭当前窗体请编写核心代码 Bundle bundle = new Bundle ( ); Bundle.putString(“store”,”数据来自Activity1”) ;

Android开发内存泄漏及检查工具使用培训资料

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)之上,而且一旦丢失只能通过重启来恢复。

Android的原理:关于应用自启动,占内存那些问题

Android的原理-不需要太多的剩余内存 Android用RAM的方式,跟windows、WM、Sybiam是两回事。在Android里,RAM被用满了是件好事。它意味着你可以快速打开之前打开的软件,回到之前的位置。所以Android 很有效的使用RAM,很多用户看到他们的RAM满了,就认为拖慢了他们的手机。而实际上,退出后重启这些程序才真正拖慢了手机的响应。而且这些自动杀进程的软件本身是个时刻活跃的进程,它始终在后台保持活跃使得CPU难以消停,反而增加了耗电量。 不用在意剩余内存的大小.其实很多人都是把使用其他系统的习惯带过来来了.安卓Android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系.如果你知道java,就能更清楚这机制了.其实和java的垃圾回收机制类似,系统有一个规则来回收内存.进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西.当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊.但事实上他并不影响速度.相反加快了下次启动应用的速度.这本来就是安卓Android标榜的优势之一,如果人为去关闭进程,没有太大必要.特别是自动关进程的软件. 到这里有人会说了,那为什么内存少的时候运行大型程序会慢呢?其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候.这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统.所以,论坛上有个更改内存阀值的程序可以有一定改善. 但改动也可能带来一些问题,取决于值的设定. 那么,进程管理软件有无必要呢?有的.就是在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显著的提高运行速度.但一些小程序,完全可交由系统自己管理.谈到这里,可能有的朋友会问,如果不关程序是不是会更耗电.我就说说安卓Android后台的原理,你就明白了.安卓Android 的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态.所以为什么有的程序切出去重进会到主界面.但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务.服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了.这个在进程管理软件里能看到,标签是service.所以没有带服务的应用在后台是完全不耗电的,没有必要关闭.这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个安卓Android的优点呢? 还有一个.为什么安卓Android一个应用看起来那么耗内存.大家知道,安卓Android上的应用是java,当然需要虚拟机,而安卓Android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机.这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存. 以上这些设计确保了安卓Android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现.大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,很没必要.

Android 应用程序内存泄漏的分析

Android 应用程序内存泄漏的分析以前在学校里学习Java的时候,总是看到说,java是由垃圾收集器(GC)来管理内存回收的,所以当时形成的观念是Java不会产生内存泄漏,我们可以只管去申请内存,不需要关注内存回收,GC会帮我们完成。呵呵,很幼稚的想法,GC没那么聪明啊,理论及事实证明,我们的Java程序也是会有内存泄漏的。 (一)Java内存泄漏从何而来 一般来说内存泄漏有两种情况。一种情况如在C/C++语言中的,在堆中的分配的内存,没有将其释放,或者是在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。 (二)需要的工具 1.DDMS—Update heap Gause GC Heap 是DDMS自带的一个很不错的内存监控工具,下图红色框中最左边的图标就是该 工具的启动按钮,它能在Heap视图中显示选中进程的当前内存使用的详细情况。下图 框中最右边的是GC工具,很多时候我们使用Heap监控内存的时候要借助GC工具,点 击一次GC按钮就相当于向VM请求了一次GC操作。中间的按钮是Dump HPROF file,它 的功能相当于给内存拍一张照,然后将这些内存信息保存到hprof文件里面,在使用我 们的第二个工具MAT的时候会使用到这个功能。 2.MAT(Memory Analyzer Tool) Heap工具能给我们一个感性的认识,告诉我们程序当前的内存使用情况和是否存在内存 泄漏的肯能性。但是,如果我们想更详细,更深入的了解内存消耗的情况,找到问题所 在,那么我们还需要一个工具,就是MAT。这个工具是需要我们自己去下载的,可以下 载独立的MAT RCP 客户端,也可以以插件的形式安装到Eclipse里面,方便起见,推荐 后者。 安装方法: A.登录官网https://www.sodocs.net/doc/2b13677888.html,/mat/downloads.php B.下载MAT Eclipse插件安装包(红框所示,当然你也可是选择Update Site在线安装,个人觉得比较慢)

《Android程序设计》期末试题B

一、判断题(每小题2分,共10分) 1、Android是J2ME的一个实现。() 2、View是ViewGroup的子类。() 3、一个Intent可以包含多个category。() 4、Android系统下的文件,可以被本系统里的所有应用程序访问。() 5、无论Service是以启动方式还是绑定方式运行,该Service类都要重写onBind 方法。() 二、单项选择题(在每小题的四个备选答案中,有且只有一个正确答案,请将正确答案的序号填在题干的括号内。每小题2分,共20分) 1、下列关于继承的哪项叙述是正确的?() A、在Java中类允许多重继承 B、在Java中一个类只能实现一个接口 C、在Java中一个类不能同时继承一个类和实现一个接口 D、在Java中接口允许继承自另一个接口 2、以下哪种方式不能退出当前活动状态的Activity?() A、调用finish()方法 B、单击(返回)按钮 C、单击(回到桌面)按钮 D、Activity运行时出现异常 3、对于TextView,使用哪个属性来设置显示的文本?() A、android:textSize B、android:text C、android:textColor D、android:string 4、要处理Button的点击事件,需要注册哪个监听器?() A、OnClickListener() B、OnButtonClickListener() C、OnButtonListener() D、OnItemClickListener() 5、浏览网页使用的Intent的Action是什么?() A、ACTION_CALL B、ACTION_EDIT C、ACTION_SEND D、ACTION_VIEW 6、Android 关于启动方式的service生命周期的onCreate()和onStartCommand()方法,说法正确的是()

android内存管理-MAT与防范手段

内存管理与防范手段 目录 内存管理与防范手段 (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操作;

Android内存检测

Android 内存检测 1. Introduction Android对内存的使用包括内存泄漏和内存越界,内存泄漏会导致系统内存减少,最终分配不到内存,这样大的程序就不能运行,甚至系统没有内存而崩溃。Android中kernel和应用程序都可能会有内存泄漏和越界。对于Java代码,在越界的时候虚拟机会加以检查并抛出异常。而对于C/C++代码,越界的时候就悄无声息地让程序出错或crash 2. 内核中的内存泄漏检测 内核中已经内嵌了内存泄漏的代码,编译的时候需要打开配置 代码及帮助位置: 其中kmemcheck是检测内存越界等错误的,目前只支持X86 kernel/Documentation/kmemleak.txt kernel/Documentation/kmemcheck.txt kernel/mm/kmemleak.c kernel/mm/kmemcheck.c 内核配置 CONFIG_DEBUG_KMEMLEAK=y CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=1000 其中CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE的大小跟board的kernel porting相关, 有的不需要定义,有的需要定义大一点,可以在kmemleak.c中模块初始化代码中调试. kmemleak模块初始化成功后,会产生/sys/kernel/debug/kmemleak这个文件 操作命令如下: #su #echo scan > /sys/kernel/debug/kmemleak扫描泄漏 #cat /sys/kernel/debug/kmemleak 查看泄漏 #echo clear > /sys/kernel/debug/kmemleak清除结果 当出现泄漏后,会有提示,比如 unreferenced object 0xd25f3cc0 (size 64): comm "Binder_5", pid 1257, jiffies 68676 (age 3105.280s) hex dump (first 32 bytes): 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace: [] create_object+0x12c/0x248 [] kmemleak_alloc+0x88/0xcc [] kmem_cache_alloc_trace+0x13c/0x1f4 [] ion_carveout_heap_map_dma+0x34/0xcc [] ion_alloc+0x170/0x3f0

android期末考大题(沈阳师范大学)

1.SQLite数据库 public class MySqliteDB extends SQLiteOpenHelper { public MySqliteDB(Context context, String name, CursorFactory factory,int version) { super(context, name, factory, version);} public void onCreate(SQLiteDatabase db) { db.execSQL("create table if not exists people ("+"pid integer primary key,"+ "pname text,"+"page integer)");} public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}} public class MainActivity extends Activity { Button btn;MySqliteDB mydb; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.sodocs.net/doc/2b13677888.html,yout.activity_main); mydb=new MySqliteDB(this, "MyDB", null, 1); btn=(Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { SQLiteDatabase db=mydb.getReadableDatabase();}});} public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true;}} 2.添加ToggleButton public class Example_55 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(https://www.sodocs.net/doc/2b13677888.html,yout.main); ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton); toggleButton.setChecked(true); 3.Spinner下拉列表框

android系统信息(内存、cpu、sd卡、电量、版本)获取

要转载请注明出处:https://www.sodocs.net/doc/2b13677888.html,/blog/1066113,有很多转载了文章不写出处,还写的是什么小编最近做项目碰到什么问题怎么解决的的然后把文章贴下面,俨然一副他们自己的文章,不知羞耻! 一、内存(ram): android的总内存大小信息存放在系统的/proc/meminfo文件里面,可以通过读取这个文件来获取这些信息: Java代码 1public void getTotalMemory(){ 2String str1="/proc/meminfo"; 3String str2=""; 4try{ 5FileReader fr=new FileReader(str1); 6BufferedReader localBufferedReader=new BufferedReader(fr,8192); 7while((str2= localBufferedReader.readLine())!=null){ 8Log.i(TAG,"---"+str2); 9} 10}catch(IOException e){ 11} 12}

运行信息如下: Java代码 1305-3008:05:14.807:INFO/-SystemInfo-(1519): ---MemTotal:204876kB 1405-3008:05:14.807:INFO/-SystemInfo-(1519):---MemFree: 4596kB 1505-3008:05:14.807:INFO/-SystemInfo-(1519):---Buffers: 16020kB 1605-3008:05:14.807:INFO/-SystemInfo-(1519):---Cached: 82508kB 1705-3008:05:14.807:INFO/-SystemInfo-(1519): ---SwapCached:64kB 1805-3008:05:14.807:INFO/-SystemInfo-(1519):---Active: 137104kB 1905-3008:05:14.807:INFO/-SystemInfo-(1519): ---Inactive:41056kB 2005-3008:05:14.807:INFO/-SystemInfo-(1519): ---SwapTotal:65528kB 2105-3008:05:14.817:INFO/-SystemInfo-(1519): ---SwapFree:65368kB

Android App内存泄露测试方法总结

Android App内存泄露测试方法总结 1、内存泄露 Android系统为每一个运行的程序都指定了一个最大运行内存,超过这个值则会触发OOM机制,反应在界面就是闪退、Crash现象,导致OOM发生的原因比如内存泄露或者是代码不考虑后果使用大量的资源,都有可能导致OOM出现的。OOM的临界值可以通过adb shell getprop | findstr “heap”查看到: 2、Android的GC机制 Android GC机制沿用了java的GC机制,当需要新内存去分配对象的时候而剩余不够的时候,会触发GC,把无用的对象回收掉,其中一个重要的算法便是分代式算法,这个算法把虚拟机分为年轻代、老年代和持久代,对象先分配到年轻代,然后GC多次后还存活的将会移动到老年代,老年代就不会频繁触发GC机制,一般触发频繁的都是年轻代的对象。 3、为什么会内存泄露 上面我们知道了GC机制,那么如果GC过后程序还是没有内存,那么会发生OOM,导致GC后还是没有足够内存分配新对象的主要原因就是内存泄露了。首先要知道内存泄露也就是GC不掉的根源是生命周期长的对象持有生命周期短的对象,导致无用的对象一直无法回收。以下是几个典型的分类: 1)**静态类相关的泄露:**static对象的生命周期伴随着整个程序的生命周期,所以这块要注意不要把一些对象引用添加到static对象里面去,会造成与之关联的对象无法回收。

2)各种资源的释放:包括cursor的关闭,IO流的关闭,bitmap的回收等,进行一些带有缓存的资源一定要关闭或者释放。 3)Handler的泄露:调用handler的delay的时候,会被认为对象是有用的,导致无法回收,还有handler开启线程去下载东西没有下载完成的时候,也会因为线程导致无法回收activity;或者使用handlerThread的时候,有延迟的方法,都会导致无法回收。其主要原因在于handler是持有activity的引用,主线程不是自带一个Looper然后给handler用,导致有关联关系。 4)各种注册引用方法:比如一个常驻的后台线程处理某些时间,把当前对象注册,因为一直持有对象引用,导致这个activity一直保留,所以不用的时候需要反注册。 5)把对象缓存进容器内却忘记remove掉:有时候为了加快页面响应,结果缓存一些对象到容器内,结果越加越多,然后挂掉。 4、系统级别的内存管理 1)LMK机制和oom_adj的值 Android内核有个专用的驱动low-memory-kill,当系统级别的内存不够的时候会根据oom_adj的值以及内存分配状况去kill掉某个进程,oom_adj可以在 /proc/[pid]/oom_adj看到,并且这个值会随着进程的状态改变而改变,比如系统进程一般是-16,越大越容易被干掉。 2)5个进程的优先级 前台进程:当前运行的,基本不死; 可见进程:界面可以见到,比如被遮挡; 服务进程:进程带后台服务的,比如播放器; 后台进程:点击home键,但不退出,就是后台进程了,有比较大几率会被杀;

Android期末考试复习试卷(仅供参考)

欢迎阅读 一、选择题(20分,每小题2分) 1、下列不是手机操作系统的是( D )。 A Android B Window Mobile C Apple IPhone IOS D Windows Vista 2、下列选项哪个不是Activity 启动的方法(B ) A startActivity B goToActivity C startActivityForResult D startActivityFromChild 3、下列哪个不是Activity 的生命周期方法之一(B ) A onCreate B startActivity C onStart D onResume 4、下列哪个可做Android 数据存储(A ) A 5 6、 7、 A B C D 8、关于 A B C D 9、 10 二、填空题(10 分,共10 题,每空1 分) 1、为了使android 适应不同分辨率机型,布局时字体单位应用( sp ),像素 单位应用( sp )和(dip ) 2、定义LinearLayout 水平方向布局时至少设置的三个属性:( android:orientation), (android:layout width)和(android:layout height) 3、layout 布局文件的命名不能出现字母(大写) 4、设置TextView 字体的属性是:(android:typeface )。 5、Android 四大组件是( Activity),(Service),(BroadcaseReceiver)和(ContentProvider)。

三、判断题(10 分,共10 题,每小题 1 分) 1、Intent 是android 的四大组件之一。(x ) 2、Activity 的onStop() 和onDestroy() 方法效果是差不多的。( x ) 3、Android 工程中,放在res/和assets/下的资源文件都会在R.java 文件里生成相应的编号。 ( v ) 4、res\layout\下面定义的xml 文件不可以大写。(v ) 5、在n 个元素进栈后,它们的出栈顺序和进栈顺序一定正好相反。( v ) 6、对顺序栈进行进栈、出栈操作,不涉及元素的前、后移动问题。( v ) 7、队列是一种对进队列、出队列操作的次序做了限制的线性表。(v ) 8、树中元素之间是多对多的关系。( v) 9 10 1 线性布局 2.Android 3 图片, 4 、运 error:INSTALL_FAILED_INSUFFICIENT_STORAGE。这是什么错误,遇到这种错误该怎么解决?这个错误是 因为ROM 已满造成的,不过Android123 经过多次实践,一般出现在Eclipse 往手机安装时这部分的错误,主要是因为多次 执行了运行某程序,adb 每次都需要进行安装产生了多个实例写一个文件,造成了共享违例。解决的办法就是: 1.检查手机的剩余空间。储存空间大小 2.每次执行一个安装实例 5、利用所学的知识,写出能生成50-100 之间的随机数地简要代码

安卓系统手机内存空间不足的清理方法

安卓系统手机内存空间不足的清理方法 然后很多手机都有将app安装到内存卡的功能,所以除了必须 安装在手机内存的软件之外,可以把软件都安装到sd卡中节省手机 内存。下面是jy135收集的安卓系统手机内存空间不足的清理方法,欢迎阅读。 清理大型应用程序的缓存数据 通过清理程序的缓存文件,释放的内存空间会让你喜出望外 进入手机设置选项,选择设置>应用程序 >管理应用程序 按一下Menu键,选择“按大小排序”选项(如果是Android 2.2手机先要选择已下载标签),然后就可以按照应用程序大小排列所有 手机安装的应用程序 点击一款列表中的应用程序,如果程序有缓存文件可以显示大小,直接点击“清除缓存”选项就可以释放这些缓存文件占据的空间有一些应用程序的缓存文件可能多达数MB,比如Google Maps,Market,浏览器和相册程序,清理这几个程序的缓存文件就可以释放 相当可观的空间。 很多手机厂商都在旗下手机预装了自己开发的UI程序,比如HTC Sense,MOTOBLUR等,如果你打算使用LaunherPro或者ADW这样的launcher程序替代HTC Sense,你可以清理甚至删除HTC Sense 的数据文件,这个操作可以让你的手机多出几十MB空间。 另外Android Market还提供一些自动清除缓存文件的应用程序,比如Quick App Clean Cache这款收费软件。对于已经取得root权

限的手机用户,可以从Market下载 CacheCleaner, CacheMate和MoveCache这些程序来快速方便的清除程序缓存文件。 删除那些你从来不用或者很少使用的应用程序 这是很多用户都会面对的问题,默默忍受着手机内存不足的报警,甚至牺牲系统性能,就是舍不得删除那些从来不用或者极少使用的应用程序,这可能也是一种强迫症。删除这些程序你会发现手机从此海阔天空,而且你没有任何损失。 移动所以可以移动的应用程序数据到SD卡 运行Android 2.2系统的手机支持安装应用程序到SD卡,确保检查所有你安装的应用程序如果支持apps to SD卡功能一定要移动到SD卡,对于一些大型软件特别是游戏程序节省的容量相当可观。不过一定要注意Widgets程序,捆绑Widgets的程序,以及动态壁纸程序和那些需要在后台运行并且和系统进行交互的应用程序不要移 动到SD卡存储,否则程序可能无法正常工作。 如果觉得每个程序单独设置太麻烦,可以借助Apps 2 SD和SDMove这样的程序简化操作过程。对于那些动手能力比较强的用户可以通过网上的教程设置应用程序默认安装到SD卡,这样就可以一劳永逸。 如果我们感觉到我们的手机由于内存过多,影响到我们手机的正常使用,可以进入到手机的相关设置中,找到通用按钮点击进入。 2 进入到手机的通用界面中后,我们可以看到手机中的相关系统空间状况,点击查看相应的手机存储详情。

相关主题