heap和stack区别Java_Java中Heap与Stack的区别

heap和stack区别Java_Java中Heap与Stack的区别1)Heap是Stack的一个子集.——扩展—>从内存观点考虑。优化2)Stack存取速度仅次于寄存器,存储效率比heap高,可共享存储数据,可是其中数据的大小和生存期必须在运行前肯定。spa3)Heap是运行时可动态分配的数据区,从速度看比Stack慢,Heap里面的数据不共享,大小和生存期均可以在运行时再肯定。指针4)new关键字是运行时在Heap里面建立对象,每ne…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

1) Heap是 Stack的一个子集.——扩展—>从内存观点考虑。优化

2) Stack存取速度仅次于寄存器,存储效率比heap高,可共享存储数据,可是其中数据的大小和生存期必须在运行前肯定。spa

3) Heap是运行时可动态分配的数据区,从速度看比Stack慢,Heap里面的数据不共享,大小和生存期均可以在运行时再肯定。指针

4) new关键字 是运行时在Heap里面建立对象,每new一次都必定会建立新对象,由于堆数据不共享。orm

Eg: String str1= new String(“abc”);   (1)对象

String str2= “abc”;               (2)进程

str1是在Heap里面建立的对象。内存

str2是指向Stack里面值为“abc”的引用变量,语句(2)的执行,首先会建立引用变量str2, 再查找Stack里面有没有“abc”,有则将 str2指向 “abc”,没有则在Stack里面建立一个“abc”,再将str2指向“abc”。内存管理

由此可终结为在创建一个对象时从两个地方分配内存,在堆中分配的内存实际创建这个对象,而在栈中分配的内存只是一个指向这个堆对象的指针(引用)而已.io

heap和stack在内存中有什么区别。form

栈是一种线形集合,其添加和删除元素的操做应在同一端尾部完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素.

堆存储:heapstorage

堆存储分配: heapstorage allocation

堆存储管理: heap storage management

栈编址: stack addressing

栈变换:stack transformation

栈存储器:stack memory

栈单元: stack cel

在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,咱们从JVM的内存管理原理的角度来认识Stack和Heap,并经过这些原理认清Java中静态方法和静态属性的问题。

通常,JVM的内存分为两部分:Stack和Heap。

Stack(栈)是JVM的内存指令区。Stack管理很简单,push一 定长度字节的数据或者指令,Stack指针压栈相应的字节位移;pop必定字节长度数据或者指令,Stack指针弹栈。Stack的速度很快,管理很简 单,而且每次操做的数据或者指令字节长度是已知的。因此Java 基本数据类型,Java 指令代码,常量都保存在Stack中。

Heap(堆)是JVM的内存数据区。Heap 的管理很复杂,每次分配不定长的内存空间,专门用来保存对象的实例。在Heap 中分配必定的内存来保存对象实例,实际上也只是保存对象实例的属性值,属性的类型和对象自己的类型标记等,并不保存对象的方法(方法是指令,保存在 Stack中),在Heap 中分配必定的内存保存对象实例和对象的序列化比较相似。而对象实例在Heap 中分配好之后,须要在Stack中保存一个4字节的Heap 内存地址,用来定位该对象实例在Heap 中的位置,便于找到该对象实例。

因为Stack的内存管理是顺序分配的,并且定长,不存在内存回收问题;而Heap 则是随机分配内存,不定长度,存在内存分配和回收的问题;所以在JVM中另有一个GC进程,按期扫描Heap ,它根据Stack中保存的4字节对象地址扫描Heap ,定位Heap 中这些对象,进行一些优化(例如合并空闲内存块什么的),而且假设Heap 中没有扫描到的区域都是空闲的,通通refresh(其实是把Stack中丢失了对象地址的无用对象清除了),这就是垃圾收集的过程;关于垃圾收集的更 深刻讲解请参考51CTO以前的文章《JVM内存模型及垃圾收集策略解析》。

JVM的体系结构

咱们首先要搞清楚的是:什么是数据以及什么是指令。而后要搞清楚对象的方法和对象的属性分别保存在哪里。

1)方法自己是指令的操做码部分,保存在Stack中;

2)方法内部变量做为指令的操做数部分,跟在指令的操做码以后,保存在Stack中(其实是简单类型保存在Stack中,对象类型在Stack中保存地址,在Heap 中保存值);上述的指令操做码和指令操做数构成了完整的Java 指令。

3)对象实例包括其属性值做为数据,保存在数据区Heap 中。

非静态的对象属性做为对象实例的一部分保存在Heap 中,而对象实例必须经过Stack中保存的地址指针才能访问到。所以可否访问到对象实例以及它的非静态属性值彻底取决于可否得到对象实例在Stack中的地址指针。

