这次问题使我明白,别以为Android程序是基于Java 语言,有强大的垃圾回收机制,就完全不用担心内存问题,其实Android程序也要特别小心你的内存,因为毕竟手机不比PC机,内存是极其有限的,在内存 不够的时候,系统随时会Kill掉你的程序。目前我所了解到的,容易发生内存问题的地方如下:
(1) 操作Bitmap对象,一定要注意,在不使用的时候 recycle
(2) 访问数据库,一定要记得关闭游标
(3) 涉及JNI层的代码,由于JNI层是采用C/C++编写,需要自己管理内存的分配/回收,所以要慎重小心。
那么,Android开发中,有什么有效的方法可以检测内存使用情况以及内存泄漏呢?
这里主要介绍三种方法:
1. 程序的Log信息
程序在进行垃圾回收的时候,会打印一条Log信息(logcat窗口),例如:
1
|
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命令的格式如下:
1
|
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 信息
这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。
4. 总结
关 于Android开发中内存的使用情况和内存泄漏的检测就简单介绍到这里,基本上用以上三种方式都能够定位内存泄漏问题,平时在使用Bitmap,数据库 和JNI层C/C++编程的时候,注意一点就行。另外,如果想深入了解文中的一些详细内容,可以参考Google官方提供的两篇文章,它们有着更详细的论 述《Investigating Your RAM Usage》,《Managing Your App Memory》,有任何疑问或者不清楚的地方,欢迎留言或者来信lujun.hust@gmail.com交流。
相关推荐
android安卓app开发之如何查看cpu使用率和内存泄漏.zip
AndroidApp定位和规避内存泄露 如何确定App存在内存泄露 如何定位App的内存泄露位置 怎样避免内存泄露 使用procrank查看进程内存 procrank 命令可以获得当前系统中各进程的内存使用快照,这里有PSS,USS,VSS,...
本篇文章主要介绍了用Android Studio检测内存泄露的问题的解决方法,Android Studio在为我们提供了良好的编码体验的同时,也提供了许多对App性能分析的工具,下面我们一起来了解一下。
这是Android实现人体检测APP Demo(可实时运行);更多内容请查看: 行人检测(人体检测)1:人体检测数据集(含下载链接):https://blog.csdn.net/guyuealian/article/details/128821763 行人检测(人体检测)2:YOLOv5...
Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...
1.内容 本文档包含如下内容: 如何确定App存在内存泄露 如何定位App的内存泄露位置 怎样避免内存泄露
Unity调用Android查看当前app占用内存信息,系统可用内存大小及系统内存大小,FPS的显示,帮助对游戏进行性能优化
1.代码获取当前app内存的使用情况 ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); //最大分配内存 int memory = activityManager.getMemoryClass(); System.out....
Android App调试内存泄露之Cursor.zip
安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业...
不用 instruments 检测 app 内的内存泄露.zip,Find memory issues & leaks in your iOS app without instruments
Android人体检测和人体关键点检测APP,支持CPU多线程和GPU加速,可实时检测(这是 Demo APP),原文请参考《2D Pose人体关键点实时检测(Python/Android /C++ Demo)》...
功能:获取android设备中某一个app的cpu和内存 环境:python和adb 使用方法:使用adb连接android设备,打开将要测试的app,执行cpu/内存代码 cpu获取代码如下:(输入参数为脚本执行时间) # coding:utf-8 ''' 获取...
AndroidApp定位和规避内存泄露方法研究.docxAndroidApp定位和规避内存泄露方法研究.docxAndroidApp定位和规避内存泄露方法研究.docxAndroidApp定位和规避内存泄露方法研究.docxAndroidApp定位和规避内存泄露方法研究...
dlib-android-app See http://dlib.net for the main project documentation. See dlib-android for JNI lib. Refer to dlib-android/jni/jnilib_ex Grap the source $ git clone ...
Unity调用Android查看内存信息,在android上面运行时候可查看fps,系统内存大小,系统可用内存大小,当前App占用内存
物联网智能插座 AndroidApp部分——本科毕业设计项目源码物联网智能插座 AndroidApp部分——本科毕业设计项目源码物联网智能插座 AndroidApp部分——本科毕业设计项目源码物联网智能插座 AndroidApp部分——本科毕业...