且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

移动App性能测评与优化1.4.1 从物理内存到应用

更新时间:2022-07-06 04:38:25

1.4.1 从物理内存到应用

我们首先要了解系统的内存机制,搞清楚物理内存是如何被分配到各个进程的,以及共享内存的机制,等等,理解这些机制对测试及优化都会有很大帮助。

根据Google提供的Android整体架构图,如图1-17所示,可以看到Android系统是基于Linux内核的,因此底层的内存分配及共享机制与Linux基本相同。但由于Android是为移动设备设计的,所以整套架构为了符合移动设备的特性,需要有较低的内存及能耗需求。因此Android只使用了Linux内核,不使用传统Linux系统的组件。这些组件虽然功能强大,但是较为消耗系统资源。Google开发了若干较小的组件,例如将庞大的glibc换为bionic库,使用SQLite数据库等。Android还扩充了许多内核机制和实现,其中对内存影响较大的是Ashmem和Binder机制。

在Ashmem及COW(Copy-On-Write)机制的基础上,Android进程最明显的内存特征是与zygote共享内存。为了加快启动速度及节约内存,Android应用的进程都是由zygote fork出来的。由于zygote已经载入了完整的Dalvik虚拟机和Android 应用框架的代码,fork出的进程和zygote共享同一块内存,这样就节约了每个进程单独载入的时间和内存。应用进程只需载入自己的Dalvik字节码及资源就可以开始工作。

 

 

 

图1-17 Android架构图

综上所述,一个在运行的Android应用进程会包含以下几个部分:

Dalvik虚拟机代码(共享内存)

应用框架的代码(共享内存)

应用框架的资源(共享内存)

应用框架的so库(共享内存)

应用的代码(私有内存)

应用的资源(私有内存)

应用的so库(私有内存)

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

有了整体视角后,我们再开始深入观察某一个应用的内存情况。在之前的测试中,我们使用系统提供的dumpsys meminfo工具来观察内存值。它能够将不同的内存消耗分类统计,输出成便于查看的格式。

但如果我们想细致地研究各部分内存的由来,只靠这个工具是不够的,我们有必要按照系统划分各部分的方式来理解和分析内存。

通过阅读和分析dumpsys meminfo的代码,我们能够了解到Android是如何划分各部分内存的。下面详细讲解dumpsys meminfo工具是如何统计各部分内存值的。