我阅读了很多文章,但是不明白——在实践中,我什么时候需要使用弱引用(Weak References)和虚引用(Phantom References)?据我所知,软引用(Soft References)是缓存的好选择。但是弱引用和虚引用,我不知道什么时候使用。请提供一些实际任务的示例,我们需要在什么情况下使用它们。
我阅读了很多文章,但是不明白——在实践中,我什么时候需要使用弱引用(Weak References)和虚引用(Phantom References)?据我所知,软引用(Soft References)是缓存的好选择。但是弱引用和虚引用,我不知道什么时候使用。请提供一些实际任务的示例,我们需要在什么情况下使用它们。
finalize
方法而不会消失的可终结对象,在其终结器开始运行时,将在堆栈上放置对它的强引用。在该引用(以及所有其他根引用)停止存在之前,该对象无法被删除。 - supercat我认为这篇文章对你的问题有很好的回答。
基本上,软引用比弱引用稍微强一些。 弱引用将在下一个GC周期中被丢弃,而软引用将保留在内存中,直到存在内存压力并且JVM希望尽可能多地回收内存。
您应该考虑一下具有参考价值的内容对于程序实现的重要性。如果重新创建参考非常便宜,那么我会倾向于使用WeakReference,但如果它来自数据库的值,则可能倾向于软引用,因为除非您真正需要,否则不想重新运行查询。
SoftReference对象在所有WeakReference对象被垃圾回收之前不会被回收。
因此,将不太重要的对象放入WeakReference对象中,并使用SoftReference对象来保存更重要的对象。
考虑到这些事实,您应该根据垃圾回收的需要使用好的引用对象。首先回收WeakReference,然后是SoftReference,最后是PhantomReferences。
顺便说一下,在某些情况下,为了缓存目的,使用WeakReference而不是SoftReference可能是一个好主意,因为缓存可能在内存中很重,因此需要清理。
对于PhantomReference,使用方式不同。它们用于以比Java终结机制更灵活的方式安排临死清理操作。
这篇文章稍微详细地介绍了PhantomReference的用途。
finalize
方法(也称资源清理)时才有用。它们与缓存或对象何时被垃圾回收无关。 - jtahlbornehcache
。良好的缓存充满了微妙之处,你不想自己重新发明轮子,堆上对象的生命周期绝不是提供良好缓存性能的唯一方式。现代缓存甚至不使用堆进行缓存,而是使用堆外存储,因为它们希望完全控制缓存对象的生命周期。 - Marko Topolnik