Android性能优化---基础知识

进程的地址空间为0到4GB,示意图如下:


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

Heap空间的使用由程序员控制,程序员可以使用malloc、new、free、delete等函数调用来操作这片地址空间。Heap为程序完成各种复杂任务提供内存空间,所以空间比较大,一般为几百MB到几GB。

Android中的进程:

(1) native进程:采用C/C++实现,不包含dalvik实例的linux进程,/system/bin/目录下面的程序文件运行后都是以native进程形式存在的。/system/bin/surfaceflinger、/system/bin/rild、procrank等就是native进程。

(2) java进程:实例化了dalvik虚拟机实例的linux进程,进程的入口main函数为java函数。dalvik虚拟机实例的宿主进程是fork()系统调用创建的linux进程,所以每一个android上的java进程实际上就是一个linux进程,只是进程中多了一个dalvik虚拟机实例。因此,java进程的内存分配比native进程复杂。如图3,Android系统中的应用程序基本都是java进程,如Launcher、InCallUI、Contact、SystemUI等等。

Java process的结构:


VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)

PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

注意:dumpsys meminfo可以查看native进程和java进程,而procrank只能查看java进程。

PSS(Proportional Set Size),表示进程实际使用的物理内存,是由私有内存加上按比例分担计算的各进程共享内存得到的值。例如,如果有三个进程都使用了一个消耗30K内存的so库,那么每个进程在计算这部分PSS值的时候,只会计算10K。总的计算公式是:

Dalvik PSS内存 = 私有内存Private Dirty + (共享内存Shared Dirty / 共享的进程数)

从实际含义来讲,Private Dirty部分存放的是应用new出来的对象实例,是每个应用所独有的,不会再共享。Shared Dirty部分主要是zygote加载的Android框架部分,会被所有Android应用进程共享。通常进程数的值在10-50的范围内。

PSS是一个非常有用的数值,如果系统中所有的进程的PSS相加,所得和即为系统占用内存的总和。但要注意的是,进程的PSS并不代表进程结束后系统能够回收的内存大小。

1、 Native Heap

mallinfo是一个C库, mallinfo函数提供了各种各样的通过C的malloc()函数分配的内存的统计信息。

Naitve Heap Size: 从mallinfo usmblks获得,代表最大总共分配空间

Native Heap Alloc: 从mallinfo uorblks获得,总共分配空间

Native Heap Free: 从mallinfo fordblks获得,代表总共剩余空间

Native Heap Size 约等于Native Heap Alloc + Native Heap Free

native heap的增长并不受dalvik vm heapsize的限制。只要RAM有剩余空间,可以一直在native heap上申请空间。

2、 Dalvik Heap

和Java Heap概念相同,指java代码申请的内存。统计/dev/ashmem/dalvik-heap和/dev/ashmem/dalvik-zygote占用内存。

3、 Dalvik Other

其它以/dev/ashmem/dalvik-开头的内存区域归为Dalvik Other。

4、 Stack

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

5、 Ashmem

Ashmem对应所有/dev/ashmem/下不以dalvik-开头的内存区域

6、 Other dev

Other dev对应的是以/dev下其他的内存区域。

7、 mmap

文件的mmap按已知的几个扩展名分类,其余的归为other mmap。分为.so mmap, .apk mmap, .ttf mmap, .dex mmap, .oat mmap, .art mmap, other mmap. 应用的dex会占据较大的空间,并且随着代码增加使得dex文件变大,占用的内存也会增加。减小dex的(相当于减少代码)尺寸能够降低这部分内存占用,同时也会减少dalvik部分的内存。

8、 GL mtrack

GL mtrack is driver-reported GL memory usage. It's primarily the sum of GL texture sizes, GL command buffers, fixed global driver RAM overheads, etc.

GL mtrack是驱动程序报告GL内存使用情况。主要是GL texture大小、GL命令缓冲区、固定全局驱动器RAM开销等的总和。

9、 Unknown

Unknown

内存分析工具-showmap

1|root@mangosteen:/ # ps | grep videomeeting

u0_a60 7853 1708 1924376 134956 SySepoll 7fa364781c S com.xxxxxx.xxxx.videomeeting

root@mangosteen:/ # showmap -a 7853

显示内容很多,以下仅列举占用PSS较大的几项:


你可能感兴趣的:(Android性能优化---基础知识)