首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >堆栈在Java中是垃圾回收的吗?

堆栈在Java中是垃圾回收的吗?
EN

Stack Overflow用户
提问于 2010-03-15 21:42:17
回答 9查看 9.5K关注 0票数 58

堆内存在Java中是垃圾回收的。

堆栈的垃圾是否也被回收了?

堆栈内存是如何回收的?

EN

回答 9

Stack Overflow用户

发布于 2010-03-15 21:46:15

堆栈上的内存包含方法参数和局部变量(准确地说:对象的引用和原始类型的变量本身)。如果您离开该方法,它将被自动删除。如果变量是(对对象的)引用,那么对象本身就在堆上,并由垃圾收集器处理。

因此,堆栈不是以与堆相同的方式进行垃圾收集,但堆栈本身是一种自动内存管理形式(早于垃圾收集)。

A more detailed answer is given by Thomas Pornin,请查看更多详细信息。

票数 39
EN

Stack Overflow用户

发布于 2010-03-15 21:46:11

在Java中,堆栈不是垃圾收集。

当方法返回时,为给定方法调用分配的堆栈将被释放。因为这是一个非常简单的后进先出结构,所以不需要垃圾收集。

堆栈和垃圾收集交互的一个地方是堆栈上的引用是GC根(这意味着它们是决定可达性的根引用)。

票数 29
EN

Stack Overflow用户

发布于 2010-03-16 19:38:56

堆栈可以是垃圾收集的。然而,在大多数JVM实现中,它被作为一个“栈”来处理,根据定义,它排除了垃圾收集。

我们所说的堆栈是方法激活上下文的累积:对于每个被调用的方法,这是一个概念结构,它包含方法参数、局部变量、一个指向调用方法的上下文的隐藏指针,以及一个用于保存指令指针的槽。激活上下文本身不能从Java语言本身访问。当方法退出(带有return或因为抛出异常)时,上下文就变得无用了。当一个方法A调用一个方法B时,可以保证当A重新获得控制权时,B的上下文就变得无用了。这意味着B的上下文的生存期是A的上下文的生存期的子范围。因此,激活上下文(对于给定的线程)可以用LIFO (“后进先出”)规则来分配。简单地说,堆栈:一个新的激活上下文被推到上下文堆栈的顶部,顶部的上下文将是第一个被处理的上下文。

在实践中,激活上下文(也称为堆栈帧)按堆栈顺序连接在一个专用区域中。该区域是在线程启动时从操作系统获得的,当线程终止时,操作系统会将其取回。堆栈的顶部由特定的指针指定,通常包含在CPU寄存器中(这取决于JVM是在解释还是在编译代码)。“指向调用者上下文的指针”是虚拟的;在堆栈顺序中,调用者的上下文必须位于下面。GC不会介入:堆栈的区域是从线程活动本身同步创建和回收的。这也是它在许多语言中的工作方式,比如C,这些语言根本没有GC。

现在,没有什么能阻止JVM实现做其他事情,例如,在堆中分配激活上下文,并由GC收集它们。这通常不是在Java虚拟机中完成的,因为堆栈分配速度更快。但其他一些语言需要做这样的事情,最著名的是那些在使用GC的同时使用continuations的语言(例如Scheme及其call-with-current-continuation函数),因为这样的游戏违反了上面解释的后进先出规则。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2447504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档