首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态存储在上面版本的java8中的地方?

问静态存储在上面版本的java8中的地方?
EN

Stack Overflow用户
提问于 2022-08-11 03:04:08
回答 1查看 100关注 0票数 -2

我最近深入研究了java。在Java 7中,“静态变量”和“静态方法”存储在“方法区域”中,但是自从Java 8之后,我在JVM规范中看到了这句话

The proposed implementation will allocate class meta-data in native memory and move interned Strings and class statics to the Java heap --有一篇文章说静态变量,垃圾收集器不能删除静态类,也有文章说静态类不能被垃圾收集器删除(因为Java8静态类,静态变量在堆内存中),我现在很困惑。

总结,其中静态方法、静态变量、静态类存储在java8?中。

仅供参考

代码语言:javascript
复制
public class Example {
    public static int staticInt = 5; // <- static variable

    public static class StaticInnerExample { //<- static class
    }

    public static void hello() { // <- static method
        System.out.println("hello");
    }


}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-11 04:35:36

所有代码都保存在metaspace中。

所有类元数据都保存在元空间中。

所有静态变量都保存在堆中。

所以:

总之,静态方法、静态变量、静态类都存储在

中吗?

答案是1) metaspace和2)堆。这取决于你的意思。然而,元数据是静态类的唯一方面,它具有表示形式,并且存储在metaspace中。

请注意,应用程序无法获得包含静态变量的实际方法代码、类元数据或框架。

还请注意,类元数据、方法代码和静态框架在创建(例如)对象时没有复制。

因此,它们实际上被储存在哪里是毫无意义的。

一些文章说静态变量,静态类不能被垃圾收集器删除。

那些文章不正确..。如果他们真的这么说的话。现实情况是,如果一个类变得不可访问,它可能会被垃圾收集,但是创建一个类变得不可访问的条件并不容易。因此,在实践中,很少会收集垃圾。

同样,如果类本身不可访问,则类的静态变量将变得不可访问。但这也是罕见的,见上文。

但是无论如何,你试图做出的逻辑推理是不正确的。对于JVM的一种存储管理机制来说,在堆中既不需要,也不足以回收一些东西。

在metaspace中分配的deleted.

  • Things
  • 在堆中分配的东西不一定符合删除的条件。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73314816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档