Android 常用调试工具/方法解析

news2024/12/23 13:55:53

一、内存相关

参考Android内存分析命令_dumpsys meminfo 算出rss-CSDN博客

1、基本概念

1)PSS & RSS & USS & VSS

a、PSS
  • 概念:全称Proportional Set Size,根据进程实际使用的内存量按照共享比例分配给进程的一种内存度量方式。如果多个进程共享同一块内存页,那么共享的内存会被均摊到各个进程的 Pss 中,以更准确地反映各个进程实际使用的内存。
  • 意义:根据共享比例分配内存的方式,因此相比于简单的内存统计,它提供了更精确的内存使用情况,避免重复计算共享内存,更好地反映进程真实的内存占用情况。
b、RSS
  • 概念:全称Resident Set Size,指示一个进程当前在物理内存中占用的实际大小,包括私有页和共享页的总和。这表示了一个进程实际占用了多少物理内存资源。
  • 意义:更加直接地表示了一个进程当前占用的物理内存大小,包括私有页和共享页。通过监控 Rss,可以了解一个进程实际消耗的系统资源,帮助识别内存泄漏、优化内存使用等问题。

2)Dirty & Clean & SwapPss

a、Private Dirty
  • 概念:表示进程私有页中已经修改(脏数据)的内存量。这些数据是进程独占并且已被修改的,通常表示进程对这部分内存执行了写入操作
  • 意义:Private Dirty占比过高,可能意味着进程频繁地修改内存数据,导致系统产生大量的脏页,增加了写入操作的开销。优化这部分内存的管理,减少不必要的写入操作,可以提高系统性能
b、Private Clean
  • 概念:表示进程私有页中未被修改(干净数据)的内存量。这些数据是进程独占但未被修改的,通常表示这部分内存没有发生写入操作。
  • 意义:Private Clean 有助于了解进程对内存的读取操作情况和内存使用效率。较高的 Private Clean 可能暗示着进程大量读取数据但很少进行写入操作,即访问模式偏向读取而不是写入。
c、SwapPss Dirty
  • 概念:用于监视系统中内存交换操作的情况。当系统内存不足时,操作系统会将部分内存页交换到磁盘的交换空间以腾出物理内存供其他程序使用。
  • 意义:SwapPss 提供了一个指标,用于监视系统中内存交换操作的情况。当系统内存不足时,操作系统会将部分内存页交换到磁盘的交换空间以腾出物理内存供其他程序使用。高 SwapPss 值通常暗示着系统内存不足,导致操作系统频繁地将内存页交换到磁盘上的交换空间,这可能会对系统性能产生负面影响。
  • 作用:此值通常出现在dumpsys meminfo packagename命令里面

2、命令解读

1)dumpsys meminfo

此命令查询系统当前整体的内存状态,如下先打印了当前的时间搓

C:\Users\Administrator>adb shell dumpsys meminfo
Applications Memory Usage (in Kilobytes):
Uptime: 32351135 Realtime: 85587685

  • Total RSS by Process:展示了系统当前各个进程的RSS使用情况,按照顺序排列

Total RSS by process:
  1,203,384K: io.supercent.pizzaidle (pid 4810 / activities) 

                ------>  PS:此时的前台进程RSS占用1203M
    250,004K: system (pid 1445)
    160,036K: com.google.android.gms (pid 22458)
    158,204K: com.android.systemui (pid 1804)
    130,548K: surfaceflinger (pid 786)
    127,192K: camerahalserver (pid 1076)
     88,844K: com.google.android.gms.persistent (pid 16497)
     88,076K: com.transsion.smartpanel (pid 8593)
     83,160K: com.transsion.XOSLauncher (pid 5980 / activities)
     ............

  • Total RSS by OOM adjustment:按照OOM调整的类别来进行展示

