android内存dump分析,闭眼能敲,Android内存分析command

Android常用内存分析命令

1.procrank

获取所有进程的内存使用的排行榜,按PSS排序

2.free

查看可用内存,单位KB

3.cat /proc/meminfo

查看系统整体内存情况,内存项按类型分类

MemAvailable ≈ MemFree+Buffers+Cached

每个进程的kernel stack 是16K,根据这个可以判断后台进程数

MemAvailable = free - kernel reserved memory + ative file + inactive file + SReclaimable - 2 * zone low water mark

Cached = All file page - buffers - swapping = Active file + Inactive file + Unevictable file - Buffers

Slab = SReclaimable + SUnreclaimable

Active = Active(anon) + Active(file)

Inactive = Inactive(anon) + Inactive(file)

AnonPages + Buffers + Cached = Active + Inactive

Buffers + Cached = Active(file) + Inactive(file)

SwapTotal = SwapFree + SwapUsed(Not SwapCached)

KernelStack = the number of kernel task * Stack Size(16K)

Kernel Memory Usage = KernelStack + USlab + PageTables + Shmem + Vmalloc

Native Memory Usage = Mapped + AnonPages + Others

dumpsys meminfo

打印整体所有进程的内存使用,详细每个指标介绍写在《内存使用情况与监测》中

dumpsys meminfo [pid | packageName]

针对具体进程or包名指行dump操作

6.cat /proc/pid/oom_score_adj

查看进程内存查杀优先级,-1000~1000范围,系统进程-1000,前台进程0,cache在900后

7.sys/module/lowmemorykiller/parameters/minfree

sys/module/lowmemorykiller/parameters/adj

旧版本lowmemorykiller使用的水位,Android R以后可以使用getprop |grep minfree查看

8.tombstone可以看虚拟内存的map

9.红屏异常等看SYSTEM_MEM_LOG 确认是否内存泄漏

10.cat /sys/kernel/debug/page_owner

cat sys/kernel/slab/kmalloc-128

12.内核也提供了接口给用户触发规整动作,接口如下:/proc/sys/vm/compact_memory

只要往这个节点写值即可触发对系统所有node管理的内存做内存规整。

13.查看安卓后台cache 应用,一般8G设置为64,12G设置为128,6G设置为32,4G设置为16或者8

dumpsys activity settings |grep CUR_MAX_CACHED_PROCESSES

14.内核内存申请失败or超时log

查看kernel log打印:page allocation stalls for xxx ms 一般超过1s都是比较严重了

event.log 中搜索am_pss可以看各进程占用,搜索killinfo可以查看lmkd查杀进程信息

看log发现申请内存时order = 2的大小(也就是16KB),但buddy system 16KB的内存池只有:19*16kB (H)

其中的标志H表示这是highatomic的,禁止偷页。只有传进来的gfp_mask带有GFP_ATOMIC才能申请reserve的内存,所以发生了kernel OOM。

这题明显是内存碎片化。

dumpsys activity lmk 统计lmk打印

dumpsys meminfo 中的lostram统计

long lostRAM = memInfo.getTotalSizeKb() - (totalPss - totalSwapPss) - memInfo.getFreeSizeKb() - memInfo.getCachedSizeKb() - memInfo.getKernelUsedSizeKb() - memInfo.getZramTotalSizeKb();

18.DDR实时频率(虽然没啥用)

cat /sys/kernel/debug/clk/measure_only_mccc_clk/clk_measure

cat /proc/pagetypeinfo 查看当前buddy信息

(blocksize 和CONFIG_HUGETLB_PAGE有关,打开为2M,关闭为4M )

cat /proc/zoneinfo 查看当前zone信息

zoneinfo_show_print -> node_page_state 读pglist_data的vm_stat计数器

spanned 2095616 内存管理区包含的页面

present 1980484 内存管理区实际管理的页面

managed 1921719 内存管理区被buddy管理的页面

protection: (0, 0) 预留的内存

node_unreclaimable: 0 页面回收失败次数

start_pfn: 525824 内存管理区的起始页帧号

cat /proc/$pid/status |grep -E 'Name|Pid|Vm|Rss|Vm|Hu'

进程相关的内存信息

#include

enum {

MM_FILEPAGES, /* Resident file mapping pages */

MM_ANONPAGES, /* Resident anonymous pages */

MM_SWAPENTS, /* Anonymous swap entries */

MM_SHMEMPAGES, /* Resident shared memory pages */

MM_UNRECLAIMABLE, /* Unreclaimable pages, e.g. shared with HW */

NR_MM_COUNTERS

};

/proc/sys/vm 目录下均是调优参数

定义在kernel/sysctl.c中,通过proc文件系统实现

static struct ctl_table vm_table[] = {

{

.procname = "overcommit_memory",

.data = &sysctl_overcommit_memory, //传递的参数,通常是某个全局变量

.maxlen = sizeof(sysctl_overcommit_memory), //data的长度

.mode = 0644, //节点的文件权限,用户可读写,其他只读

.proc_handler = proc_dointvec_minmax, //节点在内核中的回调函数

.extra1 = &zreo, //这个参数的最小值

.extra1 = &two, //这个参数的最大值

},

...

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现在上一个击杀信息显示完毕后再显示下一个击杀信息,可以在代码中使用Tween的OnComplete回调函数来实现。以下是一个简单的示例代码: ``` using UnityEngine; using FairyGUI; public class KillInfoPanel : MonoBehaviour { private GComponent _mainView; private GList _killList; void Start() { _mainView = this.GetComponent<UIPanel>().ui; _killList = _mainView.GetChild("killList").asList; // 监听击杀事件 GameEventManager.Instance.AddListener(GameEventType.Kill, OnKill); } void OnDestroy() { GameEventManager.Instance.RemoveListener(GameEventType.Kill, OnKill); } private void OnKill(GameEvent evt) { // 获取击杀信息 string killerName = evt.GetParam<string>(0); string victimName = evt.GetParam<string>(1); // 在列表中添加新的击杀信息 _killList.AddItem(killerName + " killed " + victimName); // 播放列表中的所有击杀信息 PlayKillList(); } private void PlayKillList() { // 按照顺序播放列表中的所有击杀信息 for (int i = 0; i < _killList.numItems; i++) { GComponent killInfo = _killList.GetChildAt(i).asCom; killInfo.alpha = 0; // 显示当前击杀信息 killInfo.TweenFade(1, 0.5f).OnComplete(() => { // 隐藏当前击杀信息 killInfo.TweenFade(0, 0.5f).OnComplete(() => { // 播放下一个击杀信息 if (i < _killList.numItems - 1) { PlayKillList(); } }); }); // 等待上一个击杀信息显示完毕 break; } } } ``` 这段代码在PlayKillList函数中使用Tween的OnComplete回调函数来实现在上一个击杀信息显示完毕后再显示下一个击杀信息。当显示当前击杀信息时,它会设置其alpha为0,然后使用TweenFade函数将其渐隐渐现地显示出来。当当前击杀信息显示完毕后,它会使用TweenFade函数将其渐隐消失,并在渐隐消失完毕后使用回调函数来播放下一个击杀信息。如果当前击杀信息是最后一个,那么就不再播放下一个击杀信息。在等待上一个击杀信息显示完毕时,它使用break语句来中断循环,以确保只有上一个击杀信息显示完毕后才会显示下一个击杀信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值