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

2022-01-16 00:00:00 jvm java heap-memory jvm-hotspot

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

Is an instance variable of an object in Java stored on the stack or method area of the JVM?

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

Also, do we have different instance variable for multiple threads?

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

If it is stored in method area how is instance variable different from static variable storage?

推荐答案

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

Stack and heap are the memories allocated by the OS to the JVM that runs in the system.Stack is a memory place where the methods and the local variables are stored. (variable references either primitive or object references are also stored in the stack). Heap is a memory place where the objects and its instance variable are stored.

总结一下:

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

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

Also, do we have different instance variable for multiple threads?

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

Every thread will have a program counter (PC) and a java stack. PC will use the java stack to store the intermediate values, dynamic linking, return values for methods and dispatch exceptions. This is used in the place of registers.

另外关于线程的更多信息,你真的应该阅读这个主题 Where线程对象是创建的吗?堆栈还是堆?.

Also for more about thread, you really should read this topic Where is Thread Object created? Stack or Heap?.

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

If it is stored in method area how is instance variable different from static variable storage?

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

As you can see above static fields are stored in heap. On the other hand, local variables are stored in stack.

//编辑

根据 Bruno Reis 和 Peter Lawrey,您还应该阅读逃逸分析

According to the comments of Bruno Reis and Peter Lawrey, you should also read about Escape analysis

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

相关文章