Total RSS by OOM adjustment:
    848,928K: Native   --->下面是native层的进程(包括系统和底层服务),总计848M
        130,548K: surfaceflinger (pid 786)
        127,192K: camerahalserver (pid 1076)
         77,560K: android.hardware.graphics.composer@3.1-service (pid 729)
         23,808K: zygote64 (pid 716)
         14,396K: android.hardware.media.c2@1.2-mediatek-64b (pid 731)
         .........

    250,004K: System   --->下面是系统进程(如system进程,注意systemui不算),总计250M
        250,004K: system (pid 1445)
    339,500K: Persistent  -->持久性进程(如systemui)感觉像是配置了Persistent参数的进程
        158,204K: com.android.systemui (pid 1804)
         47,072K: com.android.phone (pid 2060)
         40,340K: com.android.networkstack.process (pid 1925)
         29,560K: com.mediatek.ims (pid 2025)

     72,824K: Persistent Service  -->持久性服务进程
         37,052K: com.android.bluetooth (pid 21973)
         35,772K: com.google.android.providers.media.module (pid 3149)
  1,423,652K: Foreground  --->前台进程(通常是用户当前与之交互的应用程序)
      1,203,384K: io.supercent.pizzaidle (pid 4810 / activities)   --->当前正在玩这个游戏
         88,844K: com.google.android.gms.persistent (pid 16497)
         71,740K: com.google.android.webview:sandboxed_process0:org.chromium.content.app.SandboxedProcessService0:0 (pid 5275)
         59,684K: com.google.android.adservices.api (pid 3890)
    962,372K: Visible  --->可见进程(但是并没有操作的进程)
        160,036K: com.google.android.gms (pid 22458)
         88,076K: com.transsion.smartpanel (pid 8593)
    194,036K: Perceptible  --->这些进程是可察觉的,即用户可以感知到其活动或影响
         54,924K: com.google.android.inputmethod.latin (pid 17551)
         44,192K: com.transsion.kolun.assistant (pid 7307)
         38,876K: com.google.android.apps.messaging:rcs (pid 16560)
         28,088K: com.transsion.batterylab (pid 16564)
         27,956K: com.transsion.uxdetector (pid 16570)
     58,364K: Perceptible Medium -->这些进程也是可察觉的,但相对于 Perceptible 类别来说,它们的活动可能更为中等或轻微
         58,364K: com.google.android.googlequicksearchbox:search (pid 3543)
     46,896K: Backup -->备份进程,在某些情况下可能会执行备份操作
         46,896K: com.transsion.plat.appupdate (pid 3056)
     43,308K: Previous  -->之前的进程,可能指在过去某个时间段内运行过的进程
         43,308K: com.google.process.gservices (pid 32449)
    181,300K: Cached  -->缓存进程,一般用于存储最近使用过的数据或资源以提高访问速度
         79,588K: com.hoffnung:remote (pid 6009)
         51,536K: com.google.android.permissioncontroller (pid 5059)
         50,176K: com.transsion.plat.appupdate.ui (pid 3305)

  • Total RSS by category:按照类别(非进程的角度)来进行展示

Total RSS by category:
  1,086,084K: .so mmap ->表示共有 1086M的内存用于动态链接库的内存映射操作
    580,804K: GL mtrack ->代表图形库OpenGL内存追踪所占用的内存大小为 580M
    466,792K: .art mmap ->表示用于 Android 运行时环境(ART)的内存映射占用
    354,016K: EGL mtrack ->指 OpenGL ES 内存追踪占用了 354,016K 的内存量
    351,796K: .jar mmap ->表示 Java 程序文件(.jar 文件)的内存映射使用量
    313,896K: .oat mmap ->用于优化程序的可执行文件和数据缓存.oat 文件的内存映射
    226,636K: Native     -->表示本地代码进程所占用的内存
    212,288K: Unknown  ->未知类型的资源占用
    187,164K: Dalvik       -->Dalvik 虚拟机相关的资源消耗
    181,812K: .apk mmap  ->APK 文件的内存映射占用
    148,348K: .dex mmap ->可执行文件.dex 文件的内存映射占用
    130,448K: Other mmap ->其他类型的内存映射占用
     86,284K: Dalvik Other ->Dalvik 虚拟机的其他资源消耗了 86,284K 的内存
     70,496K: Other dev  ->其他开发相关的资源占用
     19,296K: Stack       ->栈内存占用了 19,296K 的空间
      4,844K: Ashmem   ->匿名共享内存(Ashmem)占用了 4,844K 的内存
        180K: .ttf mmap    ->TrueType 字体文件的内存映射占用了 180K 的内存
          0K: Cursor         ->游标相关的资源没有占用任何内存
          0K: Gfx dev       ->图形设备相关的资源也没有占用内存
          0K: Other mtrack  ->其他内存跟踪资源没有占用内存

  • Total PSS by process:同上
  • Total PSS by OOM adjustment:同上
  • Total PSS by category:同上
  • 整体使用情况

