class A {
static int i=0;
static int j;
static void method() {
// static k=0; can't use static for local variables only final is permitted
// static int L;
}
}
static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.
类变量(静态变量)存储为与该类关联的 Class object的一部分。这个 Class 对象只能由 JVM 创建,并存储在 permanent generation中。
也有人回答说,它是存储在非堆区域,这是所谓的 Method Area.即使这个答案是没有错误的。Permgen Area 是否是堆的一部分,这是一个有争议的话题。显然每个人的看法不同。在我看来,我们在 JVM 参数中提供堆空间和 permgen 空间的方式不同。因此,区别对待它们是一个很好的假设。
换个角度看
内存池是由 JVM 内存管理器在运行时创建的。内存池可以属于堆内存,也可以属于非堆内存。运行时常量池是类文件中常量 _ pool 表的每个类或每个接口的运行时表示形式。每个运行时常量池都是从 Java 虚拟机的方法区域分配的,静态变量存储在这个方法区域中。
此外,这个非堆只是 perm gen 区域。实际上方法区域是 perm gen (参考文献)的一部分