存储在JVM中的Object的实例变量在哪里?
Java中的对象的实例变量是存储在JVM的堆栈或方法区域中的吗?
另外,我们为多个线程设置了不同的实例变量吗?
如果它存储在方法区域中,实例变量与静态变量存储的不同之处是什么?
堆栈和堆是操作系统分配给系统中运行的JVM的内存。 堆栈是存储方法和局部变量的存储位置。 (变量引用基元或对象引用也存储在堆栈中)。 堆是存储对象及其实例变量的存储位置。
总结一下:
- 类对象,包括方法代码和静态字段:heap。
- 对象,包括实例字段:堆。
- 局部变量和对方法的调用:stack
另外,我们为多个线程设置了不同的实例变量吗?
每个线程都有一个程序计数器(PC)和一个java堆栈。 PC将使用java堆栈来存储中间值,动态链接,方法的返回值和调度exception。 这用于代替寄存器。
另外,关于线程的更多信息,你真的应该阅读这个主题在哪里创建线程对象? 堆栈还是堆? 。
如果它存储在方法区域中,实例变量与静态变量存储的不同之处是什么?
如上所示, 静态字段存储在堆中。 另一方面, 局部变量存储在堆栈中。
//编辑
根据Bruno Reis和Peter Lawrey的评论,您还应该阅读Escape分析
- 维基百科
- 虚拟机性能增强,逃逸分析
确切地说,
- 实例变量将存储在堆上。
- 堆栈上的局部变量(如果变量不是原始的 [引用变量]引用变量存在于堆栈中
和堆上的对象)。 只有方法调用和部分结果才会存储在堆栈中而不是方法本身。 - 方法区域上的静态变量和方法(包括静态和非静态)。
参考:Head First Java