问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

"栈"和"栈帧"这两个概念到底如何区分

发布网友 发布时间:2024-05-03 22:34

我来回答

2个回答

热心网友 时间:2024-10-22 19:38

1、栈:FILO先进后出的数据结构

栈底是第一个进栈的数据的位置(压箱 底) 

栈顶是最后一个进栈的数据位置

2、根据SP指针指向的位置,栈可分为 满栈和空栈 

满栈:当sp指针总是指向最后压入堆栈 的数据(ARM采用满栈)

空栈:当堆栈指针SP总是指向下一个将 要放入数据的空位置。

3、根据SP指针移动的方向,可分为升 栈和降栈 

升栈:随数据的入栈,SP由低地址--> 高地址 


降栈:随数据的入栈,SP由高地址--> 低地址(ARM采用降栈)

 

4、栈帧:存储在用户栈上的(当然内核栈同样适用)每一次函数调用涉及的相关信息的记录单元 ; 栈帧(stack frame)就是一个函数所使用的那部分栈,所有函数的栈帧串起来就组成了一个完整的栈。

栈帧的两个边界分别有FP(R11)和SP(R13)L来限定。 

栈帧


栈的作用:

1)保存局部变量

分析代码:

[html] view plain copy

热心网友 时间:2024-10-22 19:38

GC在什么时候对什么做了什么?
要回答这个问题,先了解下GC的发展史、jvm运行时数据区的划分、jvm内存分配策略、jvm垃圾收集算法等知识。
先说下jvm运行时数据的划分,粗暴的分可以分为堆区(Heap)和栈区(Stack),但jvm的分法实际上比这复杂得多,大概分为下面几块:
1、程序计数器(Program Conuter Register)
程序计数器是一块较小的内存空间,它是当前线程执行字节码的行号指示器,字节码解释工作器就是通过改变这个计数器的值来选取下一条需要执行的指令。它是线程私有的内存,也是唯一一个没有OOM异常的区域。
2、Java虚拟机栈区(Java Virtual Machine Stacks)
也就是通常所说的栈区,它描述的是Java方法执行的内存模型,每个方法被执行的时候都创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等。每个方法被调用到完成,相当于一个栈帧在虚拟机栈中从入栈到出栈的过程。此区域也是线程私有的内存,可能抛出两种异常:如果线程请求的栈深度大于虚拟机允许的深度将抛出StackOverflowError;如果虚拟机栈可以动态的扩展,扩展到无法动态的申请到足够的内存时会抛出OOM异常。
3、本地方法栈(Native Method Stacks)
本地方法栈与虚拟机栈发挥的作用非常相似,区别就是虚拟机栈为虚拟机执行Java方法,本地方法栈则是为虚拟机使用到的Native方法服务。
4、堆区(Heap)
所有对象实例和数组都在堆区上分配,堆区是GC主要管理的区域。堆区还可以细分为新生代、老年代,新生代还分为一个Eden区和两个Survivor区。此块内存为所有线程共享区域,当堆中没有足够内存完成实例分配时会抛出OOM异常。
5、方法区(Method Area)
方法区也是所有线程共享区,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。GC在这个区域很少出现,这个区域内存回收的目标主要是对常量池的回收和类型的卸载,回收的内存比较少,所以也有称这个区域为永久代(Permanent Generation)的。当方法区无法满足内存分配时抛出OOM异常。
6、运行时常量池(Runtime Constant Pool)
运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。

垃圾收集(Garbage Collection)并不是Java独有的,最早是出现在Lisp语言中,它做的事就是自动管理内存,也就是下面三个问题:
1、什么时候回收
2、哪些内存需要回收
3、如何回收

1、什么时候回收?
上面说到GC经常发生的区域是堆区,堆区还可以细分为新生代、老年代,新生代还分为一个Eden区和两个Survivor区。
1.1 对象优先在Eden中分配,当Eden中没有足够空间时,虚拟机将发生一次Minor GC,因为Java大多数对象都是朝生夕灭,所以Minor GC非常频繁,而且速度也很快;
1.2 Full GC,发生在老年代的GC,当老年代没有足够的空间时即发生Full GC,发生Full GC一般都会有一次Minor GC。大对象直接进入老年代,如很长的字符串数组,虚拟机提供一个-XX:PretenureSizeThreadhold参数,令大于这个参数值的对象直接在老年代中分配,避免在Eden区和两个Survivor区发生大量的内存拷贝;
1.3 发生Minor GC时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则进行一次Full GC,如果小于,则查看HandlePromotionFailure设置是否允许担保失败,如果允许,那只会进行一次Minor GC,如果不允许,则改为进行一次Full GC。

