对象的实例变量存储在 JVM 中的什么位置?

2022-09-02 12:17:15

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

另外,对于多个线程,我们是否有不同的实例变量?

如果它存储在方法区域中,实例变量与静态变量存储有何不同?


答案 1

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

所以总结一下:

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

另外,对于多个线程,我们是否有不同的实例变量?

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

另外,有关线程的更多信息,您确实应该阅读本主题 线程对象在哪里创建?堆栈还是堆?

如果它存储在方法区域中,实例变量与静态变量存储有何不同?

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

编辑

根据Bruno ReisPeter Lawrey的评论,您还应该阅读有关Escape分析的信息。

  1. 维基百科
  2. 虚拟机性能增强,转义分析

答案 2

确切地说,

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

参考:Head First Java


推荐