【发布时间】:2014-06-26 08:29:31
【问题描述】:
Java中对象的实例变量是否存储在JVM的堆栈或方法区?
另外,我们是否有多个线程的不同实例变量?
如果存储在方法区,实例变量与静态变量存储有何不同?
【问题讨论】:
-
实例变量是每个对象一个。静态变量是每个类一个。线程(有点)共享相同的内存
标签: java jvm heap-memory jvm-hotspot
Java中对象的实例变量是否存储在JVM的堆栈或方法区?
另外,我们是否有多个线程的不同实例变量?
如果存储在方法区,实例变量与静态变量存储有何不同?
【问题讨论】:
标签: java jvm heap-memory jvm-hotspot
大部分 JVM 实现将内存分为以下几部分:
让我们只讨论方法区、堆栈和堆。
例如上课
class Lava {
int i = 5;
static int j = 10;
void flow() { //some implementation}
}
当这个对象的一个实例从一个类 X 中创建时
Lava l = new Lava();
首先,Lava 的 Class 类型,即Lava.class 存储在您的 Method 区域中,其中包含方法、字段和其他引用类型等详细信息。此外,我们示例中的 j 等静态变量也存储在方法区域本身中。
第二个对象熔岩的实例存储在堆区以及它的实例变量,即i.
第三,它的引用,即我们例子中的l存储在Stack area中,它指向在Heap中创建的实例。
【讨论】:
准确来说,
参考:Head First Java
【讨论】:
Stack和heap是操作系统分配给JVM的内存,运行在 system.堆栈是存储方法和局部变量的内存位置。 (变量引用 primitive 或 object 引用也存储在堆栈中)。 堆是存储对象及其实例变量的内存位置。
总结一下:
另外,我们是否有多个线程的不同实例变量?
每个线程都有一个程序计数器 (PC) 和一个 java 堆栈。 PC 将使用 java 堆栈来存储中间值、动态链接、方法的返回值和调度异常。这用于代替寄存器。
还有关于线程的更多信息,你真的应该阅读这个主题Where is Thread Object created? Stack or Heap?。
如果它存储在方法区域中,实例变量与 静态变量存储?
如上所示,静态字段存储在堆中。另一方面,局部变量存储在堆栈中。
//编辑
根据Bruno Reis和Peter Lawrey的cmets,你还应该阅读逃逸分析
【讨论】: