当前位置: 首页 > 面试题库 >

Java变量放在堆栈或堆上

厍书
2023-03-14
问题内容

我对Java不太了解。

我浏览了几个链接,发现博客上写着“ Java Primitives存储在堆栈上”,我觉得这取决于实例变量或局部变量。

经过几个链接后,我的结论是,

类变量(基元)作为对象包含的对象的一部分存储在堆中。

类变量– object(用户定义)–作为其包含的Object的一部分存储在堆中。对于参考对象和实际对象都是如此。

方法变量-基元-作为该堆栈框架的一部分存储在堆栈中。

方法变量–对象(用户定义)–存储在堆上,但对堆上该区域的引用作为该堆栈框架的一部分存储在堆栈上。如果对象中包含另一个对象,则引用也可以存储在堆中。

静态方法(实际上是所有方法)以及静态变量都存储在堆中。

如果我的理解是错误的,请纠正我。谢谢。


问题答案:

JVM中有一些优化甚至可以使用对象堆栈,这可以减少垃圾收集工作。

类存储在堆的特殊部分,但这取决于您使用的JVM。(热点中的Permgen fe <= 24)。

通常,您不必考虑数据的存储位置,而应更多地考虑诸如可见性和语义寿命之类的语义。到目前为止,您对问题的解释看起来不错。



 类似资料:
  • 我对Java没什么概念。 我浏览了一些链接,发现博客上写着“存储在堆栈上的Java原语”,我觉得这取决于实例变量或局部变量。 经过几个环节,我的结论是, 类变量(原语)作为对象的一部分存储在堆中。 类变量——对象(用户定义)——作为对象的一部分存储在堆中。这对于参考对象和实际对象都是正确的。 方法变量——基元——作为堆栈框架的一部分存储在堆栈上。 方法变量-对象(用户定义)-存储在堆上,但是对堆上

  • 问题内容: 标识符或变量名在Java中存储在哪里?我知道对象会存储在堆中,变量会存储在堆或栈中,具体取决于变量的类型和范围。我们可以调试或编写任何程序来确认它吗? 感谢和问候 问题答案: 字段 名称作为类元数据的一部分存储在以前的PermGen now-Metaspace中。 数组元素 没有名称,只有数字。(提示Patrick McGoohan。) 如果选择了该选项,则 方法和构造函数参数的 名称

  • 问题内容: 我只知道非基元(对象)放在堆上,方法在堆栈上,但是基元变量呢? -更新 根据答案,我可以说堆可以有一个新的堆,并且给定对象可以堆吗?假设对象将具有基本变量和引用变量。 问题答案: 本地定义的基元将在堆栈中。但是,如果将原语定义为对象实例的一部分,则该原语将位于堆上。 关于更新: 对象没有自己的堆栈。在我的示例中,实际上是的每个实例的一部分。只要分配了HeapClass的实例(例如),就

  • 因此,我知道对堆栈中分配的变量调用会导致无效指针错误。 在ED指针中,在实际指针之前分配8个字节,以保留关于指针大小的信息。因此,我想知道是否在一个结构之前做了一个,然后在该结构上调用free,是否可以释放该结构(当然,这偏离了分配这8个字节是所做的唯一额外的事情的假设)。 我想我的最后一个问题是,堆栈变量分配和堆分配之间是否有真正的区别(就后端对内核的调用而言)。

  • 问题内容: 我有个问题 例如,当我在方法内部声明变量时会发生什么。 在堆栈或堆中的哪里分配了myShip参考? 我认为是在堆栈中,但由于我在阅读《 J2ME游戏编程》“ Java类已实例化到Java堆”上而感到困惑 所有Java类别? 提前致谢 问题答案: 是对对象的引用,位于方法调用堆栈上,称为“堆栈”。当一个方法被称为一个内存块被推到栈顶时,该内存块有空间容纳所有原语(int,float,bo

  • 问题内容: 我知道常量池的概念以及JVM用于处理字符串文字的字符串常量池。但是我不知道JVM使用哪种类型的内存来存储String常量文字。堆栈还是堆?由于它的文字不与任何实例相关联,因此我假定它将存储在堆栈中。但是,如果没有任何实例引用该文字,则必须通过GC运行来收集文字(如果我错了,请纠正我),那么如果将其存储在堆栈中,该如何处理? 问题答案: 从技术上来说,答案都不是。根据Java虚拟机规范,