【问题标题】:How arrays use stack and heap space in Java?数组如何在 Java 中使用堆栈和堆空间?
【发布时间】:2014-11-16 05:25:08
【问题描述】:

作为学习的一部分,从下面的例子中,

我的问题:

有了数组声明/定义的给定内存布局,我想了解,哪个内存空间将成为堆栈空间和堆空间的一部分?准确地说,下面的内存空间(上图的一部分)在哪里?

【问题讨论】:

    标签: java jvm heap-memory stack-memory


    【解决方案1】:

    对象总是在堆上声明。只有对对象的引用通过方法变量和参数在堆栈中传递。

    因此,您在上面绘制的对象图将存储在堆中,并且对这些对象的引用仅在方法调用期间存在于堆栈中,当且仅当它们具有指向上述对象的参数或变量时图表。

    JVM 优化可能会在底层略有不同,例如使用寄存器而不是堆栈或内联对象,因为它可以被证明永远不会逃避方法调用等。然而,这些优化可能会发生也可能不会发生,它们是从 Java 语言级别看不到。因此,Java 语言的上述规则成立,堆上的对象和堆栈上的方法参数/字段。参数和字段永远不能保存对象,只能引用对象。

    【讨论】:

    • 实际上 HotSpot JVM 从 6u23 版本开始支持(并且默认启用)逃逸分析,它决定是否在堆或堆栈上分配新对象
    • @MateuszDymczyk 是的,我还记得 Brian Goetz 的一次演讲,在某些情况下,一个对象甚至可能根本没有被分配,因为它可以完全展开。
    • 那么,查询底部提到的子集图进入堆栈?
    • @overexchange,对不起,我不明白这个问题。 “子集图”和“bottomw”是什么意思?我在这个问题的其他任何地方都找不到对它们的引用。
    • 我在查询中有两个图表。第二张图中显示的内存位置是堆栈空间的一部分吗?
    【解决方案2】:

    THUMB-RULE - 所有对象都在堆上创建,无论它们在哪里实例化。

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2013-12-21
      • 2017-08-12
      • 2012-10-16
      • 2012-02-06
      相关资源
      最近更新 更多