2、哪些内存需要回收
jvm对不可用的对象进行回收,哪些对象是可用的,哪些是不可用的?Java并不是采用引用计数算法来判定对象是否可用,而是采用根搜索算法(GC Root Tracing),当一个对象到GC Roots没有任何引用相连接,用图论的来说就是从GC Roots到这个对象不可达,则证明此对象是不可用的,说明此对象可以被GC。对于这些不可达对象,也不是一下子就被GC,而是至少要经历两次标记过程:如果对象在进行根搜索算法后发现没有与GC Roots相连接的引用链,那它将会第一次标记并且进行一次筛选,筛选条件是此对象有没有必要执行finalize()方法,当对象没有覆盖finalize()方法或者finalize()方法已经被虚拟机调用执行过一次,这两种情况都被视为没有必要执行finalize()方法,对于没有必要执行finalize()方法的将会被GC,对于有必要有必要执行的,对象在finalize()方法中可能会自救,也就是重新与引用链上的任何一个对象建立关联即可。

3、如何回收
选择不同的垃圾收集器,所使用的收集算法也不同。
在新生代中,每次垃圾收集都发现有大批对象死去,只有少量存活,则使用复制算法,新生代内存被分为一个较大的Eden区和两个较小的Survivor区,每次只使用Eden区和一个Survivor区,当回收时将Eden区和Survivor还存活着的对象一次性的拷贝到另一个Survivor区上,最后清理掉Eden区和刚才使用过的Survivor区,Eden和Survivor的默认比例是8:1,可以使用-XX:SurvivorRatio来设置该比例。
而老年代中对象存活率高,没有额外的空间对它进行分配担保,必须使用“标记-清理”或“标记-整理”算法。
"栈"和"栈帧"这两个概念到底如何区分

1、栈:FILO先进后出的数据结构 栈底是第一个进栈的数据的位置(压箱 底)栈顶是最后一个进栈的数据位置 2、根据SP指针指向的位置,栈可分为 满栈和空栈 满栈:当sp指针总是指向最后压入堆栈 的数据(ARM采用满栈)空栈:当堆栈指针SP总是指向下一个将 要放入数据的空位置。3、根据SP指针移...

Java虚拟机栈与栈帧详解

栈与堆的区别在于:栈解决程序运行问题,堆解决数据存储问题。Java虚拟机栈是运行时单位,每个线程创建时会自动产生,包含栈帧,对应方法调用。栈帧生命周期与线程一致,主管方法运行,存储局部变量、部分结果。栈的特点:线程私有,不同栈帧无相互引用。栈运行原理:方法返回时弹出当前栈帧,前一个成为当前...

栈帧是什么

栈帧,顾名思义,就是栈中的一帧,栈分成很多帧,就如同一个视频动作分成好多帧一样。每个栈帧,对应一个函数,就是这个函数在栈中占用的部分。

c++:什么是stack frame?

stack frame 栈帧: 当你运行一个函数的时候,所有相关的变量就会以栈帧为单位会压入栈中。换句话说就是,每一个函数的运行 都会导致一个栈帧的压入,每一个栈帧里面都是各种函数存储的变量。

c++的“栈”是什么啊?

栈,可以看作是一摞卡片,最上面的卡片表示程序的当前作用域,这往往就是当前正在执行的函数。堆,一段完全独立于当前函数或者栈帧的内存区。栈是一种数据结构,用于存放数据,可以理解为羽毛球筒,羽毛球就是数据,最先放进去的最后才能拿出来。c语言可以用结构体来定义栈,每个元素以指针指向它前面的...

数调用过程原理及函数栈帧分析

在函数调用过程中,栈帧发挥关键作用。栈帧是一块特殊区域,用于存储函数调用过程中涉及的所有信息,如参数、返回地址和本地变量等。栈帧通常包含栈顶和栈底,栈顶的地址最低,栈底的地址最高。SP(栈指针)始终指向栈顶。在x86-32bit系统中,%ebp(基址指针)和%esp(栈指针)用于管理栈帧。%ebp指向...

JVM基础和内存区域剖析

栈帧:虚拟机栈中的栈元素(用于支持虚拟机进行方法调用和方法执行的数据结构)包括局部变量表、操作数栈、动态链接、方法出口 1.主要存储:2.数据过多会导致OutOfMemoryError异常 < JDK 1.8 >=JDK1.8 和永久代的区别:1.存储位置不同,永久代物理上是堆的一部分,和新手代,老年代地址是连续的...

