您好、欢迎来到现金彩票网!
当前位置:老k棋牌 > 栈机制 >

Android内存机制分析上篇:了解Android堆和栈

发布时间:2019-07-01 07:24 来源:未知 编辑:admin

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

  昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题。以前也出现过这个问题,那时候并没有深究。这次打算好好分析一下Android的内存机制。

  因为我以前是做VC++开发,因此对C++在Window下的内存机制还是比较了解。不过转到Android后,一直都没有刻意去处理内存问题,因为脑子里一直想着Java的GC机制。不过现在想想,自己对Android的GC和内存管理并不了解,自己写的代码在内存哪里运行都不清楚,心里不淡定啊。。。。

  毕竟我以前写C++的时候,什么时候在哪里申请内存,什么时候释放内存,会不会栈溢出或者堆内存泄露都了如指掌。言归正传,今天打算先了解一下Android的堆和栈跟C++有何区别。

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

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

  实际上是保存对象实例的属性,属性的类型和对象本身的类型标记等,但是不保存实例的方法。实例的方法是属于数据指令,是保存在Stack里面,也就是上面表格里面的类方法。

  对象实例在Heap中分配好以后,会在stack中保存一个4字节的Heap内存地址,用来查找对象的实例。因为在Stack里面会用到Heap的实例,特别是调用实例的时候需要传入一个this指针。

  类方法的内部变量分为两种情况:简单类型保存在Stack中;对象类型在Stack中保存地址,在Heap 中保存值。

  非静态方法有一个隐含的传入参数,这个参数是dalvik虚拟机传进去的,这个隐含参数就是对象实例在Stack中的地址指针。因此非静态方法(在Stack中的指令代码)总是可以找到自己的专用数据(在Heap 中的对象属性值)。当然非静态方法也必须获得该隐含参数,因此非静态方法在调用前,必须先new一个对象实例,获得Stack中的地址指针,否则dalvik虚拟机将无法将隐含参数传给非静态方法。

  静态方法没有隐含参数,因此也不需要new对象,只要class文件被ClassLoader load进入JVM的Stack,该静态方法即可被调用。所以我们可以直接使用类名调用类的方法。当然此时静态方法是存取不到Heap 中的对象属性的。

  静态属性是保存在Stack中的,而不同于动态属性保存在Heap 中。正因为都是在Stack中,而Stack中指令和数据都是定长的,因此很容易算出偏移量,所以类方法(静态和非静态)都可以访问到类的静态属性。也正因为静态属性被保存在Stack中,所以具有了全局属性。

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

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

  笔者最近在准备面试的时候重新看了一些JAVA基础的知识,下面我们一起来看一下JAVA中堆栈内存的区别:Java把内存分成两种,一种叫做栈内存,一种叫做堆内存在函数中定义的一些基本类型的变量和对象的引用...博文来自:Android developer.

  简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内...博文来自:c_z_w的博客

  一直对系统中堆和栈的使用原则不太理解,在网上看到这篇文章,非常不错!转载地址:在计算机领域,堆栈是一个不容忽视的概念,我们编写的...博文来自:caobaokang的专栏

  昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题。以前也出现过这个问题,那时候并没有深究。这次打算好好分析一下Android的内存机制。因为我以前是做VC++...博文来自:我的程序员生涯--wjw--Java----Android------------>

  昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题。以前也出现过这个问题,那时候并没有深究。这次打算好好分析一下Android的内存机制。因为我以前是做VC...博文来自:刘新

  1、dalvik的Heap和Stack这里说的只是dalvik java部分的内存,实际上除了dalvik部分,还有native。这个以后再说。下面针对上面列出的数据类型进行说明,只有了解了我们申请的...博文来自:No talent

  1、dalvik的Heap和Stack这里说的只是dalvikjava部分的内存,实际上除了dalvik部分,还有native。   下面针对上面列出的数据类型进行说明,只有了解了我们申请的数据在哪里...博文来自:weixin_34293902的博客

  Google在Android的官网上有这样一篇文章,初步介绍了Android是如何管理应用的进程与内存分配:博文来自:zhouchao001的博客

  栈内存:内存地址连续,先进来的存放在栈底,所以先进后出,由系统自动分配空间。如:useruser;此时,系统已经在栈内存中为user分配了空间,现在处于栈顶部,后面再来的会将这个往下推,直到user被...博文来自:前人挖坑,后人种(pen)

  1、dalvik的Heap和Stack这里说的只是dalvik java部分的内存,实际上除了dalvik部分,还有native。这个以后再说。下面针对上面列出的数据类型进行说明,只有了解了我们申请的...博文来自:的博客

  栈内存,堆内存和垃圾回收器的关系:在堆中分配内存给新产生对象或者数组的同时,还在栈中产生一个特殊变量,这个特殊变量的取值等于对象或者数组在堆内存中的首地址。当这个特殊变量超过了函数体{},被自动回收后...博文来自:阿凯的专栏

  Android中的内存管理机制分配机制Android为每个进程分配内存的时候,采用了弹性的分配方式,也就是刚开始并不会一下分配很多内存给每个进程,而是给每一个进程分配一个“够用”的量。这个量是根据每一...博文来自:kingcp的博客

  Android内存机制分析上篇:了解Android堆和栈昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题。以前也出现过这个问题,那时候并没有深究。这次打算好好...博文来自:周刚的专栏

  Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收...博文来自:i_lovefish的专栏

  Java内存机制1.虚拟机运行时数据区基本概念虚拟机模拟某种计算机体系结构,执行特定指令集的软件。包括进程虚拟机和系统虚拟机(VMWare)进程虚拟机:JVM、AdobeFlashPlayer、FC模...博文来自:xiang_freedom的专栏

  内存机制,度娘的答案很多,一般开发者遇到的大多数都是Bitmap内存溢出;简单说说我的理解:机制:Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通...博文来自:cwjtojava的专栏

  内存溢出的问题的确是个大的问题想了解java的GC回收机制就一定要先认识一下JVM堆,其分三个部分新域、旧域和永久域。新域:存储所有新成生的对象旧域:新域中的对象,经过了一定次数的GC循环后,被移入旧...博文来自:busjb的专栏

  内存溢出的问题的确是个大的问题想了解java的GC回收机制就一定要先认识一下JVM堆,其分三个部分新域、旧域和永久域。新域:存储所有新成生的对象旧域:新域中的对象,经过了一定次数的GC循环后,被移入旧...博文来自:hwuyule的专栏

  TCP/IP四层协议:名称概述应用层应用层为网络应用程序提供访问网络服务的接口。使用应用层协议,如HTTP,超文本传输协议,可以将超文本标记语言文档从一个应用程序传输到另外一个应用程序。传输层传输层为...博文来自:Api Player的博客

  (本文详情来源:转载请注明出处)内存溢出的问题的确是个大的问题想了解java的GC回收机制就一定要先认...博文来自:风起云涌

  Android中热修复框架比较多,每家公司都有对应的方案和框架,比如阿里的AndFix框架,关于这个框架在之前的文章已经详细讲解了,不了解的同学可以点击这里:AndFix热修复框架原理分析 。本文继续...博文来自:Android应用安全防护和逆向分析-----作者

  Android的内存机制原博客地址:的程序由J...博文来自:程序员孙大喵丶的博客

  问题描述编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意思是我理解什么是栈,但是它们到底...博文来自:不走弯路,就是捷径!

  JVM内存管理垃圾回收类加载虚拟机性能监控和优化内存管理正常认为的内存区域包括:堆、栈,这种分法比较粗糙JVM较为详细地将内存划分为若干个不同的数据区程序计数器:当前线程所执行的字节码的行号指示器,就...博文来自:android_ErChen的开发之路

  堆和栈的区别(转载文章,原著地址不详)一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等...博文来自:kaibing的专栏

  一直对堆和栈的区别似懵懵懂懂,终于找到了一篇好文章,在这里分享一下:1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能...博文来自:weixin_42106981的博客

  Android系统提供了非常严格的多层次的安全保护措施,包括代码。为了防止恶意用户采用恶意软件进行缓冲区溢出***或者进行“越狱”操作,自Android4.0版本之后,内核就引入了ASLR技术来对代码...博文来自:weixin_33674976的博客

  JVM的内存区域划分学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?由于...博文来自:chenruineng123的博客

  内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致GC不能回收。我...博文来自:嘻哈包袱铺 专栏

  IT小修2017-05-0914:51java堆栈java面试过程中经常会被问到关于堆栈的问题,这里我稍微总结一下,供大家参考一下。java的内存分为堆内存和栈内存栈内存是指程序进入一个方法时,会为这...博文来自:u011277123的博客

  一、  堆(heap)和栈(stack)栈(stack)会自动分配内存空间,会自动释放。堆(heap)动态分配的内存,大小不定也不会自动释放。二、  基本类型和引用类型基本类型:简单的数据段,存放在栈...博文来自:梦想家

  一、预备知识—程序的内存分配  一个由C/C++编译的程序占用的内存分为以下几个部分  1、栈区(stack)—  由编译器自动分配释放  ,存放函数的参数值,局部变量的值等。其  操作方式类似于数据...博文来自:RazilFelix的博客

  一、匿名共享内存的共享原理    在Android系统中,每一块匿名共享内存都是使用一个文件描述符来描述的,而这个文件描述符是通过打开设备文件/dev/ashmem获得的。当两个进程需要共享一块匿名共...博文来自:nwpushuai的博客

  一、Android系统性能提升之路 Dalvik虚拟机作为Android平台的核心组成部分之一,允许在有限的内存资源中同时运行多个虚拟机实例。Dalvik虚拟机通过以下方式提升性能:1、DEX代码安装...博文来自:JBlock的博客

  前言在Android中,内存泄露的现象十分常见;而内存泄露导致的后果会使得应用Crash本文全面介绍了内存泄露的本质、原因amp;解决方案,最终提供一些常见的内存泄露分析工具,希望你们会喜欢...博文来自:专注分享 Android开发 干货

  一、前言在Android开发中,都需要从一个activity启动到另一个activity,而启动时就需要判断新的activity的启动模式。以前一直都不是特别了解这几个模式都是干啥的,只知道拿来用,网...博文来自:会飞的鱼儿的博客

  IAP升级功能编写初期的一些困惑与疑问---完成功能后的总结 一,网上下载的例程,跳转部分的代码有差异,尤其是用的汇编那句 二,关于跳转部分的代码的理解(转) 三,关于跳转时能否不用按键,用软件标志位...博文来自:Super_Demo的专栏

  现在的Win7系统中安装的一般都是32位的Office,因为微软推荐使用32位的Office,兼容性更强,稳定性更好。在使用Access作为数据库的时候,C#操作Access,如果Access是acc...博文来自:写代码的蜗牛

  转载请注明出处:     在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索和线路规划的内容。 公交信息检索     实际上,公交信息检索与POI检索、在线建议检索非常相似,也...

  Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的Thread...

  u011860731的专栏C#实现开发windows服务实现自动从FTP服务器下载文件(自行设置分/时执行)

  最近在做一个每天定点从FTP自动下载节目.xml并更新到数据库的功能。首先想到用 FileSystemWatcher来监控下载到某个目录中的文件是否发生改变,如果改变就执行相应的操作,然后用timer...

  摘要 最近要发论文了,被知乎里人推荐使用论文编译软件(CTex、LaTex和Overleaf之类),瞬间感觉自己用Word简直Out了(书读少)。 学校里也听说过LaTex,不过因为当时没怎么写过...

  看到很多朋友配置vsftpd时不能使用匿名用户上传和下载(创建目录或删除、重命名文件夹),本文主要解决vsftpd的匿名用户权限配制问题。...

  一个例子高斯混合模型(Gaussian Mixed Model)指的是多个高斯分布函数的线性组合,理论上GMM可以拟合出任意类型的分布,通常用于解决同一集合下的数据包含多个不同的分布的情况(或者是同一...

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...

  我走小路的博客将Excel文件导入数据库(POI+Excel+MySQL+jsp页面导入)第一次优化

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...

  Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且...

  klkxxy的博客三菱FX系列PLC与PC通讯的实现之专有协议(计算机联接)的程序设计之一

  阅读内容为:FX系列微型可编程控制器用户手册(通讯篇)中计算机链接功能章节。 采用本方法通信,pc端的实现,其实就是,把操作按照协议(2种)翻译成相应的字符串,通过串口发送给plc。 编写一应用程...

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...

  u013268685的专栏(有一种幸福叫AC,有一种期待叫AK)简单linux字符设备驱动程序与编程小技巧(上)

  这几天开始研究linux下的驱动程序编写了,遇到的问题也挺多的,好在linux是开源的,很多高人编写的技巧和思路都会在他们的源代码中体现,我也在他们的源码中学到了很多好东西,我归纳了下贴出来,希望自己...

  苹果充值的刷单现象在游戏行业非常普遍,很多团队挖空心思寻找漏洞以非法获利。常见的手段主要有以下六种: 伪造充值凭据(receipt)以小额凭据骗取大额商品 凭据重复使用 凭据重复使用信用卡黑卡/...

  分享知识、分享进步jquery/js实现一个网页同时调用多个倒计时(最新的)

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...

  一、代理模式为某个对象提供一个代理,从而控制这个代理的访问。代理类和委托类具有共同的父类或父接口,这样在任何使用委托类对象的地方都可以使用代理类对象替代。代理类负责请求的预处理、过滤、将请求分配给委托...

  如下图所示,蜂窝小区,以1为中心,顺时针编号,编号最大限定为100000。求任意两编号之间的最短距离。两个相邻小区的距离为1 示例:19到30的最短距离为5 实现如下三个接口: /**********...

  NYS001的专栏魔兽争霸3冰封王座1.24e 多开联机补丁 信息发布与收集点

  在MATLAB中,可以注释一段程序。 使用“%{”和“%}”。 例如 %{ 。。。 %} 即可。 经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜色。现在可以用 ...

http://theenigmaco.com/zhanjizhi/200.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有