Android adb shell 查看App内存(java堆内存/vss虚拟内存/详细的内存状况/内存快照hprof)和系统可用内存

1.adb shell 获取app 进程的pid

adb shell "ps|grep com.xxx包名"

根据某个渠道包,去查询对应的pid,如下所示:
在这里插入图片描述

2.通过adb shell 查看设备的java dalvik 堆内存的最大值

执行命令行:

adb shell  getprop dalvik.vm.heapgrowthlimit

在这里插入图片描述
若是app进程中java heap(dalvik heap size) 堆内存超过384m 就会抛出oom.

若是app mainfest.xml 中设置了largeHeap=“true”,则app 进程dalvik heap limit 对应512m 限制。

在这里插入图片描述

3.查看app进程的物理rss、虚拟内存vss情况

adb shell procrank(需要手机 root 权限),可忽略该命令。

考虑使用Top 命令行格式:

adb shell top -n 1 |findstr "packageInfo"

以4399渠道包为案例,执行的adb shell top -n 1 |findstr "\<com.minitech.mixxxxx.m4399\> \<PID\>"
在这里插入图片描述
或者通过adb shel 查询进程status 方式:

执行命令格式:

adb shell  cat /proc/app的pid/status

在这里插入图片描述
注意点:在32位(非arm64位)下,app进程中虚拟内存的峰值时3G 多,比较容易触发oom 情况。

4.通过adb shell 命令行查看app进程中内存状况:

格式:

adb shell dumpsys meminfo [pkg/pid]

可以用来查看指定进程包名的内存使用情况
执行adb shell dumpsys meminfo com.minitech.xxxx.m4399, 可以清楚知道java heap 、native heap、数据库、asset 等 ,内存数值是以KB为单位。

C:\Users\hexingen>adb shell dumpsys meminfo com.minitech.xxx.m4399
Applications Memory Usage (in Kilobytes):
Uptime: 4282829 Realtime: 4282829

** MEMINFO in pid 14622 [com.minitech.miniworld.m4399] **
                   Pss  Private  Private  SwapPss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap   455496   455468        8        0   596992   484213   112777
  Dalvik Heap    26347    26328        0        0    45768    29384    16384
 Dalvik Other     6178     6176        0        0
        Stack     3844     3844        0        0
       Ashmem     5561     5092        0        0
    Other dev       28        0       28        0
     .so mmap    62819     5104    55760       36
    .jar mmap        4        0        4        0
    .apk mmap    49281     9980    38240        0
    .ttf mmap     1031        0      768        0
    .dex mmap    24272       16    24228        0
    .oat mmap     8604        0     3968        0
    .art mmap     3794     2224      588        2
   Other mmap     6361       20     6076        0
    GL mtrack   152964   152964        0        0
      Unknown    79528    79528        0        1
        TOTAL   886151   746744   129668       39   642760   513597   129161

 App Summary
                       Pss(KB)
                        ------
           Java Heap:    29140 //java 堆所占用的物理内存
         Native Heap:   455468 //native 堆所占用的物理内存
                Code:   138068
               Stack:     3844
            Graphics:   152964
       Private Other:    96928
              System:     9739
               //app进程中占有物理内存(等于uss+按比列的共享库物理内存)
               TOTAL:   886151       TOTAL SWAP PSS:       39

 Objects // 进程中关键对象情况 ,activity \binder 个数,可看内存泄漏
               Views:      166         ViewRootImpl:        2
         AppContexts:        5           Activities:        4
              Assets:        7        AssetManagers:        4
       Local Binders:       71        Proxy Binders:       40
       Parcel memory:       40         Parcel count:      155
    Death Recipients:        2      OpenSSL Sockets:        8

 SQL
         MEMORY_USED:     1092
  PAGECACHE_OVERFLOW:      342          MALLOC_SIZE:       79

 DATABASES //进程中数据库db 打开情况
      pgsz     dbsz   Lookaside(b)          cache  Dbname
         4       40            480      222/96/23  /data/user/0/com.minitech.miniworld.m4399/databases/pangle_com.byted.pangle_bd_embed_tea_agent.db
         4       24             31         2/20/3  /data/user/0/com.minitech.miniworld.m4399/databases/tracker.db
         4       52             91       21/29/12  /data/user/0/com.minitech.miniworld.m4399/databases/bugly_db_
         4       92            200     478/108/25  /data/user/0/com.minitech.miniworld.m4399/databases/pangle_com.byted.pangle_ttopensdk.db
         4       24             98         1/37/4  /data/user/0/com.minitech.miniworld.m4399/databases/pangle_com.byted.pangle_downloader.db
         4       20             17         0/30/3  /data/user/0/com.minitech.miniworld.m4399/databases/pangle_com.byted.pangle_npth_log.db
         4       16             41        13/21/6  /data/user/0/com.minitech.miniworld.m4399/files/MobSDK/comm/dbs/.dh

 Asset Allocations  //进程中asset 打开情况
    : 1K
    zip:/data/user/0/com.minitech.miniworld.m4399/files/pangle_p/com.byted.pangle/version-4908/apk/base-1.apk:/resources.arsc: 98K

