总述

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. 字符串的格式化(转自武sir)

    百分号s方式: (name)      可选,用于选择指定的key flags          可选,可供选择的值有: +       右对齐:正数前加正好,负数前加负号: -        左对齐 ...

  2. [SCOI2016]美味(可持久化线段树)

    可持久化trie树?好像和可持久化权值线段树差不多.. 如果这题没有那个\(x[i]\)这题就是一个裸的可持久化trie树. 仔细想想,多了这个\(x[i]\)之后有什么影响? 就是我们查询区间的时候 ...

  3. 紫书 习题 8-22 UVa 1622 (构造法)

    这道题的构造法真的复杂--要推一堆公式--这道题写了几天了--还是没写出来-- 一开始简单的觉得先左右来回, 然后上下来回, 然后把剩下的执行完了好了, 然后就WA. 然后换了个思路, 觉得是贪心, ...

  4. 【codeforces 816C】Karen and Game

    [题目链接]:http://codeforces.com/contest/816/problem/C [题意] 给你一个n*m的矩阵; 一开始所有数字都是0; 每次操作,你能把某一行,或某一列的数字全 ...

  5. ZOJ 2601 Warehouse Keeper

    Warehouse Keeper Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Origin ...

  6. 如何检查 Android 应用的内存使用情况

    Android是为移动设备而设计的,所以应该关注应用的内存使用情况.尽管Android的Dalvik虚拟机会定期执行垃圾回收操作,但这也不意味着就可以忽视应用在何时何处进行内存分配和释放.为了提供良好 ...

  7. 我是怎么利用微信做兼职月入1W的

    物价上涨.导致非常多人都感觉如今的收入入不敷出,有的是迫于生活压力.有的是为了提高生活质量,等等都想好好利用业余时间来做点兼职,当然我也不例外.正好笔者在微信刚推出一段时间的时候利用微信来做点兼职赚点 ...

  8. poj-2758 Checking the Text

    题意: 给定一个字符串,要求维护两种操作: I:在字符串中插入一个字符: Q:询问某两个位置開始的LCP. 插入操作<=200,字符串长度<=5w,查询操作<=2w: 题解: 第一道 ...

  9. bzoj1029: [JSOI2007]建筑抢修(堆+贪心)

    1029: [JSOI2007]建筑抢修 题目:传送门 题解: 一道以前就做过的水题(找个水题签个到嘛...) 很明显就是一道贪心题,这里我们用一个堆来维护 具体看代码吧,很容易YY所以不讲 代码: ...

  10. django 笔记9 分页知识整理

    感谢老男孩 自定义分页 XSS:攻击 默认字符串返回 {{page_str|safe}} 前端 from django.utils.safestring import mark_safe page_s ...