Java 我是否需要保留对仅用于执行终结的WeakReference的强引用?

Java 我是否需要保留对仅用于执行终结的WeakReference的强引用?,java,garbage-collection,weak-references,Java,Garbage Collection,Weak References,我希望使用WeakReference作为更有效的finalize()方法,以便在不使用finalize的情况下尽快释放与对象关联的本机资源(这比使用WeakReference的成本要高得多) 由于这是WeakReference的唯一目的(我永远不会使用WeakReference来获取引用的对象),因此花费时间和空间来维护我的WeakReference列表以防止它们被垃圾收集似乎是浪费 但是,如果构造了一个普通对象,并且没有保留对它的强引用,它将被垃圾收集器释放,我在Javadoc中找不到任何东西

我希望使用WeakReference作为更有效的finalize()方法,以便在不使用finalize的情况下尽快释放与对象关联的本机资源(这比使用WeakReference的成本要高得多)

由于这是WeakReference的唯一目的(我永远不会使用WeakReference来获取引用的对象),因此花费时间和空间来维护我的WeakReference列表以防止它们被垃圾收集似乎是浪费

但是,如果构造了一个普通对象,并且没有保留对它的强引用,它将被垃圾收集器释放,我在Javadoc中找不到任何东西表明这与WeakReference不同

是否有必要保留对WeakReference的引用以防止其被垃圾收集,或者,如果要将其排入ReferenceQueue中,是否会使其保持活动状态,直到从队列中收集为止

是否有必要保留对WeakReference的引用以防止其被垃圾收集

看看
java.lang.ref
,它用一整段来回答您的问题:

注册的引用对象与其队列之间的关系是单方面的。也就是说,队列不跟踪向其注册的引用。如果注册的引用本身变得不可访问,那么它将永远不会排队。使用引用对象的程序有责任确保只要程序对其引用对象感兴趣,对象就保持可访问性


我想使用WeakReference作为更有效的finalize()方法,等等,怎么做?@SotiriosDelimanolis这涉及到使用一个线程专门清理伪finalizer WeakReference,并使本机资源不在伪finalizable类中,而是在WeakReference对象中。伪finalizable类保留对保存其本机资源的WeakReference的引用。当发现伪可终结类仅被弱引用时,WeakReference将排队到您在构造WeakReference时指定的ReferenceQueue中。清理线程从ReferenceQueue中获取并提示WeakReference进行清理。从开发时间的角度来看,这并不便宜,但从性能的角度来看,如果计算可终结对象时使用的全局锁成为瓶颈,如果JVM在收集可终结对象方面特别懒散,导致内存保留过多,这可能会有所帮助。您的队列将只包含对
WeakReference
对象的引用。如何清理原始包装的目标?这个问题没有意义。如果你没有对弱引用的强引用,你也没有弱引用。或者你是在强引用和弱引用之间问弱引用?