一般情况下,仅需关注 Pss Total 和 Private Dirty 列。 在某些情况下,Private Clean 和 Heap Alloc 列提供的数据也值得关注。

接下来,详细分析下以上的数据:

查看java 堆内存使用
在这里插入图片描述
若是dalvik heap size 超过jvm 阀值(通常384M 或者512M)时,就会触发java heap 导致oom。

查看进程中pss 物理内存使用情况

  • Pss total : 占用的物理内存
  • Private Dirty: app进程死亡结束后,系统可回收的arm 物理内存
  • Private clean: 当前app进程中已被系统回收的arm 物理内存
    在这里插入图片描述
    若app 进程中pss 物理内存越来越大,系统中arm处理器的可用物理内存越来越少,直到可用物理内存不够分配时,就会触发oom。

查看内存泄漏

1.AppContexts 和 Activities和ViewRootImpl 表示当前 进程中context 个数和activity个数,根view视图(即phonewindow) 个数据,结合业务查看是否超过当前存在的个数,若是超过,则发生内存泄漏,被静态或者单例类所间接持有。
在java se 中被强引用的对象,是无法被回收的

更多adb shell dumpsys meminfo 详解:https://blog.51cto.com/u_4387387/6077172。

另外:/proc/pid/maps 和/proc/pid/smaps 通过adb shell 执行需要权限,暂时无法使用。
在这里插入图片描述

5.查看当前的手机系统内存情况:

执行adb shell cat /proc/meminfo ,可查看手机处理器内存 ,当前可用的内存
在这里插入图片描述
当MemAvailable 可用内存大小越来越少,直到耗尽就触发oom。

6.adb shell 获取内存快照hrop:

执行命令行:

adb shell am dumpheap package包名 /data/local/tmp/xxx.hprof

在这里插入图片描述
执行命令行,等待执行完。通过文件 浏览器或者studio的文件管理,找到该文件,双击打开,就可以查看到详细的内存快照。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【RabbitMQ】之消息的可靠性方案

目录 一、数据丢失场景二、数据可靠性方案 1、生产者丢失消息解决方案2、MQ 队列丢失消息解决方案3、消费者丢失消息解决方案 一、数据丢失场景 MQ 消息数据完整的链路为&#xff1a;从 Producer 发送消息到 RabbitMQ 服务器中&#xff0c;再由 Broker 服务的 Exchange 根据…

微服务项目,maven无法加载其他服务依赖

微服务项目&#xff0c;导入了工具类工程&#xff0c;但是一直报错&#xff0c;没有该类&#xff0c; 检查maven 这里的Maven的版本与idea版本不匹配可能是导致依赖加载失败的最重要原因 检查maven配置&#xff0c;我这是原来的maven&#xff0c;home 修改之后,就不报错了

python文件处理方式

python文件处理方式 file open(D:\pythonText.txt, r, encodingUTF-8) print(file) # <_io.TextIOWrapper nameD:\\pythonText.txt moder encodingUTF-8> print(type(file)) # <class _io.TextIOWrapper>读取文件 file open(D:\pythonText.txt, r, encodingU…

C#文件操作从入门到精通(2)——查看某个dll中有哪些函数

kernel32.dll中含有ini文件操作使用的函数,我们可以通过VisualStudio自带的dumpbin.exe查看dll所包含的函数,操作步骤如下: 1、找到dumpbin.exe所在的文件夹 我的电脑中安装了VisualStudio2019社区版以及VisualStudio2017Professional,但是我发现VisualStudio2019社区版中…

【Linux下6818开发板(ARM)】在液晶屏上显示RGB颜色和BMP图片

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

使用 CSS 自定义属性

我们常见的网站日夜间模式的变化&#xff0c;其实用到了 css 自定义属性。 CSS 自定义属性&#xff08;也称为 CSS 变量&#xff09;是一种在 CSS 中预定义和使用的变量。它们提供了一种简洁和灵活的方式来通过多个 CSS 规则共享相同的值&#xff0c;使得样式更易于维护和修改。…

PS - Photoshop 抠图与剪贴蒙版功能与 Stable Diffusion 重绘

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131978632 Photoshop 的剪贴蒙版是一种将上层图层的内容限制在下层图层的形状范围内的方法&#xff0c;也就是说&#xff0c;上层图层只能在下层图…