Total RAM: 3,697,392K (status normal)  ->总共的RAM容量为3697M,这是一台4G手机
 Free RAM:   548,930K (   49,482K cached pss +   448,860K cached kernel +    50,588K free)  ->空闲的RAM为 548M(其中包括49M用于缓存 PSS,448M 用于缓存内核,还有 50M是完全空闲的)
DMA-BUF:   119,856K (   14,080K mapped +   105,776K unmapped)   ->表示系统中DMA-BUF的总大小为 119M,它是直接内存访问缓冲区,即不通过cpu将内存映射给用户空间的进程或者硬件设备,其中14M已经映射了,105M还未被映射
DMA-BUF Heaps:   119,808K
DMA-BUF Heaps pool:    75,540K
      GPU:   679,348K (  114,628K dmabuf +   564,720K private)  ->GPU占用了679M的内存,其中114M是 DMA-BUF映射而来,564M是GPU独有的
 Used RAM: 4,001,150K (2,718,430K used pss + 1,282,720K kernel)  ->使用的内存4001M,包括2718M的PSS和1282M的内核内存,这里有个疑问为什么会比总RAM多?
 Lost RAM:   182,646K   -->丢失的内存
     ZRAM:   468,452K physical used for 1,541,632K in swap (2,773,040K total swap)
   Tuning: 256 (large 512), oom   322,560K, restore limit   107,520K (high-end-gfx)

疑问1:为什么Used RAM高于Total RAM?

疑问2:DMA-BUF到底是什么?

疑问3:为什么会存在丢失内存?

2)dumpsys meminfo packagename

此命令可以带上包名,查询指定进程的内存详细使用情况,阅读之前先理解《Dirty & Clean & SwapPss》相关概念

C:\Users\Administrator>adb shell dumpsys meminfo io.supercent.pizzaidle

  • MEMINFO & App Summary:单位K,反映当前进程两种不同分类的部分占用情况

  • Objects & SQL

3)adb shell free

C:\Users\Administrator>adb shell free
                total        used        free      shared     buffers
Mem:       3786129408  3726004224    60125184    17903616     1323008
-/+ buffers/cache:     3724681216    61448192
Swap:      2839592960  1799475200  1040117760

4)cat /proc/meminfo

5)vmstat

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1945619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySql性能调优05-[sql实战演练]

sql实战演练 行列转换行列式转换第一题【列转行】第二题【列转行】 having的使用找到表中,名字重复的项有数据表employee,包含如下字段id、name、department、age,编写SQL,找到不与其他人同龄的年纪最大的员工的年龄有数据表emplo…

Nacos-2.4.0最新版本docker镜像,本人亲自制作,部署十分方便,兼容postgresql最新版本17和16,奉献给大家了

基于Postgresql数据库存储的nacos最新版本2.4.0,采用docker镜像安装方式 因业务需要,为了让nacos支持postgresql,特意花了两天时间修改了源码,然后制作了docker镜像,如果你也在找支持postgresql的nacos最新版本,恭喜你,你来的正好~ nacos-2.4.0 postgresql的数据库脚本…

C++学习笔记-C++11中的智能指针

1.智能指针介绍 智能指针是C的特性用法,是一个类似指针功能的类对象,其目的是为了更好的管理动态分配的内存,避免出现内存泄漏、悬空指针等问题。C11的标准库里提供了三种智能指针模板类,分别是std::unique_ptr、std::shared_ptr…

vue 两个页面切换, 再回到当前页,还是离开前的数据

1、要保证页面的name 和 建路由的大小写一致 2、页面不用生命周期--activated 调接口刷新

计算机网络八股文(三)

目录 41.为什么每次建立TCP连接时,初始化的序列号都不一样? 42.初始序列号ISN如何随机产生? 43.既然IP层会分片,为什么TCP层需要根据MSS分片呢? 44.TCP第一次握手丢失,会发生什么? 45.TCP第…

一个python脚本解决新版剪映导出字幕收费问题

