Android内存解析—从Linux系统内存逐步认识Android应用内存

Posted brave-sailor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android内存解析—从Linux系统内存逐步认识Android应用内存相关的知识,希望对你有一定的参考价值。

总述

Android应用程序被限制了内存使用上限,一般为16M或24M(具体看系统设置),当应用的使用内存超过这个上限时,就会被系统认为内存泄漏,被kill掉。所以在android开发时,管理好内存的分配及使用十分重要,而首先要做的应是认识内存。

这篇文章便是从Linux的系统内存划分开始,逐步介绍至android应用的内存划分。



一 硬件上看内存划分


从硬件上看,内存分为两个部分:物理内存和SWAP区。

SWAP区就是Linux下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用。其中物理内存是linux运行时的主要使用区域。

如下图:


二 Linux系统上看内存划分


从Linux系统上看,内存分为三个部分:BIN区,内核内存和用户内存。

BIN区属于引导系统所用,内核内存是Linux本身进行程序调度、内存分配等逻辑处理时使用的,用户内存就是分配给应用进程使用的内存了。

如下图:

对于Android应用来说,每个应用拥有独立的进程和Dalvik虚拟机,初始分配的虚拟内存空间是大小相同的,在实际使用时才会被分配物理内存。


二 进程上看内存划分


从进程上看,也就是从Android应用(单进程应用)上看,内存管理采用了两种数据结构:堆和栈,各自又划分了不同功能区。

如下图:




1.Dalvik和Native的堆栈

Dalvik内存为Java程序使用,Native内存为C类程序使用,两者均使用到堆栈内存,但各自独立互不干扰。 不过两者使用堆栈的功能相似,如下表所示:

 

                 
                      堆              
                      栈             
  非静态非基本数据类型数据    指令语句
   非静态基本数据类型数据
   堆中数据的引用

                  

概括说,程序不论C类还是Java均可分为数据和指令语句(就是那一行行代码):对数据,不论是所属类还是所属方法,只要是基本数据类型就存放于栈中,而复杂的非基本数据类型变量则存放于堆中,静态类型则存放在方法区的静态区中,也为堆结构;对指令语句来说,均存放于栈中。

由此可见堆是一个运行时的数据区,在运行时动态分配内存,所以相较于栈,堆的存取速度慢。


2.方法区

方法区存储Java虚拟机加载进来的信息,常量池还有静态区其实是方法区的一部分,其中常量池存储基本数据类型常量和非基本数据类型常量的引用,静态区存储的就是静态变量了。


3.程序计数器
程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器。字节码解释器在工作时,会通过改变这个计数器的值来取下一条语句指令。


最后

这就是内存认识篇了,下一篇详解Android内存目录。




参考

http://www.cnblogs.com/zhguang/p/3257367.html#introduction

http://schy-hqh.iteye.com/blog/1948912

以上是关于Android内存解析—从Linux系统内存逐步认识Android应用内存的主要内容,如果未能解决你的问题,请参考以下文章

安卓Android的内存管理原理解析

Android系统内存管理

RK3399平台开发系列讲解(内存篇)18.10/proc/meminfo 解析

IBM X3650 原有四根1G内存,现在加了两根4G的,怎么认不出来啊?

Linux内存初始化 创建系统内存地址映射

Android性能优化解析-内存抖动 附:《Android性能优化指南》