Android内存的相关排查方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android内存的相关排查方法相关的知识,希望对你有一定的参考价值。

参考技术A

dumpsys meminfo 是android系统提供的查询内存命令,用该命令可以看到:
每个进程占用的物理内存大小
系统内存分布状态,包括
总的可用物理内存 Total RAM
当前可用物理内存 Free RAM
已用物理内存 Used RAM
不可见内存 Lost RAM

比如输入该命令后输出如下日志:

该命令打印的最后一部分,反应系统级别的内存状况:
Total RAM: 1015868 kB
Free RAM: 638914 kB (105418 cached pss + 180168 cached + 353328 free)
Used RAM: 211428 kB (186096 used pss + 8008 buffers + 520 shmem + 16804 slab)
Lost RAM: 165526 kB
Tuning: 96 (large 256), oom 20480 kB, restore limit 6826 kB (high-end-gfx)
里面某些字段的意义需要注意:
dumpsys meminfo

OOM Killer(Out Of Memory Killer) 是Linux当中,内存保护机制的一种。当物理内存几乎耗尽而又需要分配新内存时,会杀掉一些优先级低的进程,释放内存。
LowMemoryKiller 是Android的内存保护机制。当物理内存低于阈值,就会杀掉一些优先级低的进程,释放内存。

联系:LowMemoryKiller 用到了 OOM Killer 的评分机制
区别:LowMemoryKiller 是通过阈值触发,OOM Killer 是分配内存失败时触发

评分原理:
oom_adj,代表进程的优先级, 数值越大,优先级越低,越容易被杀。系统分16个级别(取值范围[-16, 15]整数,不连续)
通过 cat /proc/xxx/oom_adj 查看,其中xxx是进程号
oom_score_adj: 在 oom_adj 基础上的评分,取值范围[-1000, 1000]
通过 cat /proc/xxx/oom_score_adj 查看,其中xxx是进程号

阈值查看,以98mv100为例:
cat /sys/module/lowmemorykiller/parameters/minfree
1024,1536,2048,3072,3584,4096
cat /sys/module/lowmemorykiller/parameters/adj
0,58,117,176,529,1000
上诉数值表示:可用内存低于 4096 4K 时,杀掉 oom_score_adj>=1000 的应用;可用内存低于 3584 4K 时,杀掉 oom_score_adj>=529 的应用,以此类推。

因此,客户可以通过调整 minfree 的阈值来触发 LowMemoryKiller 更频繁地杀应用,从而为高优先级应用省下内存。

在 dumpsys meminfo 中,GPU内存被统计到了 Lost RAM 里面了。

因此,当应用占用GPU内存过高时,不会体现在 Used RAM 里面,而是体现在 Lost RAM 中。反过来,如果发现有问题的时候 Lost RAM 很高,就需要看看GPU内存使用情况了。用以下命令:�
mount -t debugfs debugfs /sys/kernel/debug/
cat /sys/kernel/debug/mali/gpu_memory

130|root@MR820:/ # cat /sys/kernel/debug/mali/gpu_memory
Name (:bytes) pid mali_mem max_mali_mem external_mem ump_mem dma_mem

其中mali_mem列就是应用占用的GPU内存

RK3399平台开发系列讲解(内存篇)18.9内存泄漏排查方法

在这里插入图片描述

平台 内核版本 安卓版本
RK3399 Linux4.4 Android7.1

step1、判断是否存在内存泄漏或者内存一直申请没有释放的情况

cat /proc/meminfo可以查询系统内存使用的情况。
/proc/meminfo是了解Linux系统内存使用状况的主要接口 ,/proc/meminfo所包含的信息比”free”等命令要丰富得多,负责输出/proc/meminfo的源代码是:fs/proc/meminfo.c : meminfo_proc_show()

  1. cat /proc/meminfo可以查询系统内存使用的情况,里面主要可以关注MemA

以上是关于Android内存的相关排查方法的主要内容,如果未能解决你的问题,请参考以下文章

Android性能优化内存泄漏与排查流程,6年老Android经验总结

Android Bitmap加载内存占用彻底分析

APP排查内存泄漏最简单和直观的方法

Android ValueAnimator --内存泄漏

RK3399平台开发系列讲解(内存篇)18.9内存泄漏排查方法

Android内存相关补充