数据结构:谈快速排序的多种优化和非递归展开,以及排序思想归纳

文章目录 写在前面快速排序的基本体系快速排序的优化快速排序的非递归实现排序分类总结插入排序选择排序交换排序归并排序 写在前面 快速排序作为效率相当高的排序算法&#xff0c;除了对于特殊数据有其一定的局限性&#xff0c;在大多数应用场景中都有它特有的优势和应用&…

类加载机制与类加载器

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ Java 源码是如何形成类文件的&#xff0c;类文件又是如何加载到虚拟机的&#xff0c;类加载有哪些机制和原则呢&#xff1f;本文将为大家一一介绍。 1 Java 源码形成类文件…

1.Flink概述

1.1 技术架构 应用框架层: 在API层之上构建的满足特定应用场景的计算框架&#xff0c;总体上分为流计算和批处理两类应用框架。API 层&#xff1a; Flink对外提供能力的接口 &#xff0c;实现了面向流计算的DataStream API和面向批处理的DataSet API。运行时层&#xff1a;Flin…

No Spring环境Mybatis-Plus批量插入并返回主键的两种方式

批量插入,可以把Mybatis-Plus看作是Mybatis加强版;故Mybatis中的相关操作都可以在Mybatis-Plus中使用;在mysql数据库中支持批量插入&#xff0c;所以只要配置useGeneratedKeys和keyProperty就可以批量插入并返回主键了。 下面是批量插入的Dao层接口 一注解方式: 直接撸代码:…

SpringBoot —程序包org.springframework.boot.test.context不存在

一. 遇到问题 &#xff1a;程序包org.springframework.boot.test.context不存在 发生错误的原因是项目中缺少spring-boot-starter-test依赖导致的&#xff0c;解决方案如下: 在项目根目录的pom.xm文件中的<dependencies>节点下增加以下依赖即可&#xff1a; <depen…

网上办理的三网低月租大流量,到底能不能选归属地?

网上办理的三网低月租大流量&#xff0c;到底能不能选归属地&#xff1f; 首先&#xff0c;小编就明确地告诉大家&#xff0c;如果默认的是归属地随机&#xff0c;那么是不可以选择归属地的。 看到这里&#xff0c;可能有人会有疑问&#xff0c;网上的流量卡也是运营商推出的…

编程小白的自学笔记十二(python爬虫入门四Selenium的使用实例二)

系列文章目录 编程小白的自学笔记十一&#xff08;python爬虫入门三Selenium的使用实例详解&#xff09; 编程小白的自学笔记十&#xff08;python爬虫入门二实例代码详解&#xff09; 编程小白的自学笔记九&#xff08;python爬虫入门代码详解&#xff09; 目录 系列文章…

【Python】Web学习笔记_flask(1)——getpost

flask提供的request请求对象可以实现获取url或表单中的字段值 GET请求 从URL中获取name、age两个参数 from flask import Flask,url_for,redirect,requestappFlask(__name__)app.route(/) def index():namerequest.args.get(name)agerequest.args.get(age)messagef姓名:{nam…

Electron逆向调试

复杂程序处理方式&#xff1a; 复杂方式通过 调用窗口 添加命令行参数 启动允许调用&#xff0c;就可以实现调试发布环境的electron程序。 断点调试分析程序的走向&#xff0c;程序基本上会有混淆代码处理&#xff0c; 需要调整代码格式&#xff0c;处理程序。

32.选择器

选择器 html部分 <div class"toggle-container"><input type"checkbox" id"good" class"toggle"><label for"good" class"label"><div class"ball"></div></label&…

Spring学习笔记之spring概述

文章目录 Spring介绍Spring8大模块Spring特点 Spring介绍 Spring是一个轻量级的控制反转和面向切面的容器框架 Spring最初的出现是为了解决EJB臃肿的设计&#xff0c;以及难以测试等问题。 Spring为了简化开发而生&#xff0c;让程序员只需关注核心业务的实现&#xff0c;尽…

flutter 导出iOS问题2

问题1:The Swift pod FirebaseCoreInternal depends upon GoogleUtilities, which does not define modules. To opt into those targets generating module maps (which is necessary to import them from Swift when building as static libraries) 参考 正如上图报错第三方…

Mybatis中where 1=1 浅析

在一些集成mybatis的工程中经常看到where11 的代码&#xff0c;也有同事问我&#xff0c;这样写有什么用&#xff0c;下面对其进行简单的分析记录一下。 1、场景 看下面这样一段xml中的代码 <select id"queryBook" parameterType"com.platform.entity.Book…