android 开发内存管理,Android点滴——Dalvik虚拟机中内存管理

看论文就要从论文中有所收获。

现在看一篇关于安卓应用内部权限分离机制的论文,其中提到了dalvik虚拟机中的stack

inspection,但对dalvik虚拟机并不是很熟悉,打算一步步补充学习下。

今天先来学习一下内存管理之堆与栈——heap &

stack。​

其实堆栈在以前大二时学习数据结构就学了,但当时感觉掌握地并不好。​

先来回顾下数据结构中的知识:

堆,栈都是一种数据项按序排列的数据结构,且只能在一端进行插入和删除。

堆被看成一颗树;栈是一种先进后出的数据结构。​

c/c++空间分配情况:

堆:程序员分配释放,分配类似于列表;若不释放则结束时可能由系统回收​。在二级缓存中,生命周期由虚拟机的垃圾回收算法决定。

栈:系统自动分配释放,存函数的参数值,局部变量等。在一级缓存中,调用完立即释放。​

java中:

堆​和栈由java自动管理,程序员不能直接设置。

栈的存取速度快于堆;但存储的数据的生存期是确定的;且在多个线程或多个栈间不可共享,但内部多个值相等的变量可以指向相同的地址[当仅仅是字面值引用时,则修改一个引用时,另一个的字面值是不变的,但如果是类对象的应用指向同一个对象,则一个引用变量修改了对象内部状态时,另一个对象的引用变量也会变化。因对于字面值的改变,编译器会重新找是否有地址是该字面值,不是的话则会重新开辟地址空间。]。(区别创建引用和创建对象:

创建引用:String str1 = "abc";创建对象:String str2 = new

String("abc"),通过new创建的对象会在堆中创建,而字符串是单独存值的,不会共享。)

堆可以动态分配大小,故存取速度较慢;生存期由java垃圾回收器决定。

说到内存管理,核心就是分配和回收。java使用new操作符来分配,但没提供释放内存的操作,而是通过垃圾收集来回收内存。​

那么在安卓dalvik虚拟机中情况是这样的呢?

先来认识下dalvik虚拟机。​

dalvik是基于apache

harmony的部分实现的,提供了一套库——上层java程序编写所使用的api。工作大体流程:应用经过dx工具将class文件转换为dalvik可执行的dex文件,然后类加载器加载原生类和java类,加载完成后由解释器根据指令集对dalvik字节码进行解释,执行。​

首先dalvik和java虚拟机是有区别的:大多数java虚拟机是基于栈结构的,但dalvik虚拟机是基于寄存器。前者指令紧凑,只占一个字节,成为字节码;后者由于是寄存器指令,需要寻找源/目标地址,指令占用空间多。一般地,执行同样的功能,前者指令需求多,因而占cpu时间多,后者空间需求多,因而数据缓存易失效。

此外,虚拟机可识别的文件结构也不同:

java中是.jar->.class

Dalvik是.apk->.dex,dex文件使用共享的,特定类型的常量池(存储类中的所有字面常量-字符串常量,字段常量等)节省内存。​

Dalvik虚拟机具有以下特点:

使用dex格式的字节码,不兼容Java字节码格式​,代码密度小,运行效率高,节省资源,常量池只使用32位的索引,有内存限制,默认栈大小是12KB(3个页,每页4KB),堆默认启动大小为2MB,默认最大值为16MB,堆支持的最小启动大小为1MB,支持的最大值为1024MB,堆和栈参数可以通过-Xms和-Xmx修改。

​下面看内存管理之——java对象内存分配:

所有对象​都包含clazz和lock,前者指向该对象的类对象,这样就可以从一个对象获得该对象所属的类的具体信息,后者是一个无符号整数,实现对象同步。另外还有该对象的data区,大小随对象而定。布局如下:

a4c26d1e5885305701be709a3d33442f.png

那么dalvik中堆栈如何?

堆是分配的一块​连续的虚拟内存,有起始地址和最大地址,大小是根据-xmx选项设定。

在dalvik中,通过底层的bionic

C库的malloc/free操作来分配/释放。在分配时会进行尝试,若失败,则进行垃圾收集并再次分配。

dalvik虚拟机线程实际有两个栈,一个java栈,另一个是native栈。​​后者是调用native代码时使用的,由os管理,而前者是dalvik虚拟机管理的。当解释器在执行java代码时,每遇到函数调用指令,就会在当前线程的java栈上创建一个帧,来保存当前函数执行状态,以保证正确返回。

先写到这里。.​

[注]参考:

http://www.phplearn.cn/tshare/info_65138.html​

http://www.miui.com/thread-74715-1-1.html​

http://shyluo.blog.51cto.com/5725845/1229256​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值