【问题标题】:Java Where do Local variables,Object references,instance variablesJava局部变量,对象引用,实例变量在哪里
【发布时间】:2012-01-25 03:59:43
【问题描述】:

我目前正在学习java的内存概念,栈和堆,我知道局部变量和方法调用都生活在一个叫做栈的地方。对象存在于堆内。但是如果该局部变量包含一个对象呢?还是有对象引用?

public void Something(){
        Duck d = new Duck(24);
}

它仍然存在于堆栈中吗?实例变量在哪里?请尽量简单。谢谢。

【问题讨论】:

    标签: java memory-management jvm virtual-machine heap-memory


    【解决方案1】:

    对象引用变量起作用。就像原始变量一样——如果引用被声明为局部变量,它将进入堆栈。否则,如果引用是实例变量,它将进入对象内的堆。

    【讨论】:

      【解决方案2】:

      局部变量d(在堆栈上分配)包含对Duck 类对象的引用。一般来说,对象是在堆上分配的。

      Java 6e14 增加了对“转义分析”的支持。当您使用-XX:+DoEscapeAnalysis 开关启用它时,如果 JVM 确定一个对象是在一个方法中创建的,仅在该方法中使用,并且无法引用该对象来“转义”该方法 - 也就是说,我们可以确保在方法完成后不引用该对象 - JVM 可以在堆栈上分配它(将其所有字段视为局部变量)。这可能会发生在您的示例中。

      字段与对象的其余部分一起分配,因此是在堆上还是在堆栈上,具体取决于逃逸分析结果。

      【讨论】:

      • 分配在他们所在的对象里面?还是在堆中独奏?
      • 如果对象被创建为实例变量,它是否仍然属于 Escape 分析?
      • 一个对象在内存中的布局是这样的:8字节头部,然后是属性。如果实例变量是一个Object,而不是一个primitive,那么只有指针存储在连续的内存块中,对象可以分配到别处。
      • 根据发行说明 (oracle.com/technetwork/java/javase/6u14-137039.html),堆栈分配对象的实例变量被视为局部变量,所以我猜它们会在堆栈上分配。
      • 好的,谢谢。现在我有理由升级我的 java 虚拟机了。我没有更新它,因为我发现没有变化,但我想我错了。谢谢大家。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多