eclipse 检测App的内存占用和泄漏
来源:互联网 发布:mv制作软件 编辑:程序博客网 时间:2024/05/24 01:24
前段时间开发的Android应用,每次都是在运行了半个小时左右后突然挂掉了,很是莫名其妙,也不知道哪里出了问题,后来一步步排查,发现问题出在JNI层,一个被频繁调用的函数分配的内存忘记释放,导致内存泄漏。
这次问题使我明白,别以为Android程序是基于Java语言,有强大的垃圾回收机制,就完全不用担心内存问题,其实Android程序也要特别小心你的内存,因为毕竟手机不比PC机,内存是极其有限的,在内存不够的时候,系统随时会Kill掉你的程序。目前我所了解到的,容易发生内存问题的地方如下:
(1) 操作Bitmap对象,一定要注意,在不使用的时候 recycle
(2) 访问数据库,一定要记得关闭游标
(3) 涉及JNI层的代码,由于JNI层是采用C/C++编写,需要自己管理内存的分配/回收,所以要慎重小心。
那么,Android开发中,有什么有效的方法可以检测内存使用情况以及内存泄漏呢?
这里主要介绍三种方法:
1. 程序的Log信息
程序在进行垃圾回收的时候,会打印一条Log信息(logcat窗口),例如:
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
注意这条信息中的 “ 3571K/9991K” 值,这代表着程序使用的heap大小,如果这个值一直在增加,而从来不减小,那么就代表着你的程序存在着内存泄漏。
2. DDMS的Heap信息
Eclipse开发环境还提供了一种更加直观的方法来查看App的Heap信息,操作方式如下:
(1) 连接手机,运行程序,假设是 com.ticktick.test 程序
(2) 点击DDMS按钮,在左侧的Device窗口选中你要检测的程序(com.ticktick.test )
(3) 点击Device窗口工具栏的第二个图标(Update Heap),
(4) 点击右边的窗口的Cause GC按钮,即可得到当前程序的Heap信息
同样,随着程序的运行,多次点击得到的Heap大小,如果只增不减的话,也昭示着你的程序有内存泄漏。
3. adb命令查看内存信息
其实,最全面最简单的方式还是用adb命令来查看程序的内存占用和内存泄漏情况,打开命令行窗口,adb命令的格式如下:
adb shell dumpsys meminfo <package_name>
其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找,在命令行窗口运行上述命令,得到的我的 com.ticktick.test 程序的内存情况如下所示:
这里得到的信息非常多,重点关注如下几个字段:
(1) Native/Dalvik 的 Heap 信息
具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。
(2) Total 的 PSS 信息
这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。
- eclipse 检测App的内存占用和泄漏
- 检测App的内存占用和泄漏
- 检测App的内存占用和泄漏
- Android开发实践:检测App的内存占用和泄漏
- Android内存泄漏的检测APP
- Android App检测内存泄漏
- 预防和检测内存泄漏的方法:
- 内存泄漏的防范和检测方法
- java内存泄漏的预防和检测
- app的内存泄漏的检测(转)
- 内存泄漏的检测
- 内存泄漏的检测
- Android开发中的APP内存泄漏检测
- 使用android studio检测app内存泄漏
- GDI泄漏和内存泄漏 检测方法
- 内存泄漏检测和处理
- 内存泄漏检测和定位
- 关于内存泄漏和内存分析检测的简单描述
- 【C#设计模式-访问者模式】
- nyoj 312 20岁生日
- 新浪微博项目笔记
- slidingMenu 百度地图在Fragment中切换黑边解决方法
- UltraEdit 21.30.1024破解激活
- eclipse 检测App的内存占用和泄漏
- mysql 安装暂停
- 一整套WordPress模板制作的教程
- HDU1997 汉诺塔7
- spring aop 入门(序列一)
- 数组学习(二)
- 正则表达式匹配连续重复单词Regular Expression For Consecutive Duplicate Unicode Words
- 学习笔记-UITableView的数据源(dataSource)和代理(delegate)
- 第三方框架之greenDao