2011-11-19 75 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。在任何情况下,对象都在堆上,但是数据结构不在堆上。