博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android性能优化---基础知识
阅读量:6878 次
发布时间:2019-06-26

本文共 2679 字,大约阅读时间需要 8 分钟。

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

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

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的结构:

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

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性能优化---基础知识

转载于:https://blog.51cto.com/14348552/2403181

你可能感兴趣的文章
前端UI框架总结
查看>>
Atom 初识
查看>>
通向架构师的道路(第一天)之Apache整合Tomcat - lifetragedy的专栏 - 博客频道 - CSDN.NET...
查看>>
Javascript创建对象的7种模式
查看>>
Shell工作笔记01
查看>>
项目、软件开发过程中版本术语
查看>>
CSS实现背景透明,文字不透明(各浏览器兼容)
查看>>
【转】[大学引导]超级链接、字体颜色、音乐播放公式
查看>>
T-SQL中INSERT、UPDATE
查看>>
Linux下Nginx服务器配置Modsecurity实现Web应用防护系统
查看>>
用 zabbix 监测 snmptrap 的主动告警功能
查看>>
HDU1717 小数化分数2
查看>>
delphi 导入excel
查看>>
Linux下 FTP 常见错误 500 530等错误解决方法
查看>>
oracle asm
查看>>
VC基于单文档opengl框架
查看>>
openSUSE13.2安装ruby和rails
查看>>
python 高级函数
查看>>
F.Cards with Numbers
查看>>
简单入门Buffer
查看>>