欢迎来到天天文库
浏览记录
ID:61957341
大小:767.18 KB
页数:22页
时间:2021-04-01
《Android内存泄露调试.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、优选Android 内存泄漏调试 一、概述 如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机。为了能够使得Android应用程序安全且快速的运行,Android的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,即每个应用程序都是在属于自己的进程中运行的。一方面,如果程序在运行过程中出现了内存泄漏的问题,仅仅会使得自己的 进程被kill掉,而不会影响其他进程(如果是system_process等系统进程出问题的话,则会引起系统重启)。另一方面Android为不同类型的进程分配了不
2、同的内存使用上限,如果应用进程使用的内存超过了这个上限,则会被系统视为内存泄漏,从而被kill掉。Android为应用进程分配的内存上限如下所示: 位置:/ANDROID_SOURCE/system/core/rootdir/init.rc部分脚本```#Definetheoom_adjvaluesfortheclassesofprocessesthatcanbekilledbythekernel.#TheseareusedinActivityManagerService.setpropro.FOREGROUND_APP_ADJ0s
3、etpropro.VISIBLE_APP_ADJ1setpropro.SECONDARY_SERVER_ADJ2setpropro.BACKUP_APP_ADJ2setpropro.HOME_APP_ADJ4setpropro.HIDDEN_APP_MIN_ADJ7setpropro.CONTENT_PROVIDER_ADJ1422/22优选setpropro.EMPTY_APP_ADJ15#Definethememorythresholdsatwhichtheaboveprocessclasseswillbekilled.#The
4、senumbersareinpages(4k).setpropro.FOREGROUND_APP_MEM1536setpropro.VISIBLE_APP_MEM2048setpropro.SECONDARY_SERVER_MEM4096setpropro.BACKUP_APP_MEM4096setpropro.HOME_APP_MEM4096setpropro.HIDDEN_APP_MEM5120setpropro.CONTENT_PROVIDER_MEM5632setpropro.EMPTY_APP_MEM6144#Writev
5、aluemustbeconsistentwiththeaboveproperties.#Notethatthedriveronlysupports6slots,sowehaveHOME_APPatthesamememorylevelasservices.write/sys/module/lowmemorykiller/parameters/adj0,1,2,7,14,15write/proc/sys/vm/overmit_memory1write/proc/sys/vm/min_free_order_shift422/22优选wri
6、te/sys/module/lowmemorykiller/parameters/minfree1536,2048,4096,5120,5632,6144#Setinititsforkedchildren'soom_adj.write/proc/1/oom_adj-16·1·2·3·4·5·6·7·8·9·10·11·12·13·14·15·16·17·1822/22优选·19·20·21·22·23·24·25·26·27·28·29·30·1·2·3·4·5·6·7·8·9·1022/22优选·11·12·13·14·15·16
7、·17·18·19·20·21·22·23·24·25·26·27·28·29·30二、常见的内存使用不当的情况22/22优选(一)查询数据库没有关闭游标 描述: 程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。 如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况 下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。示例代码:Cursorcursor=getContentResolver().query(uri...);if(cursor.moveToN
8、ext()){......}·1·2·1·2修正示例代码:Cursorcursor=null;try{cursor=getContentResolver().query(uri...);if(cursor!=null&&cursor.
此文档下载收益归作者所有