栈是什么结构?

当前函数中声明的所有变量都置于栈顶帧中,即占用栈顶帧的内存,这就相当于一摞卡片中最上面的一张卡片。如果当前函数调用了另一个函数,举例来说,当前函数foo()调用了另一个函数bar(),就会在这摞卡片上再加一个新的卡片,这样bar()就有了自己的栈帧(stack frame)以供使用。从foo()传递到bar...

C语言中,什么是栈,什么是堆

栈是属于线程的,每一个线程会有一个自己的栈。2、堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。注意它和数据结构中的堆是两回事,分配方式倒是类似于链表,常见的就是malloc出来的都是属于堆区,就像固定出来的区域,到free的时候才释放,有点类似全局的,静态的。

C++ 函数调用栈

1. 函数调用栈与栈帧 程序执行过程中,函数调用像链条一样层层推进,每个函数执行完后,控制权会返回到调用它的那条指令。这个过程依赖于一个叫做栈帧的结构,它在调用时创建,用于保存函数参数、返回地址和局部变量等信息。2. 调用流程与寄存器 函数调用时,EIP寄存器存储下一条指令地址,ESP和EBP则在...

如何区分集合概念和普遍概念 正概念和负概念区分 堆和栈的概念和区别 栈和队列的概念和特点 怎么区分集合和非集合概念 集合和非集合概念区分 堆和栈的概念 定义和概念的最大区别 栈的概念
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
大连大学中外办学值得上吗 大连大学国际本科是公办还是民办 介绍一些有古老气息的,有传说的地方,越多越好。最好在中国中部。 现在的日本鬼子难道一定是你们想的这样坏吗?坏的是日本政府! 我近几年在吃玉米的时候总是不消化,一吃就拉出来了,而且大便中... 同时掷3个均匀的骰子,当得知"其中两个骰子面朝上点数之和为8时"获得多... 重庆市工伤申请表的鉴定程序是什么的 ...做了包皮手术,有早泄有前列腺,在晚上睡觉梦游射精,有什么影响到病快... 电脑没声,音箱正常,也没发现有感叹号和问号.声音控制部分被禁用.是换了... 属狗女什么属相最配对,属狗女和什么属相最配 ...堆栈中无数据时,堆栈指针SP指向哪里?当堆栈有数据时,SP指向哪里... 非霍奇金淋巴瘤能够活多久 商业用电?? 青口至闽侯西站赶几路公交 去年夏天,我髋关节疼痛,有时痛到不能走路,在医院检查髋关节有少量积液... 布偶猫能出去溜吗 城管面试穿什么衣服 未定事件簿国际服开服时间 公路车锁车是什么意思? 每天吃黑芝麻糊小脚会变瘦吗 吃一个星期的黑芝麻糊会瘦吗 婷美黑金和苏秘37比哪个好 混合皮肤用什么牌子护肤品 红梅和翠柏是什么词性? 赵汝亮拿过多少个世界冠军 青岛大学科技馆具体地址 手臂毛囊炎疤痕几年好不了 奥迪a5是轿跑吗 2011年奥迪a5是横置还是纵置的 如何判断一个公司是否是某专业领域的公司? 中华民族的反侵略斗争有哪几个 世界人民反侵略的斗争有哪些? 水土不服?两大核心管理层换人,这家山西太原老名牌“易主”山东国资两年... 1929年 苏军向张学良军队发动猛烈进攻 作文《我最喜欢的传说故事》最少要三个自然段。开头写喜欢那个故事,原 ... 什么是九年一贯制学校? 中美联泰大都会人寿可靠吗? metlife中美联泰大都会人寿保险有限公司给我发的10万元交通意外险是真... 大二转专业好吗谢谢了,大神帮忙啊 大二有必要转专业吗 以"我和古典名著的故事" 为话题,写一篇600左右的作文 宋代名相被贬青州是谁 ...后天下之乐而乐,为官期间为何却连续三次被贬? ...24.6%,为什么青少年抑郁的这么多?受到哪些因素影响? 卵磷脂络合碘胶囊的生产厂家有哪些 哪家比较好 求段誉说过的所有诗词和俗语,佛经不要 ...已经5个月了,指甲还没长出来,这是怎么回事?它还会长么? 11月5号1462次火车几点 孕妇乙肝小三阳能吃猪蹄吗 云南国土资源职业学院在哪里?