2010-09-27 26 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