news 2026/4/16 14:19:14

移动端性能专项测试之内存 - 进阶篇

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
移动端性能专项测试之内存 - 进阶篇

在 Android 系统中内存作为重要的资源,一直是开发及测试关注的重点,内存不足或者内存资源滥用都会导致严重的问题。本篇文章将会从底层出发给大家介绍 OOM(Out Of Memory)和 LMK(Low Memory Killer)等内存相关的知识。

在 Android 系统架构中,进程可以大体分成两类,一类是 Native 进程,另外一类就是 Java 进程

Native进程

采用 C/C++ 实现,本质上是 Linux 进程,在/system/bin/目录下面的程序文件运行后都是以 native 进程形式存在的。

Java进程

Android 虚拟机(Dalvik 或者 ART)实例的 Linux 进程,进程的入口 main 函数为 Java 函数。Android 虚拟机实例的宿主进程是 fork()系统调用创建的 Linux 进程,所以每一个 Android 上的 Java 进程实际上就是一个 Linux 进程,只是进程中多了一个 Android 虚拟机实例。因此,Java 进程的内存分配比 native 进程复杂,Android 系统中的应用程序基本都是 Java 进程,如桌面、电话、联系人、状态栏等等。

01Android 内存限制

Android 系统为每一个 App 设置了可使用的 Heap(堆内存)大小限制,可以进入到 shell 环境中,找到 build.prop 文件

cat /system/build.prop

  1. dalvik.vm.heapstartsize=8m

  2. app启动后, 系统分配给它的Heap初始大小. 随着App使用可增加

  3. dalvik.vm.heapgrowthlimit=192m

  4. 默认情况下, App可使用的Heap的最大值, 超过这个值就会产生OOM

  5. dalvik.vm.heapsize=512m

  6. 如果App的manifest文件中配置了largeHeap属性, 如下.则App可使用的Heap的最大值为此项设定值

  7. dalvik.vm.heaptargetutilization=0.75

  8. 当前理想的堆内存利用率. GC后, Dalvik的Heap内存会进行相应的调整, 调整到当前存活的对象的大小和 / Heap大小 接近这个选项的值, 即这里的0.75. 注意, 这只是一个参考值.

  9. dalvik.vm.heapminfree=2m

  10. 单次Heap内存调整的最小值

  11. dalvik.vm.heapmaxfree=8m

  12. 单次Heap内存调整的最大值

02LMK(Low Memory Killer)

在用户空间中指定了一组内存临界值,当其中的某个值与进程描述中的 oom_adj 值在同一范围时,该进程将被 Kill 掉。如果你的 APP 某个进程需要一直保存存活,你需要保持你的进程优先级足够高,并且占用比较小,因为 Low Memory Killer 在工作时,同一优先级的进程会先 kill 那个占用最大的。性能测试时主要关注待机时的内存是不是够小。

Low Memory Killer 的工作可能致系统变卡。为什么呢?因为它 kill 了一些进程,然而现在市面的很多 APP 为了保活都会自启,刚刚被 kill,立刻又起来。启动占用大量内存(还有 CPU),又触发 Low Memory Killer。频繁的被 kill 和启动形成了恶性循环,so…系统变的很卡。

03OOM 与 LMK 关系

Google 为什么设定当 Java 进程申请的 Java 空间超过阈值时,就抛出 OOM 异常?

  • 为了让 Android 系统能同时让比较多的进程常驻内存,这样程序启动时就不用每次都重新加载到内存,能够给用户更快的响应。

  • 程序发生 OOM 并不表示 RAM 不足,而是因为程序申请的 Java heap 对象超过了虚拟机配置的 heapgrowthlimit。也就是说,在 RAM 充足的情况下,也可能发生 OOM。

如果 RAM 真的不足,会发生什么呢?

  • 这时 Android 的 memory killer(LMK)会起作用,当 RAM 所剩不多时,memory killer 会杀死一些优先级比较低的进程来释放物理内存,让高优先级程序得到更多的内存。

ps:可以通过 adb shell cat /proc/meminfo 查看 RAM 的使用情况。

04绕过 dalvikvm heapsize 的限制

对于一些大型的应用程序(比如游戏),内存使用会比较多,很容易超出虚拟机 heapsize 的限制,这时怎么保证程序不会因为 OOM 而崩溃呢?

  • 创建子进程
    创建一个新的进程,那么我们就可以把一些对象分配到新进程的 heap 上了,从而达到一个应用程序使用更多的内存的目的,当然,创建子进程会增加系统开销,而且并不是所有应用程序都适合这样做,视需求而定。

  • 使用 jni 在 native heap 上申请空间

    native heap 的增长并不受 dalvik vm heapsize 的限制,只要 RAM 有剩余空间,程序员可以一直在 native heap 上申请空间,当然如果 RAM 快耗尽,LMK 会杀进程释放 RAM。大家使用一些软件时,有时候会闪退,就可能是软件在 native 层申请了比较多的内存导致的。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 18:02:14

GLM-TTS在智能家居中的落地场景设想

GLM-TTS在智能家居中的落地场景设想 你有没有遇到过这样的情况:清晨被冰冷的电子音闹钟吵醒,心里莫名烦躁;家里的智能音箱提醒老人吃药,可对方却因为“普通话太标准”听不懂而忽略;孩子对每天重复的机械语音越来越抵触…

作者头像 李华
网站建设 2026/4/16 8:46:40

用AI分析测试失败日志:自动归因的开源工具全景指南

AI驱动的日志归因已从“概念验证”走向“工程落地”‌ 在2026年的软件测试实践中,‌AI自动根因分析(Root Cause Analysis, RCA)‌ 已不再是实验室里的研究课题,而是大型互联网团队提升MTTR(平均故障修复时间&#xff…

作者头像 李华
网站建设 2026/4/16 8:49:13

【PHP跨域Cookies实战指南】:彻底解决前后端分离架构中的认证难题

第一章:PHP跨域Cookies实战指南在现代Web开发中,前后端分离架构日益普及,跨域请求成为常态。当涉及用户身份认证时,Cookie作为常见的会话管理手段,其跨域使用面临浏览器同源策略的限制。正确配置PHP与前端协作机制&…

作者头像 李华
网站建设 2026/4/16 8:46:05

揭秘PHP图像识别精度瓶颈:5步实现模型精准度翻倍

第一章:揭秘PHP图像识别精度瓶颈的根源在构建基于PHP的图像识别系统时,开发者常遭遇识别准确率不达预期的问题。尽管上层算法看似合理,但性能瓶颈往往深藏于底层实现与环境配置之中。原生PHP缺乏高效的数值计算能力 PHP作为Web开发主流语言之…

作者头像 李华
网站建设 2026/4/16 8:44:41

揭秘PHP实现视频流实时转码:3种高并发场景下的优化策略

第一章:PHP实现视频流实时转码的技术背景在现代多媒体应用中,用户对视频内容的即时性与兼容性提出了更高要求。随着直播、在线教育和短视频平台的兴起,服务器端需要高效处理来自不同设备的原始视频流,并实时转换为多种格式与分辨率…

作者头像 李华
网站建设 2026/4/16 8:44:06

百考通AI:您的智能问卷设计专家,让调研从未如此简单高效

在信息爆炸的时代,数据是洞察市场、理解用户、优化管理的核心驱动力。然而,如何设计一份科学、有效、能精准捕捉关键信息的问卷,却常常成为企业、研究机构乃至个人面临的巨大挑战。传统问卷设计耗时费力,问题设置容易出现偏差&…

作者头像 李华