一尘不染

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

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,堆或堆栈存储器中存储在哪里?它们如何存储?


阅读 3679

收藏
2020-03-06

共1个答案

一尘不染

静态方法(实际上是所有方法)以及静态变量都存储在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()则不会再次在同一对象上调用。

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

2020-03-06