Java内存(栈)分配用于本地变量

25

我正在学习Java,目前遇到了对象和局部变量的内存分配问题。 有人能够解释一下或者解答我的疑问吗?

  1. 我读过实例变量和局部变量使用堆内存和栈内存的知识,我想问每个方法是否会创建一个新的栈?还是对于每个类只会使用一个栈?
  2. 我曾经看到过每个线程都会创建一个栈,请问这意味着什么?

谢谢 Mahaveer

3个回答

51

每个线程都有自己的堆栈

  • 每次使用new时,都会在上创建一个对象
  • 本地变量存储在堆栈上。这包括基本类型(如int)和对所创建任何对象的引用实际的对象本身不是在堆栈上创建的,正如我提到的,当您使用new时,它们将在堆上创建。

我有一个问题,每个方法是否都会创建一个新的堆栈?

当方法被调用时,使用同一个堆栈。该方法将创建自己的小节称为“堆栈帧”,用于保存其本地变量。

就像一摞盘子一样,当调用方法时,在堆栈顶部添加一个盘子(一个堆栈帧),当方法结束时,从堆栈中移除该盘子。所有该方法的局部变量都将被销毁,但使用new创建的实际对象不会。

JVM的垃圾回收器将负责在看到您不再需要它们时销毁上的对象(使用new创建的对象)。


感谢AusCBloke提供的简单说明。正如你所说,当调用方法时,使用相同的堆栈。方法将在堆栈上创建自己的小部分,称为“堆栈帧”,用于保存其本地变量。这意味着堆栈帧被分成两个部分,一个用于保存方法调用,另一个用于保存变量。我是对的吗?还是有不同的方式? - Mahaveer Muttha
@MahaveerMuttha 一个栈帧基本上是一个方法自己的小型临时内存空间,它可以保存它的局部变量。当该方法调用另一个方法时,那个方法的栈帧会在顶部创建,并且执行会转到那个新方法。当第二个方法结束时,它的栈帧将被销毁(从栈中弹出),第一个方法将继续执行,就好像没有发生任何不同的事情一样。栈的状态与第二个方法被调用之前相同。 - AusCBloke

18
  • 每个线程都有私有堆栈。
  • 每个方法都有一个私有的 栈帧,位于该线程的堆栈内。

堆栈与线程一一对应。堆栈绝对不与方法和类相关联。

理解这一切的方式是,方法的局部变量对于该方法的每次调用是私有的


谢谢@David。但我仍然有一个疑问,就是当我们说局部变量存储在堆栈内存中时,这是什么意思? - Mahaveer Muttha
这意味着局部变量存储在执行的方法的私有堆栈帧中。 - David Heffernan
你是在说每个方法都有一个私有的堆栈帧,那么方法使用的局部变量存储在哪里?是否为变量创建了新的堆栈? - Mahaveer Muttha
5
每次方法调用都有一个私有的栈帧。如果该方法在两个不同的线程上运行,则存在两个不同的栈帧,每次调用都有一个栈帧。 - David Heffernan

0
当然,Java垃圾回收器总是在有机会执行时处理堆内存,因此它只查找孤立对象并将其清除。这就是为什么Java中的NEW关键字总是在堆内存上创建新对象的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接