【问题标题】:JVM - Heap and StackJVM - 堆和堆栈
【发布时间】:2010-05-13 11:03:19
【问题描述】:

每当一个类被加载时,堆里存什么,栈里存什么?

还有线程驻留在哪里?

【问题讨论】:

    标签: java multithreading memory jvm


    【解决方案1】:

    引用类型在堆中。

    任何原始类型数据和对堆上值的引用(方法的参数/局部变量)都在堆栈上。

    每个线程都有自己的堆栈。

    应用程序中的所有线程共享同一个堆。

    【讨论】:

    • @Nirmal:这并不奇怪。无论是 C/C++ 运行时还是其他,所有运行时的行为都是相同的。所以,我真的不明白你身边的“为什么”“为什么”:)
    • “任何原始类型数据...都在堆上”有点令人困惑。如果它们是对象的数据成员,则堆确实存储原语。
    • 是的。它确实......但是,正如你提到的,作为复合材料的一部分。然而,当我们访问数据时,它首先被复制到堆栈中。例如,对于具有定义 ComplexNumber { float real, float imaginary } 的对象,在方法 doWork(ComplexNumber cn} { return cn.real * cn.real + float.imaginary * float.imaginary; } 中的值 real/imaginary 是首先被带入堆栈 unline cn,其中只有引用被带入堆栈
    【解决方案2】:

    真的很简单:

    • 对象(即类的实例)总是在堆上。他们不能在其他任何地方
      • 字段是对象的一部分,因此它们也存在于堆中。
    • 局部变量(包括方法/构造函数)参数始终在堆栈上。他们不可能在其他任何地方。

    请注意,局部变量只能保存引用(“指针”)或原始值。局部变量永远不能保存“对象”。

    请注意,this 视图是 JVM 规范中定义的。如果需要,具体的 JVM 可以在非堆区域中分配对象。例如:如果它知道一个新创建的对象永远不会逃脱当前的调用,那么它可以将实例化的对象放入堆栈区域。然而,这是一个开发者看不到的优化。

    【讨论】:

      【解决方案3】:

      基元:堆栈

      对象:堆

      线程:有一个单独的堆栈,同时共享同一个堆。

      【讨论】:

      • 如果它们是实例变量,它们不是存储在堆上吗?如果它们是局部变量,则在堆栈上?
      猜你喜欢
      • 1970-01-01
      • 2017-02-08
      • 2014-06-23
      • 1970-01-01
      • 2016-04-20
      • 2021-12-08
      • 2023-03-20
      • 1970-01-01
      • 2020-04-20
      相关资源
      最近更新 更多