在Java中存储静态方法和静态变量在哪里?

例如:

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;
    }
}

这些变量将在Java中,堆或栈内存中存储在哪里? 他们如何存储?


静态方法(实际上所有的方法)以及静态变量都存储在堆的PermGen部分,因为它们是反射数据的一部分(与类相关的数据,与实例无关)。

澄清更新:

请注意,只有变量及其技术值(基元或参考)存储在PermGen空间中。

如果您的静态变量是对象的引用,则该对象本身存储在堆的正常部分(年轻/旧一代或幸存空间)中。 这些对象(除非它们是像类这样的内部对象)不存储在PermGen空间中。

例:

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.


关于垃圾收集的一个词:

不要依赖finalize()因为它不能保证运行。 这完全取决于JVM决定何时运行垃圾收集器以及要收集什么,即使对象可用于垃圾收集。

当然,你可以设置一个静态变量为null,从而移除对堆上对象的引用,但这并不意味着垃圾收集器将收集它(即使没有更多引用)。

此外finalize()只运行一次,所以你必须确保它不会抛出异常或者阻止收集对象。 如果你通过某个异常终止了finalize()finalize()将不会再次在同一个对象上被调用。

最后一点:如何存储代码,运行时数据等取决于所使用的JVM,即HotSpot可能与JRockit不同,它可能在相同JVM的版本之间有所不同。 以上是基于HotSpot for Java 5和6(基本上是相同的),因为在回答时我会说大多数人使用这些JVM。 由于Java 8的内存模型发生了重大变化,上述语句可能不适用于Java 8 HotSpot - 我没有检查Java 7 HotSpot的变化,所以我想上面的版本仍然适用于该版本,但我不确定。


类变量(静态变量)作为与该类关联的Class object一部分存储。 这个Class对象只能由JVM创建并存储在permanent generation

还有一些人回答说它存储在称为Method Area.非堆Method Area. 即使这个答案没有错。 Permgen Area是否是堆的一部分,这只是一个有争议的话题。 很显然,人与人之间的看法各不相同。 在我看来,我们在JVM参数中提供了堆空间和permgen空间。 因此,以不同的方式对待他们是一个很好的假设。

另一种方式看到它

内存池由JVM内存管理器在运行时创建。 内存池可能属于堆或非堆内存。运行时常量池是类文件中constant_pool表的每类或每界面运行时表示。 每个运行时常量池都从Java虚拟机的方法区域分配,静态变量存储在此方法区域中。 另外这个非堆不过是烫发区域。实际上,方法区域是烫发的一部分(参考)

在这里输入图像描述


这是一个简单的答案和冗长的回答。

简单的答案是堆。 类和适用于类的所有数据(不是实例数据)存储在堆的永久生成部分。

长的答案已经在堆栈溢出:

JVM中的内存和垃圾收集有一个完整的描述,以及更简洁的解释。

链接地址: http://www.djcxy.com/p/82853.html

上一篇: Where are static methods and static variables stored in Java?

下一篇: Memory allocation during class loading