android内存占用分析,Android App性能评测分析-内存篇

本文深入探讨了Android应用的内存管理,包括进程的地址空间、堆栈分配、Android内存管理机制以及内存分类。重点讲解了Dalvik Heap和Native Heap,以及如何通过adb shell dumpsys meminfo命令查看内存占用。此外,文章还介绍了内存回收的Generational Heap Memory模型,并提供了内存测试方法,包括检测内存抖动、内存泄漏和内存溢出的工具和策略。最后,通过XX银行的性能评测案例分析了内存测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、内存了解

在Android App的性能优化的各个部分里,内存方面的知识较多且不易理解,内存的问题绝对是最令人头疼的一部分,需要对内存基础知识、内存分配、内存管理机制等非常熟悉,才能排查问题。

1.1 了解进程的地址空间

在32位操作系统中,进程的地址空间为0到4GB,这里主要说明一下Stack和Heap:

Stack空间(进栈和出栈):

由操作系统控制,其中主要存储函数地址、函数参数、局部变量等等,所以Stack空间不需要很大,一般为几MB大小。

Heap空间:

它的使用由程序员控制,程序员可以使用malloc、new、free、delete等函数调用来操作这片地址空间。Heap为程序完成各种复杂任务提供内存空间,所以空间比较大,一般为几百MB到几GB。正是因为Heap空间由程序员管理,所以容易出现使用不当导致严重问题。

e425e02c1eb4

进程地址空间-引用自CSDN.png

1.2 Android的内存管理

Android系统的ART和Dalvik虚拟机扮演了常规的内存垃圾自动回收的角色, 使用paging 和 memory-mapping来管理内存,这意味着不管是因为创建对象还是使用使用内存页面造成的任何被修改的内存,都会一直存在于内存中,App唯一释放内存的方法就是释放App持有的对象引用,使GC可以回收。

1.2.1 Android的应用进程按共享/私有分类如下:

首先来了解什么是共享内存

Android应用的进程都是从一个叫做Zygote的进程fork出来的。Zygote进程在系统启动并且载入通用的framework的代码与资源之后开始启动。为了启动一个新的程序进程,系统会fork Zygote进程生成一个新的进程,然后在新的进程中加载并运行应用程序的代码。这使得大多数的RAM pages被用来分配给framework的代码,同时使得RAM资源能够在应用的所有进程之间进行共享。

- 大多数static的数据被mmapped到一个进程中。这不仅仅使得同样的数据能够在进程间进行共享,而且使得它能够在需要的时候被paged out。常见的static数据包括Dalvik Code,app resources,so文件等。

- 大多数情况下,Android通过显式的分配共享内存区域(例如ashmem或者gralloc)来实现动态RAM区域能够在不同进程之间进行共享的机制。例如,Window Surface在App与Screen Compositor之间使用共享的内存,Cursor Buffers在Content Provider与Clients之间共享内存。

e425e02c1eb4

image.png

共享内存:Dalvik虚拟机代码、应用框架的代码、应用框架的资源

应用框架的SO库。

私有内存:应用的代码、应用的资源、应用的SO库

共享/私有内存:堆内存,其他部分

1.2.2 android进程中内存分类如下:

e425e02c1eb4

android进程中内存分类.png

native heap:是lib层C/C++库所占用的内存(Native代码分配的内存,虚拟机和Android框架本身也会分配),不包含dalvik实例的linux进程,/system/bin/目录下面的程序文件运行后都是以native进程形式存在的。

Dalvik heap:Dalvik虚拟机使用的内存,包含dalvik-heap和dalvik-zygote,堆内存,是java实例对象的空间

以上两个heap空间完全由程序员控制,是最主要的两块内存,另外还有下面3种:

Dalvik Other:类的数据结构和索引

so mmap:Native代码和常量

dex m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值