当前位置: 首页 > 知识库问答 >
问题:

放置在堆栈或堆上的Java变量

谢志文
2023-03-14

我对Java没什么概念。

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

经过几个环节,我的结论是,

变量(原语)作为对象的一部分存储在堆中。

类变量——对象(用户定义)——作为对象的一部分存储在堆中。这对于参考对象和实际对象都是正确的。

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

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

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

如果我的理解有误,请指正。谢谢。

共有3个答案

司徒杜吟
2023-03-14

对象存储在堆中。

存储在堆栈中的对象引用。

静态变量存储在方法区域中。

实例

abc obj=new abc();

abc对象保存在堆中,对象引用存储在堆栈中。

  static int i=10;

i方法区域中存储的变量。

乐正涵意
2023-03-14

"方法变量-对象(用户定义)-存储在堆中,但是..."

错误的首先,方法变量称为局部变量。

让我们考虑一下

public static void main(String[] args) {
    List<Integer> model = new ArrayList<Integer>();

变量model放在堆栈框架中,而不是堆上。使用新建ArrayList生成的引用对象

三件事:

  • 变量模型
  • 生成对象
  • 对该对象的引用,存储在变量中

它们完全不同,不要把它们弄乱。

白光耀
2023-03-14

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

类存储在堆的特殊部分,但这取决于您使用的JVM。(热点中的Permgen f.e.)

一般来说,您不必考虑数据存储在何处,而应该更多地考虑语义,如可见性和某物的寿命。到目前为止,你在问题中的解释看起来不错。

 类似资料:
  • 问题内容: 我对Java不太了解。 我浏览了几个链接,发现博客上写着“ Java Primitives存储在堆栈上”,我觉得这取决于实例变量或局部变量。 经过几个链接后,我的结论是, 类变量(基元)作为对象包含的对象的一部分存储在堆中。 类变量– object(用户定义)–作为其包含的Object的一部分存储在堆中。对于参考对象和实际对象都是如此。 方法变量-基元-作为该堆栈框架的一部分存储在堆栈

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

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

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

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

  • 问题内容: 我在标准Windows命令窗口中有一个正在运行的Java进程。即我已经运行’cmd’并在java -jar中键入… 我需要尽可能获得所有线程的完整堆栈转储。 我记得在Linux下,您可以通过quit命令上的选项将消息发送到JVM。 在此文件中为太阳状态 若要在Windows 95或Windows NT平台上生成堆栈跟踪,请在运行Java程序的窗口中输入键序列,或单击窗口上的“关闭”按钮