从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.程序计数器
程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器。字节码解释器在工作时,会通过改变这个计数器的值来取下一条语句指令。
从Linux系统内存逐步认识Android应用内存的更多相关文章
- Linux系统的负载与CPU、内存、硬盘、用户数监控的shell脚本
利用Shell脚本来监控Linux系统的负载.CPU.内存.硬盘.用户登录数. 这几天在学习研究shell脚本,写的一些系统负载.CPU.内存.硬盘.用户数监控脚本程序.在没有nagios监控的情况下 ...
- Android内存解析(一)—从Linux系统内存逐步认识Android应用内存
总述 Android应用程序被限制了内存使用上限,一般为16M或24M(具体看系统设置),当应用的使用内存超过这个上限时,就会被系统认为内存泄漏,被kill掉.所以在android开发时,管理好内存的 ...
- Linux系统、版本、CPU、内存查看、硬盘空间
查看系统版本:lsb_release -a [root@localhost /]# lsb_release -a LSB Version: :core-4.0-amd64:core-4.0-no ...
- linux 系统的负载与CPU、内存、硬盘、用户数监控脚本[marked]
转载文章 原始出处 在没有nagios监控的情况下,只要服务器能上互联网,就可通过发邮件的方式来提醒管理员系统资源的使用情况. 一.编写linux系统告警邮件脚本 # vim /scripts/sy ...
- Linux系统性能测试工具(三)——内存性能综合测试工具lmbench
本文介绍关于Linux系统(适用于centos/ubuntu等)的内存性能综合测试工具-lmbench.内存性能测试工具包括: 内存带宽测试工具——mbw: 内存压力测试工具——memtester: ...
- Linux系统性能测试工具(二)——内存压力测试工具memtester
本文介绍关于Linux系统(适用于centos/ubuntu等)的内存压力测试工具-memtester.内存性能测试工具包括: 内存带宽测试工具——mbw: 内存压力测试工具——memtester: ...
- Linux系统性能测试工具(一)——内存带宽测试工具mbw
本文介绍关于Linux系统(适用于centos/ubuntu等)的内存带宽测试工具-mbw.内存性能测试工具包括: 内存带宽测试工具——mbw: 内存压力测试工具——memtester: 内存综合性能 ...
- 正确计算linux系统内存使用率
参考:https://blog.gesha.net/archives/406/ 图中的例子很典型,就是:多数的linux系统在free命令后会发现free(剩余)的内存很少,而自己又没有开过多的程序或 ...
- Cache占用过多内存导致Linux系统内存不足问题排查
问题描述 Linux服务器内存使用量超过阈值,触发报警. 问题排查 首先,通过free命令观察系统的内存使用情况,显示如下: total used free shared buffers cached ...
随机推荐
- Number(), parseInt(), parseFloat()
var n="100.11px";console.log(Number(n));//NaNconsole.log(parseInt(n));//100console.log(par ...
- 开源 PHP 项目找队友、顾问、指导、贡献者等等
介绍站点还没做,先直接甩代码链接了 https://github.com/litphp/litphp Lit是什么? Lit是我一直在撸的个人框架,按第一次上传代码来说历史 超过4年 了,从还能支持P ...
- poj1284 && caioj 1159 欧拉函数1:原根
这道题不知道这个定理很难做出来. 除非暴力找规律. 我原本找的时候出了问题 暴力找出的从13及以上的答案就有问题了 因为13的12次方会溢出 那么该怎么做? 快速幂派上用场. 把前几个素数的答案找出来 ...
- Spring 整合Shiro:记住我
1.登录方法 /** * 执行登录操作 * * @param username * @param password * @param rememberMe * @param model * @retu ...
- solr启动时报错org.apache.solr.common.SolrException: undefined field text的解决办法
solr启动时报错org.apache.solr.common.SolrException: undefined field text的解决办法 原创 2015年08月21日 20:47:40 标签: ...
- MS ACCESS MID函数
select * from GongCheng where MID(GCWYBH,3,8)='" + time.Date.ToString("yyyyMMdd") + & ...
- php持续集成环境笔记
记录下php集成环境中若干个工具的安装步骤和过程: 安装pear wget http://pear.php.net/go-pear.phar $ php go-pear.phar 使用:pear in ...
- Memcached 集群环境Java客户端
Memcached 集群环境Java客户端 学习了: http://blog.csdn.net/zhouzhiwengang/article/details/53154112 http://guazi ...
- [Angular] Short Imports with TypeScript Path Mapping
The idea is change from: import {CoreModule} from '../core/core.module'; to: import {CoreModule} fro ...
- 直接插入排序(Straight Insertion Sort)
直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. /* 对顺序表L作直接插入排序 */ void ...