2010-09-27 50 views
2

是一个“静态最终”直接分配到年轻的gen或老gen或perm gen吗? (我想这很可能会在我想象的时间内落入旧有的)。如果它被分配在烫发中,那么当在彼尔姆根课堂卸载时它会被垃圾收集吗?哪里做了一个“静态final”直接分配进去?年轻的gen或老gen或perm gen?

+0

除非以调试模式运行,否则无法卸载类,因此静态最终声明从不会被JVM收集垃圾,直到应用程序结束。 – 2010-09-27 00:36:54

+1

@Yanick - 实际上,使用'Class.forName()'加载的任何类都可能变得无法访问,并且会受到卸载/垃圾回收......取决于JVM选项。 – 2010-09-27 01:44:45

+1

@Stephen C,真实。然而,这是假定这个类实际上是GC的候选者,并且JVM被设置为允许它。在大多数情况下,它不会发生。但我想我现在要脱离主题... – 2010-09-27 02:26:39

回答

5

是一个“静态最终”直接分配到年轻的gen或老gen或perm gen吗?

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

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

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

如果它是在perm gen中分配的,那么当在Perm Gen上的类卸载发生时它会被垃圾收集吗?

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

无论哪种方式,您都不应该编写您的应用程序来依赖任何这些细节。它们是JVM特定的。

+2

+1“无论哪种方式,你都不应该编写你的应用程序来依赖任何这些细节,它们是特定于JVM的。”静态最终,意味着它是静态的和最终的。似乎有危险承担更多... – bwawok 2010-09-27 03:27:20