【Android性能优化】内存优化前置知识剖析

本文详细介绍了Android内存优化的基础知识,包括内存核心指标VSS、RSS、PSS和USS的解析,以及adb shell相关命令如getprop、dumpsys和wm的使用。此外,还涉及内存分析命令如dumpsys meminfo和vmstat,以及本地检测工具top的运用。文章旨在建立Android内存优化的知识框架,为后续深入研究打下基础。
摘要由CSDN通过智能技术生成

前言

内存优化作为Android性能优化中非常重要的一环,这篇blog主要记录了跟内存优化相关的重要命令、核心指标、相关原理的解析。作为前置知识,起到奠基的作用。阅读完本篇内容,你将对于Android的内存优化有个大致的知识框架。更加详细的解析,会在后续blog中更新。

内存核心指标

Android有一个名为procrank(/system/xbin/procrank)的工具,它按照从最高到最低的顺序列出Linux进程的内存使用情况。报告的大小包括VSS、RSS、PSS和USS等。
为了简化描述,内存将以页面而不是字节的形式表示。我们的Linux系统在最低级别以4096字节的页面管理内存。

总体而言他们的定义如下:
在这里插入图片描述

VSS(Virtual Set Size)

虚拟耗用的内存(包含与其他进程共享占用的虚拟内存)。

VSS是进程的总可访问地址空间。该大小还包括可能尚未写入的内存,例如已分配但尚未写入的malloc。VSS对于确定进程的真实内存使用几乎没有用处。

RSS(Resident Set Size )

实际使用的物理内存(包含与其他进程共享占用的内存)

RSS表示一个进程在RAM中实际拥有的总内存。RSS可能具有误导性,因为它包括了该进程与其他进程共享的实际物理内存使用量,例如,对于共享库,其往往只加载到内存中一次,而不管有多少进程使用它。RSS不能准确地表示单个进程的内存使用情况。

PSS(Proportional Set Size)

实际使用的物理内存(按比例包含与其他进程共享占用的内存)

PSS与RSS不同之处是,对于进程间共享的内存,其按比例报告其所使用的共享物理内存大小。

比如有n个进程同时在使用一个共享库,那对于单个进程,其占用的该共享库的内存为1/n。如果三个进程都使用一个有30页的共享库,那么这个库将只向每个进程报告的PSS贡献10页。

PSS是一个非常有用的数字,因为当系统中所有进程的PSS加在一起时,就可以很好地表示系统中总的内存使用量。

当一个进程被终止时,贡献给它的PSS的共享库将按比例分配给仍然使用该库的其他进程的PSS总数。这样,PSS可能有点误导人,因为当进程被终止时,PSS不能准确地表示返回到整个系统的内存。

PSS和RSS的区别

PSS与RSS不同之处在于,它报告了其共享库的比例大小。例如,如果三个进程都使用一个有30页的共享库,那么该库将只为每个进程报告的PSS贡献10页。

USS (Unique Set Size)

进程独自占用的物理内存(不包含与其他进程共享占用的内存)

USS表示进程占用的总的物理的存大小,也就是说这部分内存是该进程完全独占的。USS是一个非常有用的数字,因为它表示运行特定进程的实际增量成本。当进程被终止时,USS是实际返回给条统的总内存。

当最初怀疑某个进程存在内存泄漏时,USS是最好的监视数字。

Python有个很好的工具叫做smem,它可以输出包括所有这些类别的内存统计信息。

对于单个进程,一般来说内存占用大小排序如下:VSS>=RSS>=PSS >= USS

adb shell

adb shell getprop ro.product.model

获取设备型号

adb shell dumpsys battery

获取设备电池信息

Current Battery Service state:
  AC powered: false
  USB powered: true
  Wireless powered: false
  Max charging current: 0
  Max charging voltage: 0
  Charge counter: 4120000
  status: 4
  health: 2
  present: true
  level: 80
  scale: 100
  voltage: 3978
  temperature: 380
  technology: Li-ion

adb shell wm size

物理屏幕分辨率

Physical size: 600x1024

adb shell wm density

屏幕像素密度

Physical density: 240

adb shell dumpsys window displays

日志太长,影响篇幅,就不贴上来了。这个命令总体可以提供的信息有:

  • 屏幕分辨率和密度。
  • 显示的屏幕方向。
  • 系统中所有窗口的状态,包括它们的标识符、大小、位置等。
  • 当前活动窗口和焦点窗口的信息。
  • 显示器的物理尺寸和显示密度。
  • 前台应用程序的详细信息。

adb shell cat /proc/cpuinfo

提供cpu的信息

参考:https://developer.android.com/tools/adb?hl=zh-cn

内存分析命令

cat /system/build.prop

这个命令,我在实际运行的时候,被拒绝了。也许是需要root权限。

它能提供的信息:
设备的型号和制造商。
Android 系统的版本号。
系统的构建日期和时间戳。
系统的一些配置参数,比如默认语言、地区、时区等。
硬件配置信息,如屏幕密度、处理器架构、内存大小等。

dumpsys meminfo:

这个命令用于在Android系统中获取内存信息。它提供了有关系统中内存使用情况的详细信息,包括各个进程的内存使用情况、缓存和缓冲区的使用情况等。通过分析这些信息,可以了解系统中内存的分配情况,以及可能存在的内存泄漏或性能问题。

Q10A:/ $ dumpsys meminfo
Applications Memory Usage (in Kilobytes):
Uptime: 126311204 Realtime: 126311204

Total PSS by process:
     80,347K: system (pid 2353)
     51,351K: com.android.systemui (pid 2606 / activities)
     39,563K: com.pax.usbcommdemo (pid 3989 / activities)
     34,159K: com.pax.security (pid 5104 / activities)
     31,535K: com.android.launcher3 (pid 2887 / activities)
     25,687K: com.android.settings (pid 2723)
     23,025K: zygote (pid 2054)
     22,616K: com.pax.daemon (pid 3118)
     15,588K: surfaceflinger (pid 2081)
     13,907K: com.android.inputmethod.latin (pid 2847)
     10,608K: android.process.media (pid 3261)
     10,300K: media.swcodec (pid 2147)
      9,541K: com.paxdroid.osmanager (pid 3139)
      9,423K: com.android.permissioncontroller (pid 3741)
      9,037K: com.android.traceur (pid 3777)
      8,934K: audioserver (pid 2078)
      8,749K: com.pax.ipp.neptune (pid 3652)
      8,362K: com.paxdroid.verify (pid 2789)
      8,357K: com.android.managedprovisioning (pid 3673)
      8,178K: mediaserver (pid 2136)
      7,869K: com.pax.rki (pid 3310)
      7,479K: com.android.keychain (pid 3375)
      7,309K: com.android.packageinstaller (pid 3719)
      7,303K: media.codec (pid 2140
  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林树杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值