局部变量的Java内存(堆栈)分配

局部变量的Java内存(堆栈)分配,java,Java,我现在正在学习java 我被困在对象和局部变量的内存分配上。 有谁能说明或澄清我的一些疑问 我阅读了有关对象实例的堆和堆栈内存的内容 变量和局部变量。我有一个问题,是否有一个新的 正在为每个方法创建堆栈??或者对于每个类别的 单个堆栈被整个类使用 我读过那一堆 是由每个线程创建的,这意味着什么 谢谢 马哈维尔 每个线程都有一个私有堆栈 每个方法在该线程的堆栈中都有一个私有堆栈框架 堆栈以一对一的映射与线程相关联。堆栈绝对不与方法和类相关联 解释这一切的方法是,方法的局部变量对于该方法的每次调用

我现在正在学习java 我被困在对象和局部变量的内存分配上。 有谁能说明或澄清我的一些疑问

  • 我阅读了有关对象实例的堆和堆栈内存的内容 变量和局部变量。我有一个问题,是否有一个新的 正在为每个方法创建堆栈??或者对于每个类别的 单个堆栈被整个类使用
  • 我读过那一堆 是由每个线程创建的,这意味着什么
  • 谢谢 马哈维尔
  • 每个线程都有一个私有堆栈
  • 每个方法在该线程的堆栈中都有一个私有堆栈框架
  • 堆栈以一对一的映射与线程相关联。堆栈绝对不与方法和类相关联

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

    每个线程都有自己的堆栈

    • 无论何时使用
      new
      ,都会在堆上创建一个对象
    • 局部变量存储在堆栈上。这包括基本体(例如
      int
      )和对所创建的任何对象的引用。实际对象本身不是在堆栈上创建的,正如我在使用
      new
      时提到的,它们将在堆上创建
    我有一个问题,即是否会为每个堆栈创建一个新堆栈 方法

    调用方法时使用相同的堆栈。方法将在堆栈上创建自己的小部分,称为“堆栈框架”,用于保存其局部变量

    这就像一堆板,当一个方法被称为板时,板被添加到堆栈的顶部(堆栈框架),当该方法结束时,板从堆栈中移除。该方法的所有局部变量都将被销毁,但使用
    new
    创建的实际对象不会被销毁


    当JVM的垃圾收集器发现您不再需要堆上的对象时,它将负责销毁堆上的对象(用
    new
    创建的对象)。

    当然,java垃圾收集器在有机会执行堆时总是负责堆,所以它只会查找孤立对象并将其清除,这就是为什么java中的NEW关键字总是在堆内存中创建新对象的原因

    谢谢你,大卫。但我仍然有一个疑问,当我们说局部变量存储在堆栈内存中时,这意味着什么?这意味着局部变量存储在所讨论的执行方法的私有堆栈框架中。你是说每个方法都有一个私有堆栈框架,那么该方法使用的局部变量存储在哪里??是否为变量创建新堆栈??方法的每次调用都有一个私有堆栈框架。如果该方法在两个不同的线程上运行,则有两个不同的堆栈帧,每个调用一个。感谢AusCBloke提供的简单说明。正如您所说,调用方法时使用的是同一个堆栈。方法将在堆栈上创建自己的小部分,称为“堆栈框架”,用于保存其局部变量。这意味着堆栈框架分为两部分,一部分包含方法调用,另一部分包含变量。。我说的对吗??或者它是以不同的方式运行的???@MahaveerMuttha堆栈框架基本上是一个方法自己的小临时内存空间,它可以在那里保存它的局部变量。当该方法调用另一个方法时,会在顶部创建另一个方法的堆栈框架,并执行该新方法。当第二个方法结束时,它的帧将被销毁(从堆栈中拉出),第一个方法将继续,就好像没有发生任何变化一样。堆栈的状态将与调用第二个方法之前相同。