我最近深入研究了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?中。
仅供参考
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");
}
}发布于 2022-08-11 04:35:36
所有代码都保存在metaspace中。
所有类元数据都保存在元空间中。
所有静态变量都保存在堆中。
所以:
总之,静态方法、静态变量、静态类都存储在
中吗?
答案是1) metaspace和2)堆。这取决于你的意思。然而,元数据是静态类的唯一方面,它具有表示形式,并且存储在metaspace中。
请注意,应用程序无法获得包含静态变量的实际方法代码、类元数据或框架。
还请注意,类元数据、方法代码和静态框架在创建(例如)对象时没有复制。
因此,它们实际上被储存在哪里是毫无意义的。
一些文章说静态变量,静态类不能被垃圾收集器删除。
那些文章不正确..。如果他们真的这么说的话。现实情况是,如果一个类变得不可访问,它可能会被垃圾收集,但是创建一个类变得不可访问的条件并不容易。因此,在实践中,很少会收集垃圾。
同样,如果类本身不可访问,则类的静态变量将变得不可访问。但这也是罕见的,见上文。
但是无论如何,你试图做出的逻辑推理是不正确的。对于JVM的一种存储管理机制来说,在堆中既不需要,也不足以回收一些东西。
在metaspace中分配的deleted.
https://stackoverflow.com/questions/73314816
复制相似问题