总述

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

从Linux系统内存逐步认识Android应用内存的更多相关文章

  1. Linux系统的负载与CPU、内存、硬盘、用户数监控的shell脚本

    利用Shell脚本来监控Linux系统的负载.CPU.内存.硬盘.用户登录数. 这几天在学习研究shell脚本,写的一些系统负载.CPU.内存.硬盘.用户数监控脚本程序.在没有nagios监控的情况下 ...

  2. Android内存解析(一)—从Linux系统内存逐步认识Android应用内存

    总述 Android应用程序被限制了内存使用上限,一般为16M或24M(具体看系统设置),当应用的使用内存超过这个上限时,就会被系统认为内存泄漏,被kill掉.所以在android开发时,管理好内存的 ...

  3. Linux系统、版本、CPU、内存查看、硬盘空间

    查看系统版本:lsb_release -a [root@localhost /]# lsb_release -a LSB Version:    :core-4.0-amd64:core-4.0-no ...

  4. linux 系统的负载与CPU、内存、硬盘、用户数监控脚本[marked]

    转载文章 原始出处  在没有nagios监控的情况下,只要服务器能上互联网,就可通过发邮件的方式来提醒管理员系统资源的使用情况. 一.编写linux系统告警邮件脚本 # vim /scripts/sy ...

  5. Linux系统性能测试工具(三)——内存性能综合测试工具lmbench

    本文介绍关于Linux系统(适用于centos/ubuntu等)的内存性能综合测试工具-lmbench.内存性能测试工具包括: 内存带宽测试工具——mbw: 内存压力测试工具——memtester: ...

  6. Linux系统性能测试工具(二)——内存压力测试工具memtester

    本文介绍关于Linux系统(适用于centos/ubuntu等)的内存压力测试工具-memtester.内存性能测试工具包括: 内存带宽测试工具——mbw: 内存压力测试工具——memtester: ...

  7. Linux系统性能测试工具(一)——内存带宽测试工具mbw

    本文介绍关于Linux系统(适用于centos/ubuntu等)的内存带宽测试工具-mbw.内存性能测试工具包括: 内存带宽测试工具——mbw: 内存压力测试工具——memtester: 内存综合性能 ...

  8. 正确计算linux系统内存使用率

    参考:https://blog.gesha.net/archives/406/ 图中的例子很典型,就是:多数的linux系统在free命令后会发现free(剩余)的内存很少,而自己又没有开过多的程序或 ...

  9. Cache占用过多内存导致Linux系统内存不足问题排查

    问题描述 Linux服务器内存使用量超过阈值,触发报警. 问题排查 首先,通过free命令观察系统的内存使用情况,显示如下: total used free shared buffers cached ...

随机推荐

  1. Number(), parseInt(), parseFloat()

    var n="100.11px";console.log(Number(n));//NaNconsole.log(parseInt(n));//100console.log(par ...

  2. 开源 PHP 项目找队友、顾问、指导、贡献者等等

    介绍站点还没做,先直接甩代码链接了 https://github.com/litphp/litphp Lit是什么? Lit是我一直在撸的个人框架,按第一次上传代码来说历史 超过4年 了,从还能支持P ...

  3. poj1284 && caioj 1159 欧拉函数1:原根

    这道题不知道这个定理很难做出来. 除非暴力找规律. 我原本找的时候出了问题 暴力找出的从13及以上的答案就有问题了 因为13的12次方会溢出 那么该怎么做? 快速幂派上用场. 把前几个素数的答案找出来 ...

  4. Spring 整合Shiro:记住我

    1.登录方法 /** * 执行登录操作 * * @param username * @param password * @param rememberMe * @param model * @retu ...

  5. solr启动时报错org.apache.solr.common.SolrException: undefined field text的解决办法

    solr启动时报错org.apache.solr.common.SolrException: undefined field text的解决办法 原创 2015年08月21日 20:47:40 标签: ...

  6. MS ACCESS MID函数

    select * from GongCheng where MID(GCWYBH,3,8)='" + time.Date.ToString("yyyyMMdd") + & ...

  7. php持续集成环境笔记

    记录下php集成环境中若干个工具的安装步骤和过程: 安装pear wget http://pear.php.net/go-pear.phar $ php go-pear.phar 使用:pear in ...

  8. Memcached 集群环境Java客户端

    Memcached 集群环境Java客户端 学习了: http://blog.csdn.net/zhouzhiwengang/article/details/53154112 http://guazi ...

  9. [Angular] Short Imports with TypeScript Path Mapping

    The idea is change from: import {CoreModule} from '../core/core.module'; to: import {CoreModule} fro ...

  10. 直接插入排序(Straight Insertion Sort)

    直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. /* 对顺序表L作直接插入排序 */ void ...