Android内存使用情况分析

简介: Android系统的内存由几个不同的内存池中的几个不同的分配器管理

Android系统的内存由几个不同的内存池中的几个不同的分配器管理。

目录:

  1. 系统内存
  2. 进程内存
    2.1 procrank
    2.2 smem tool
  3. Dalvik Heap
  4. 调试Android应用内存占用情况
    4.1 如何调试native进程内存分配情况
    4.2 libc.debug.malloc


系统内存


通过查看 /proc/meminfo,可以检查机器 上的内存视图。

如果使用DDMS,则可以查看机器,系统和不同执行进程使用的内存摘要。单击SysInfo选项卡,然后在窗格左上角的框中选择“Memory Usage”。


6.png

请注意,您可以通过将鼠标悬停在特定的饼图切片上来获取每个过程的数字。 数字以K和百分比显示。


进程内存


您可以通过检查/proc/<pid> / status来查看单个进程的内存使用情况

有关内存使用的详细信息

  • /proc/<pid>/statm
  • /proc/<pid>/maps
  • /proc/<pid>/smaps
    'top'命令将显示VSS和RSS。另请参阅上面的ddms信息。


procrank

procrank将向您显示进程内存利用率的快速摘要。 默认情况下,它显示Vss,Rss,Pss和Uss,并按Vss排序。 但是,您可以控制排序顺序。

procrank源包含在system/extras/procrank中,二进制文件位于android设备上的/system/ xbin中。

  • Vss = virtual set size--虚拟集大小
  • Rss = resident set size--常驻内存大小
  • Pss = proportional set size--比例集大小
  • Uss = unique set size--独占集大小
    通常,您要观看的两个数字是Pss和Uss(Vss和Rss通常毫无价值,因为它们不能准确反映进程对与其他进程共享的页面的使用情况。)对整体内存负载的影响。
  • Uss是进程独有的页面集。 这是当前终止应用程序时将释放的内存量。
  • Pss是与其他进程共享的内存量,其计算方式是在共享它的进程之间平均分配额度。 这是在进程终止时不会释放的内存,但表示此进程“贡献”的数量
    您还可以使用procrank查看每个进程的工作集大小,并重置工作集大小计数器。
    这是procrank的用法:

# procrank -h
Usage: procrank [ -W ] [ -v | -r | -p | -u | -h ]
    -v  Sort by VSS.
    -r  Sort by RSS.
    -p  Sort by PSS.
    -u  Sort by USS.
        (Default sort order is PSS.)
    -R  Reverse sort order (default is descending).
    -w  Display statistics for working set only.
    -W  Reset working set of all processes.
    -h  Display this help screen.

以下是一些示例输出:

# procrank
  PID      Vss      Rss      Pss      Uss  cmdline
 1217   36848K   35648K   17983K   13956K  system_server
 1276   32200K   32200K   14048K   10116K  android.process.acore
 1189   26920K   26920K    9293K    5500K  zygote
 1321   20328K   20328K    4743K    2344K  android.process.media
 1356   20360K   20360K    4621K    2148K  com.android.email
 1303   20184K   20184K    4381K    1724K  com.android.settings
 1271   19888K   19888K    4297K    1764K  com.android.inputmethod.latin
 1332   19560K   19560K    3993K    1620K  com.android.alarmclock
 1187    5068K    5068K    2119K    1476K  /system/bin/mediaserver
 1384     436K     436K     248K     236K  procrank
    1     212K     212K     200K     200K  /init
  753     572K     572K     171K     136K  /system/bin/rild
  748     340K     340K     163K     152K  /system/bin/sh
  751     388K     388K     156K     140K  /system/bin/vold
 1215     148K     148K     136K     136K  /sbin/adbd
  757     352K     352K     117K      92K  /system/bin/dbus-daemon
  760     404K     404K     104K      80K  /system/bin/keystore
  759     312K     312K     102K      88K  /system/bin/installd
  749     288K     288K      96K      84K  /system/bin/servicemanager
  752     244K     244K      71K      60K  /system/bin/debuggerd

在此示例中,它显示本机守护程序和普通程序比基于Dalvik的服务和程序小一个数量级。 此外,即使是最小的Dalvik程序也需要大约1.5兆(Uss)才能运行。


smem tool

您可以通过smem查看非常详细的每个进程或系统范围的内存信息。安卓smem用法


Dalvik Heap


Dalvik堆由zygote预加载类和数据(从Android 2.2版开始加载超过1900个类)。当zygote分支启动Android应用程序时,新应用程序将获得此堆的写入时拷贝映射,这有助于减少内存和应用程序启动时间。

像许多其他语言的虚拟机一样,Dalvik在堆上进行垃圾收集。 每个VM进程中似乎都有一个单独的线程(称为HeapWorker),用于执行垃圾回收操作。

Dan Borstein谈到堆共享:

它在Android中用于分摊与所有活动VM进程中的公共库类相关联的大量有效只读数据(技术上可写但很少实际编写)的RAM占用空间。 系统在启动时预加载1000多个类,每个类至少消耗一小堆自身,包括经常指向其他对象的宿。 由预加载过程创建的堆与每个生成的VM进程共享写入时拷贝(但实际上并没有写得太多)。 这为每个进程节省了数百KB的"脏"的不可分页RAM,并且还有助于加速进程启动。

请参阅Dianne Hackborn的精彩文章调试Android应用程序内存使用情况


如何调试native进程内存分配情况

setprop dalvik.vm.checkjni true
setprop libc.debug.malloc 10   
setprop setprop dalvik.vm.jniopts forcecopy
start
stop


libc.debug.malloc

系统中的C库(仿生)支持在系统运行时使用malloc代码的不同调试版本的能力。

如果系统属性libc.debug.malloc的值不是0,那么在实例化进程时,C库将使用函数为该进程分配和释放内存。

(请注意,还有其他方法可以使用调试共享库malloc代码。也就是说,如果您在模拟器中运行,并且系统属性ro.kernel.memcheck的值不是'0', 然后你得到20的调试级别。注意,调试级别20只能在模拟器中使用。)

默认情况下,使用标准的malloc / free / calloc / realloc / memalign例程。 通过设置libc.debug.malloc,可以使用不同的例程来检查某些类型的内存错误(例如泄漏和溢出)。 这是通过使用这些不同的例程加载单独的共享库(.so)来完成的。

共享库的名称为:/system/lib/libc_malloc_debug_leak.so和/system/lib/libc_malloc_debug_qemu.so

(通过查看<android-source-root> /bionic/libc/bionic/malloc_debug_common.c获得信息)

libc.debug.malloc(调试级别值)支持的值为:

  • 1 - 执行泄漏检测
  • 5 - 填充分配的内存以检测溢出
  • 10 - 填充内存并添加标记以检测溢出
  • 20 - 为模拟器使用特殊的检测malloc / free例程
    但我不确定这些共享库是否在生产设备中提供。
目录
相关文章
|
7月前
|
设计模式 缓存 Java
【JUC】(4)从JMM内存模型的角度来分析CAS并发性问题
本篇文章将从JMM内存模型的角度来分析CAS并发性问题; 内容包含:介绍JMM、CAS、balking犹豫模式、二次检查锁、指令重排问题
196 1
|
10月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
724 4
AI代理内存消耗过大?9种优化策略对比分析
|
11月前
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
687 3
|
12月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
460 1
|
Java 编译器 Go
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
275 2
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
138 4
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
1147 38
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
281 8
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
629 1
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
710 159