6

JVM在内存中分配这些区域:Class(Method) Area、Heap、Stack、Program counter Register、Native method stack。

我知道堆用于存储对象,堆栈用于存储局部变量和部分结果。根据定义,Class(Method) Area 存储每个类的结构,例如运行时常量池、字段和方法数据、方法的代码。但我真的不明白其中的区别。

谁能解释一下类区和堆之间的区别?

4

2 回答 2

15

Java 6 将所有常量池和类信息存储在 Perm Gen 中

Java 7 仅将类信息存储在 Perm Gen 中。字符串字面量池位于堆上。

Java 8 没有 Perm Gen。文字池和类信息在堆上。

您已经解释了差异。类结构(如方法)存储在 perm gen 中。每个实例中的数据都存储在堆中。

它们是分开的,因为这些类型的数据具有非常不同的生命周期,例如对象通常寿命很短,而类通常寿命很长。

AFAIK 他们正在删除它,因为太多的开发人员发现它令人困惑。

于 2013-10-12T23:00:12.347 回答
7

类(方法)区域存储代码——这是你的程序的代码。堆存储对象实例。例如:

public void MakeSomeFruit(){

   Fruit myFruit=new Fruit();

}
  • MakeSomeFruit 代码存储在类区域中。
  • 执行时,它创建的实际 Fruit 实例存储在堆中。
  • 执行时,myFruit引用变量存储在堆栈中。这只是一个指向内存中实例位置的数字 - 一个地址。
于 2013-10-12T22:58:16.423 回答