【问题标题】:Are there any objects that are not subject to garbage collection?是否有不受垃圾回收影响的对象?
【发布时间】:2011-11-19 20:37:05
【问题描述】:

在 java(1.6 或更早版本) 中,是否有任何类型的对象不受垃圾回收的影响?

【问题讨论】:

  • 你的意思是你听说过有些对象是不受垃圾回收的?
  • @jskchneider:根据我阅读的一篇文章,它指定“程序也可以创建不受垃圾回收影响的对象”,但他们没有具体说明该对象。跨度>
  • 没有这样的对象类型。有些对象可以被本机代码(JNI 引用)固定,但它们会再次被垃圾收集器检查,只是被视为根。
  • 不保证............

标签: java garbage-collection


【解决方案1】:

所有 java 对象都受到垃圾回收的影响。然而,本机资源不直接由垃圾收集器管理,一些像窗口句柄 (JFrame) 在实现 finalize() 方法时由垃圾收集器释放,其他一些则需要手动资源管理。

此外,jvm 在关闭之前不必收集现有对象,这可能会导致一些细微的错误,例如数据未刷新到磁盘。

最后,由于性能和资源原因,Java 规范对实时系统或智能卡进行了扩展,其中包括非托管内存。但是这不适用于标准 jvm。

【讨论】:

    【解决方案2】:

    也许您听说过弱引用、软引用和幻像引用。检查这个 http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

    【讨论】:

      【解决方案3】:

      这取决于您所说的“对象”是什么意思。除字符串和所有未在 JVM 堆上分配的数据(使用 operator new)之外的所有原始类型都不受 GC 的约束。其他一切都受 GC 约束。

      【讨论】:

      • +1:原语也可以在对象中,但堆栈上的原语不是。
      • String 不是原始类型。
      • @Tom 你是对的,但我对 GC 的回答仍然有效 - 字符串受 GC 约束。
      【解决方案4】:

      根据实现,甚至静态字段都保存在“对象”中(您可以在堆转储中看到),当 Class 被丢弃时,这些字段会被清除。

      您可能指的是代理数据结构。其中包括 GUI 组件、线程和直接/内存映射的 ByteBuffer。在每种情况下,对象都在堆上,但是有数据结构不在堆上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-13
        相关资源
        最近更新 更多