2014-05-08 117 views
12

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

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

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

+0

实例变量是每个对象之一。静态变量是每个类的一个。线程(有点)共享相同的内存 –

回答

16

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

所以要概括:

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

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

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

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

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

正如您在上面看到的静态字段存储在堆中。另一方面,局部变量被存储在堆栈中。

//编辑

Bruno ReisPeter Lawrey的意见,你也应该阅读有关逃逸分析

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

这不是严格正确的。现代JVM更复杂,并且具有优化算法,这些算法可以确定将给定对象存储在*堆栈*上的给定情况下可能导致更好的性能(即,对GC的压力更小)。例如,谷歌JVM逃逸分析。无论如何,除非你写的东西真的很低,否则你不应该在意堆或堆栈中是否存储了某些东西。 –

+0

我不是说这是严格正确的。这只是一个非常简单的视图,变量是如何存储在Java中的。 –

+1

@BrunoReis为真,但逃逸分析很少导致避免使用堆。 –

2

准确地说,

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

参考:头第一个Java