gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:16:25 27 4
gpt4 key购买 nike

例如:

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部分中,因为它们是反射数据的一部分(与类相关的数据,而不是与实例相关的数据) 。从 Java 8 PermGen 开始,已被 MetaSpace 取代,根据 JEP 122它只保存元数据,而静态字段存储在堆中。

请注意,这主要适用于 Oracle 的 Hotspot JVM 和其他基于它的产品。然而,并不是每个 JVM 都有像 Eclipse OpenJ9 这样的 PermGen 或 Metaspace。 .

更新澄清:

请注意,只有变量及其技术值(基元或引用)存储在 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 的变化,所以我猜测上述内容对于该版本仍然如此,但我在这里不确定。

关于java - Java中静态方法和静态变量存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31754037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com