“static final”被直接分配到哪里?年轻代还是老年代还是永久代?

3
“static final”变量是直接分配到年轻代、老年代还是永久代?(我猜它最有可能会随着时间被分配到老年代。)如果它被分配到了永久代,那么在永久代中类卸载的时候,它会被垃圾回收吗?

除非您在调试模式下运行,否则无法卸载类,因此静态final声明直到应用程序结束才会被JVM垃圾回收。 - Yanick Rochon
1
@Yanick - 实际上,任何使用Class.forName()加载的类都有可能变得无法访问,并且根据JVM选项,可能会被卸载/垃圾回收。 - Stephen C
1
@Stephen C,说得对。但是这假设该类确实是GC的候选对象,并且JVM已设置为允许它。在大多数情况下,这不会发生。但我想现在我离题了... - Yanick Rochon
@Yanick - 你的评论说“永远不”。那是不正确的。 - Stephen C
1个回答

8
一个被static final变量引用的对象将按照与任何其他对象相同的规则进行分配。它最有可能分配在年轻代,或者在老年代(如果它很大并且满足某些其他条件)。
该对象将由执行某些任意代码的new分配。 JVM无法知道该对象(最终)将被分配给static final变量。
包含静态变量的框架空间可能分配在permGen中。当然,这不是常规的Java对象。
这取决于permGen是否进行垃圾回收。在现代JVM中,它会进行垃圾回收,并且我期望在相同的GC周期或下一个周期中垃圾回收卸载类的静态引用的对象,假设它们是不可达的。
无论哪种方式,您都不应编写依赖于这些细节的应用程序。它们是JVM特定的。
请注意,自Java 8起,这个问题已经不再重要,因为永久代 已经不存在

3
"无论如何,您都不应该编写依赖于这些细节的应用程序。它们是特定于JVM的。" Static final意味着它是静态和不可变的。假设更多可能会带来风险... - bwawok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接