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().

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

转载注明原文:Java中存储的静态方法和静态变量在哪里? - 代码日志