存储在JVM中的Object的实例变量在哪里?

时间:2014-05-08 19:01:52

标签: java jvm heap-memory jvm-hotspot

Java中对象的实例变量是存储在JVM的堆栈或方法区域中的吗?

另外,我们为多个线程设置了不同的实例变量吗?

如果它存储在方法区域中,实例变量与静态变量存储的不同之处是什么?

3 个答案:

答案 0 :(得分:20)

堆栈是操作系统分配给运行在JVM中的JVM的内存 system Stack 是存储方法和局部变量的内存位置。     (变量引用原始对象引用也存储在堆栈中)。 是存储对象及其实例变量的内存位置。

总结一下:

  • 类对象,包括方法代码和静态字段:heap。
  • 对象,包括实例字段:heap。
  • 局部变量和对方法的调用:stack
  

另外,我们为多个线程设置了不同的实例变量吗?

每个线程都有一个程序计数器(PC)和一个java堆栈。 PC将使用java堆栈来存储中间值,动态链接,方法的返回值和调度异常。这用于代替寄存器。

另外,关于线程的更多信息,你真的应该阅读这个主题Where is Thread Object created? Stack or Heap?

  

如果它存储在方法区域中,实例变量的不同之处   静态变量存储?

正如您所见,静态字段存储在堆中。另一方面,局部变量存储在堆栈中。

//编辑

根据Bruno ReisPeter Lawrey的评论,您还应该阅读转义分析

  1. Wikipedia
  2. Virtual Machine Performance Enhancements,Escape Analysis

答案 1 :(得分:4)

准确地说,

  • 实例变量将存储在堆上。
  • 堆栈上的局部变量(如果变量不是原始 [引用变量]引用变量存在于堆栈上
    和堆上的对象)。只有方法调用和部分结果 将存储在堆栈中而不是方法本身。
  • 静态变量和方法(包括静态和非静态) 方法区。

参考:Head First Java

答案 2 :(得分:1)

大多数JVM实现将内存分为以下几部分:

  1. 方法区域
  2. 堆栈
  3. 个人电脑寄存器
  4. 本机方法堆栈。

让我们仅讨论方法区域,堆栈和堆。

例如参加课程

class Lava {
  int i = 5;
  static int j = 10;
  void flow() { //some implementation}
 }

从类X创建此对象的实例时

Lava l = new Lava();

首先,熔岩的类类型(即Lava.class)存储在您的“方法”区域中,其中包含方法,字段和其他引用类型等详细信息。同样,在我们的示例中,像 j 这样的静态变量也存储在“方法”区域本身中。

第二个对象熔岩的实例及其实例变量(即i)存储在堆区中。

第三,在我们的示例中,其引用即 l 存储在堆栈区域中,该区域指向在堆中创建的实例。