• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android开发:内存机制分析——堆和栈

Android开发:内存机制分析——堆和栈

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android开发,android开发环境搭建,android开发工具,android开发教程,android开发入门等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android开发:内存机制分析——堆和栈


   1、dalvik的Heap和Stack

  这里说的只是dalvik java部分的内存,实际上除了dalvik部分,还有native。这个以后再说。

Android开发:内存机制分析——堆和栈 帮客之家

  下面针对上面列出的数据类型进行说明,只有了解了我们申请的数据在哪里,才能更好掌控我们自己的程序。

  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、总结

  Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

  栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

  对比上面的解析可以看出,其实Java处理Heap和Stack的大致原理跟C++是一样的。只是多了一个内存回收机制,让程序员不用主动调用delete释放内存。就像在C++里面,一般使用new申请的内存才会放到堆里面,而一般的临时变量都是放到栈里面去。

  今天主要是说说Android的dalvik里面的堆和栈的区别,以及存放哪些数据。粗了dalvik内存外, Android还有个native内存的概念。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android开发简单服务器
  • android开发使用组件心得
  • 1.2 开发环境搭建
  • android入门,看这一本书就够了,android入门,
  • Android开发笔记(8)——调用子Activity,androidactivity
  • Android开发笔记(9)——初步设置Menu,androidmenu
  • Android开发笔记(6)——类的设定与继承,android笔记
  • Android开发笔记(5)——方法调用(基础),android笔记
  • Android开发笔记(4)——MainActivity.java文件修改&布局嵌套,androidmainactivity
  • Android开发笔记(2)——ViewGroup,androidviewgroup

相关文章

  • 2017-05-26分布式协议Paxos学习笔记
  • 2017-05-26Unity加入Android广告小结,unityandroid小结
  • 2017-05-26安卓界面组件----列表视图,安卓组件----视图
  • 2017-05-26微博API常用方法,博API常用方法
  • 2017-05-26从编程的角度理解gradle脚本??Android Studio脚本构建和编程
  • 2017-05-26android am命令以及hotkey文件的编写,
  • 2017-05-26与MySQL传统复制相比,GTID有哪些独特的复制姿势?
  • 2017-05-26Android开发10:传感器器及地图相关应用,android传感器
  • 2017-05-26可展开的列表组件——ExpandableListView深入解析,expandablelist展开
  • 2017-05-26BroadcastReceiver--Android广播机制,broadcastreceiver

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android中隐藏顶部状态栏的那些坑,android顶部状态栏
    • 浅谈Android 通过ADB Wireless无线调试应用
    • Android消息机制
    • Android触摸事件(一)-AbsTouchEventHandle
    • kvm性能优化
    • 网站偶尔访问不了故障总结
    • Android系统的五种数据存储形式(一),android数据存储
    • Android新手入门2016(8)--ListView之ArrayAdapter
    • Android安全专项-AndBug动态调试工具环境搭建
    • Android中的沉浸式状态栏效果,android沉浸状态栏

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有