非静态方法和静态方法的区别:

非静态方法有一个和静态方法很重大的不一样:非静态方法有一个隐含的传入参数,该参数是JVM给它的,和咱们怎么写代码无关,这个隐含的参数就是对 象实例在Stack中的地址指针。所以非静态方法(在Stack中的指令代码)老是能够找到本身的专用数据(在Heap 中的对象属性值)。固然非静态方法也必须得到该隐含参数,所以非静态方法在调用前,必须先new一个对象实例,得到Stack中的地址指针,不然JVM将 没法将隐含参数传给非静态方法。

静态方法无此隐含参数,所以也不须要new对象,只要class文件被ClassLoader load进入JVM的Stack,该静态方法便可被调用。固然此时静态方法是存取不到Heap 中的对象属性的。

总结一下该过程:当一个class文件被ClassLoader load进入JVM后,方法指令保存在Stack中,此时Heap 区没有数据。而后程序技术器开始执行指令,若是是静态方法,直接依次执行指令代码,固然此时指令代码是不能访问Heap 数据区的;若是是非静态方法,因为隐含参数没有值,会报错。所以在非静态方法执行前,要先new对象,在Heap 中分配数据,并把Stack中的地址指针交给非静态方法,这样程序技术器依次执行指令,而指令代码此时可以访问到Heap 数据区了。

静态属性和动态属性:

前面提到对象实例以及动态属性都是保存在Heap 中的,而Heap 必须经过Stack中的地址指针才可以被指令(类的方法)访问到。所以能够推断出:静态属性是保存在Stack中的,而不一样于动态属性保存在Heap 中。正由于都是在Stack中,而Stack中指令和数据都是定长的,所以很容易算出偏移量,也所以无论什么指令(类的方法),均可以访问到类的静态属 性。也正由于静态属性被保存在Stack中,因此具备了全局属性。

在JVM中,静态属性保存在Stack指令内存区,动态属性保存在Heap数据内存区。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/207178.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 十二、适配器模式——解决充电的烦恼 #和设计模式一起旅行#

    轻轻的我走了, 正如我轻轻的来; 我轻轻的招手, 作别西天的云彩。 ——徐志摩 《再别康桥》故事背景把奶茶店盘了出去,我和设计模式MM,继续上路,坐着冒着烟的飞机来到了剑桥,这里真是个美丽的地方,我用手机拍了很多的照片手机没电了,也玩的累了。找了个酒店 ,准备休息一下,然后给我的手机充充电。 才知道英国的插座都是下面这个样子:而我的…

  • web服务器监控工具[通俗易懂]

    web服务器监控工具[通俗易懂]监控你的WEB服务器或者WEB主机运行是否正常与健康是非常重要的。你要确保用户始终可以打开你的网站并且网速不慢。服务器监控工具允许你收集和分析有关你的Web服务器的数据。1.PerformanceCo-PilotPerformanceCo-Pilot,简称PCP,是一个系统性能和分析框架。它从多个主机整理数据并实时的分析,帮你识别不正常的表现模式。它也提供A

  • Modelsim的安装教程

    Modelsim的安装教程提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Modelsim安装二、激活成功教程1.拷贝Crack文件夹中的文件2.激活成功教程过程可能出现的错误前言Modelsim的安装与激活成功教程使用一、Modelsim安装打开下在之后的文件夹,直接双击exe文件进行安装。不熟悉时,可以直接使用默认路径进行安装,不进行路径上的修改。1、下载并解压好文件包,然后运行安装程序根据向导提示进行软件安装2、依提示安装软件过程中需要注意的是,会有三个弹出框提示,首先是是否创建桌面快捷方式提示

  • mac使用deepfakes

    mac使用deepfakespip3installvirtualenv 从http://github.com/deepfakes/faceswap/下载代码解压 source./faceswap_env/bin/activate pip3install-rrequirements.txt(如果使用GPU代替CPU则为:pip3install-rrequirements-gpu.txt) pyt…

  • java 正则表达式语法_JAVA正则表达式语法大全

    java 正则表达式语法_JAVA正则表达式语法大全元字符描述\将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline…

  • 互联网100强公布_互联网排行榜

    互联网100强公布_互联网排行榜无意中翻看到一篇我在三年多前写的文章《我看中国互联网web2.0百强名单》,读来颇有感概。2005-2006那两年,正是WEB2.0概念轰轰烈烈的时候,大大小小的新网站层出不穷,博客、视频、交友、评点、社区、聚合……不管自己的网站的UGC比例多少,都宣传自己是WEB2.0,好像不贴上WEB2.0的标签,就不够潮流,不够IN,就吸引不了用户和风投。WEB2….

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号