2011-11-19 42 views
0

在java(1.6或更早版本)中,是否有任何類型的對象不受垃圾回收處理?是否有任何不受垃圾回收處理的對象?

+2

你的意思是說你聽說過一些對象沒有被垃圾收集? – jkschneider

+0

@jskchneider:根據我讀過的文章,它指定「程序也可以創建不受垃圾收集影響的對象」,但他們沒有特別指定對象。 – Saravanan

+0

沒有這樣的對象類型。有些對象可以被本機代碼(JNI引用)固定,但是它們再次被垃圾收集器檢查,只是被認爲是根。 – bestsss

回答

1

所有的java對象都會被垃圾收集。然而,本地資源不是由垃圾收集器直接管理的,有些像窗口句柄(JFrame)在實現finalize()方法時被垃圾收集器釋放,其他需要手動資源管理。

此外,jvm在關閉之前不必收集現有對象,這可能會導致微妙的錯誤,如數據不會刷新到磁盤。

最後還有針對實時系統或智能卡的Java規範擴展,其中包含非託管內存,以​​實現性能和資源原因。但是這不適用於標準的jvm。

1

這取決於你說什麼'對象'的意思。除字符串外的所有基本類型以及未在JVM堆上分配的所有數據(使用新操作符)不受GC影響。其他一切都以GC爲準。

+0

+1:原語也可以在對象中,但是堆棧中的原語不是。 –

+0

'String'不是原始類型。 –

+0

@你說得對,但我對GC的回答仍然存在 - 字符串受GC影響。 – Alex

1

根據實現情況,即使靜態字段保存在「對象」(您可以在堆轉儲中看到)中,這些對象在拋棄Class時會被清除。

你可能指的是代理數據結構。這些包括GUI組件,線程和直接/內存映射的ByteBuffers。在任何情況下,對象都在堆上,但是數據結構不在堆上。