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

1、内存了解

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

1.1 了解进程的地址空间

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

Stack空间(进栈和出栈):

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

Heap空间:

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

进程地址空间-引用自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之间共享内存。

image.png

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

应用框架的SO库。

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

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

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

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 mmap:Jav

你可能感兴趣的:(android内存占用分析)