加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

Android应用开发如何防止内存泄漏

发布时间:2021-11-25 18:54:40 所属栏目:教程 来源:互联网
导读:内存泄露是Java 编程中经常容易被忽视,但又十分重要的一个问题。 Android 应用主要使用 Java 语言编写,因此这个问题也同样会在Android 开发中出现。Android IT分享一些基本知识和避免内存泄露的技巧,希望能大家有所帮助。 一、 Android内存管理机制 Android

内存泄露是Java 编程中经常容易被忽视,但又十分重要的一个问题。 Android 应用主要使用 Java 语言编写,因此这个问题也同样会在Android 开发中出现。Android IT分享一些基本知识和避免内存泄露的技巧,希望能大家有所帮助。
 
一、 Android内存管理机制
 
Android 主要应用在嵌入式设备当中,而嵌入式设备由于一些众所周知的条件限制,通 常都不会有很高的配置, 特别是内存是比较有限的。 如果我们编写的代码当中有太多的内对 存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机。为了能够使得Android 应用程序安全且快速的运行,Android 的每个应用程序都会使用一个专有的Dalvik 虚拟机实 例来运行,它是由 Zygote 服务进程孵化出来的,也就是说每个应用程序都是在属于自己的 进程中运行的。 一方面, 如果程序在运行过程中出现了内存泄漏的问题, 仅仅会使得自的己 进程被 kill 掉,而不会影响其他进程(如果是system_process 等系统进程出问题的话,则会 引起系统重启) 。另一方面Android 为不同类型的进程分配了不同的内存使用上限,如果应 用进程使用的内存超过了这个上限,则会被系统视为内存泄漏,从而被kill 掉。Android 为 应用进程分配的内存上限如下所示:
 
位置: /ANDROID_SOURCE/system/core/rootdir/init.rc 部分脚本
 
# Define the oom_adj values for the classes of processes that can be
 
# killed by the kernel. These are used in ActivityManagerService.
 
setprop ro.FOREGROUND_APP_ADJ 0
 
setprop ro.VISIBLE_APP_ADJ 1
 
setprop ro.SECONDARY_SERVER_ADJ 2
 
setprop ro.BACKUP_APP_ADJ 2
 
setprop ro.HOME_APP_ADJ 4
 
setprop ro.HIDDEN_APP_MIN_ADJ 7
 
setprop ro.CONTENT_PROVIDER_ADJ 14
 
setprop ro.EMPTY_APP_ADJ 15
 
# Define the memory thresholds at which the above process classes will
 
# be killed. These numbers are in pages (4k).
 
setprop ro.FOREGROUND_APP_MEM 1536
 
setprop ro.VISIBLE_APP_MEM 2048
 
setprop ro.SECONDARY_SERVER_MEM 4096
 
setprop ro.BACKUP_APP_MEM 4096
 
setprop ro.HOME_APP_MEM 4096
 
1Android 内存泄漏调试
 
setprop ro.HIDDEN_APP_MEM 5120
 
setprop ro.CONTENT_PROVIDER_MEM 5632
 
setprop ro.EMPTY_APP_MEM 6144
 
# Write value must be consistent with the above properties.
 
# Note that the driver only supports 6 slots, so we have HOME_APP at the
 
# same memory level as services.
 
write /sys/module/lowmemorykiller/parameters/adj0,1,2,7,14,15
 
write /proc/sys/vm/overcommit_memory1
 
write /proc/sys/vm/min_free_order_shift4
 
write /sys/module/lowmemorykiller/parameters/minfree
 
1536,2048,4096,5120,5632,6144
 
# Set init its forked children's oom_adj.
 
write /proc/1/oom_adj -16
 
正因为我们的应用程序能够使用的内存有限, 所以在编写代码的时候需要特别注意存内 使用问题。如下是一些常见的内存使用不当的情况。
 
(一) 查询数据库没有关闭游标
 
描述: 程序中经常会进行查询数据库的操作,但是经常会有使用完毕 Cursor 后没有关闭的情
 
况。 如果我们的查询结果集比较小, 对内存的消耗不容易被发现, 只有在常时间大量操的作 情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。
 
示例代码:
 
修正示例代码:
 
Cursor cursor = getContentResolver().query(uri ...);
 
if (cursor.moveToNext()) {
 
... ...
 
}
 
Cursor cursor = null;
 
try {
 
cursor = getContentResolver().query(uri ...);
 
if (cursor != null && cursor.moveToNext()) {
 
... ...
 
}
 
} finally {
 
if (cursor != null) {
 
try {
 
2
 
Android 内存泄漏调试
 
cursor.close();
 
} catch (Exception e) {
 
//ignore this
 
}
 
}
 
}

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读