【问题标题】:where does a "static final" directly allocated into? young gen or old gen or perm gen?“静态最终”直接分配到哪里?年轻一代还是老一代还是烫发一代?
【发布时间】:2011-04-17 13:24:32
【问题描述】:

“静态最终”是直接分配给年轻代还是老代或永久代? (我想它很可能会随着时间的推移进入旧代。)如果它是在 perm gen 中分配的,那么当在 Perm Gen 中进行类卸载时它会被垃圾收集吗?

【问题讨论】:

  • 除非您在调试模式下运行,否则您无法卸载类,因此在应用程序结束之前,静态最终声明永远不会被 JVM 收集垃圾。
  • @Yanick - 实际上,使用 Class.forName() 加载的任何类都可能变得无法访问,并且可能会被卸载/垃圾收集...取决于 JVM 选项。
  • @Stephen C,是的。然而,这是假设该类实际上是 GC 的候选者,并且 JVM 已设置为允许它。在大多数情况下,它不会发生。但我想我现在要跑题了……
  • @Yanick - 你的评论说“从不”......这是不正确的。

标签: java memory-management garbage-collection heap-memory


【解决方案1】:

“静态final”是直接分配给young gen还是old gen或perm gen?

static final 变量引用的对象将根据与任何其他对象相同的规则进行分配。它最有可能分配在年轻代或年老代(如果它很大并且适用某些其他条件)。

该对象将由new在一些任意代码中执行分配。 JVM 无法知道该对象将(最终)分配给static final 变量。

包含静态变量的框架空间可能在 permGen 中分配。当然,这不是一个普通的 Java 对象。

如果它是在perm gen中分配的,那么在Perm Gen中进行类卸载时是否会被垃圾回收?

这取决于 permGen 是否被垃圾回收。在现代 JVM 中确实如此,我希望卸载的类静态引用的对象将在同一个 GC 周期或下一个 GC 周期中被垃圾收集......假设它们无法访问。

无论哪种方式,您都不应该将您的应用程序编码为依赖于这些细节中的任何一个。它们是特定于 JVM 的。


请注意,从 Java 8 开始,这个问题自 permgen is no more 起没有实际意义。

【讨论】:

  • +1 "无论如何,您都不应该将您的应用程序编码为依赖于这些细节中的任何一个。它们是特定于 JVM 的。" static final,意味着它是静态的和最终的。假设更多似乎很危险......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 2010-11-24
  • 1970-01-01
相关资源
最近更新 更多