如果你是希望我能完全解决剪映收费问题,我无法帮你; 两个文件,可生成不带时间线的纯文案,MD 格式,也可以生成带时间线的 SRT 文件。 因为剪映国内版对 JSON 文件进行了加密,所以请选择国际版 Cutcap&#x…

《javaEE篇》--阻塞队列详解

阻塞队列 阻塞队列概述 阻塞队列也是一种队列,和普通队列一样遵循先进先出的原则,但是阻塞队列相较于普通队列多了两项功能阻塞添加和阻塞移除,使得阻塞队列成为一种线程安全的数据结构 阻塞添加:当队列满的时候继续入队就会阻…

电脑虚拟摄像头软件分享|用手机打破电脑摄像头的极限

随着手机摄像头的不断更新迭代,手机已经接近专业电脑摄像头的画质。这让我们可以花费更低的成本获取优质的电脑录像画面。今天小编给大家详细讲解电脑虚拟摄像头的在我们日常生活中的妙用,以及分享几款口碑不错的电脑虚拟摄像头软件。有需要的小伙伴可以…

从业务到数据,大模型应用成功的再思考!

自2022年底OpenAI发布ChatGPT以来,大模型在企业的应用方兴未艾。 大模型必须要结合落地应用,才算是长出手跟脚,真正应用于实际业务场景的解决方案中,配合“大脑”完成任务。从医疗诊断到自动驾驶,从个性化营销到智能客…

数据结构重置版(概念篇)

本篇文章是对数据结构的重置,且只涉及概念 顺序表与链表的区别 不同点 顺序表 链表 存储空间上 物理上一定连续 逻辑上连续,但物理上不一定连续…

【办公软件】Office 2019以上版本PPT 做平滑切换

Office2019以上版本可以在切页面时做平滑切换,做到一些简单的动画效果。如下在快捷菜单栏中的切换里选择平滑。 比如,在两页PPT中,使用同一个形状对象,修改了大小和颜色。 选择切换为平滑后,可以完成如下的动画显示。 …

milvus的collection操作

milvus的collection操作 创建collection import uuidfrom pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )collection_name "hello_milvus" host "192.168.230.71" port 19530 username "" password…

JavaScript:数组排序(冒泡排序)

目录 一、数组排序 二、sort()方法 1、基本语法 2、默认排序 3、自定义排序 三、冒泡排序 1、基本概念 2、实现步骤 3、过程解析 4、代码示例 5、时间复杂度 一、数组排序 对一个给定数组进行处理,使其从无序变为有序,这个过程就是数组排序&…

Python文件打包exe文件

作者的一点话 你是否还在为py文件无法像其他可视化项目展示出来,制造图形界面的移动使用,那接下来我会与你一同使用它,并进行study,如有困惑,可随时联系。 然后,需要使用pysimplgui,如果…

Vue3+.NET6前后端分离式管理后台实战(三十一)

1,Vue3.NET6前后端分离式管理后台实战(三十一)

数据开发/数仓工程师上手指南(一)数仓概念总览

前言 笔者毕业最开始从事的就是大数据开发和数据仓库建设工作,途中曾担任过人工智能工程师和计算机视觉工程师,没想到最后兜兜转转还是回到了最原本的工作数据开发工程师。但很少有写关于本职工作的技术内容输出。 之前笔者撰文内容大部分都是关于算法…

Spring Boot集成screw实现数据库文档生成

1.什么是screw? 在企业级开发中、我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有、要么有、但都是手写、后期运维开发,需要手动进行维护到文档中&…

Postman接口测试工具的使用

一、postman简介 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。作用:常用于进行接口测试。不需要安装。 特征:简单,实用,美观,大方。 二、Postman接口测试工具的使用 Postman不需要安…

qt 自定义样式 switch开关,已解决

在日常需求中,需要对功能增加一个开关,因此做了简单封装。结果能正常使用。自定义信号接收! 实现 QWidget* switchBtn new CCendSwitchWidget(btn_value);connect(switchBtn, SIGNAL(clicked(bool,QString)), this, SLOT(clickedSlot(bool,…

【吊打面试官系列-ZooKeeper面试题】Zookeeper 的典型应用场景

​大家好,我是锋哥。今天分享关于 【Zookeeper 的典型应用场景 】面试题,希望对大家有帮助; Zookeeper 的典型应用场景 Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员可以使用它来进行分布式数据的发布…