Android之内存机制分析-Android堆和栈
来源:互联网 发布:银行承兑汇票 知乎 编辑:程序博客网 时间:2024/06/08 02:37
1、dalvik的Heap和Stack
这里说的只是dalvik java部分的内存,实际上除了dalvik部分,还有native。这个以后再说。
下面针对上面列出的数据类型进行说明,只有了解了我们申请的数据在哪里,才能更好掌控我们自己的程序。
2、对象实例数据
实际上是保存对象实例的属性,属性的类型和对象本身的类型标记等,但是不保存实例的方法。实例的方法是属于数据指令,是保存在Stack里面,也就是上面表格里面的类方法。
对象实例在Heap中分配好以后,会在stack中保存一个4字节的Heap内存地址,用来查找对象的实例。因为在Stack里面会用到Heap的实例,特别是调用实例的时候需要传入一个this指针。
3、方法内部变量
类方法的内部变量分为两种情况:简单类型保存在Stack中;对象类型在Stack中保存地址,在Heap 中保存值。
4、非静态方法和静态方法
非静态方法有一个隐含的传入参数,这个参数是dalvik虚拟机传进去的,这个隐含参数就是对象实例在Stack中的地址指针。因此非静态方法(在Stack中的指令代码)总是可以找到自己的专用数据(在Heap 中的对象属性值)。当然非静态方法也必须获得该隐含参数,因此非静态方法在调用前,必须先new一个对象实例,获得Stack中的地址指针,否则dalvik虚拟机将无法将隐含参数传给非静态方法。
静态方法没有隐含参数,因此也不需要new对象,只要class文件被ClassLoader load进入JVM的Stack,该静态方法即可被调用。所以我们可以直接使用类名调用类的方法。当然此时静态方法是存取不到Heap 中的对象属性的。
5、静态属性和动态属性
静态属性是保存在Stack中的,而不同于动态属性保存在Heap 中。正因为都是在Stack中,而Stack中指令和数据都是定长的,因此很容易算出偏移量,所以类方法(静态和非静态)都可以访问到类的静态属性。也正因为静态属性被保存在Stack中,所以具有了全局属性。
6、总结
- Android之内存机制分析-Android堆和栈
- Android 性能分析之内存抖动分析
- 【Android内存机制分析】了解Android堆和栈
- 【Android内存机制分析】了解Android堆和栈
- Android内存机制分析上篇:了解Android堆和栈
- Android内存机制分析上篇:了解Android堆和栈
- Android内存机制分析上篇:了解Android堆和栈
- Android内存机制分析上篇:了解Android堆和栈
- Android内存机制分析上篇:了解Android堆和栈
- Android内存机制分析上篇:了解Android堆和栈
- Android内存机制分析上篇:了解Android堆和栈
- android 之内存泄漏
- Android之内存管理
- Android之内存管理
- android之内存操作
- Android之内存泄露
- Android之内存泄露
- Android之内存优化
- 37. customer payment(1)
- MATLAB中sum函数的用法
- cout的输出格式(转)
- LeetCode #22 Generate Parentheses C# Solution
- 生命周期 Activity
- Android之内存机制分析-Android堆和栈
- 正则表达式Regular Expression
- 问题:expected expression, got ')'
- JavaScript客户端脚本编程(2)
- JAVA笔记-Static与Final详解笔记
- Java 并发工具包 java.util.concurrent 用户指南
- string与double的互相转换
- JavaWeb的编码问题
- python进阶之路---环境安装