我读过this article关于Java语言中不同类型的引用(强,软,弱,幻影),但我并不是真的理解它。
这些引用类型之间有什么区别,什么时候会使用每种类型?
发布于 2014-05-07 21:50:30
Java提供了两种不同类型/类的引用对象:强和弱。弱参照对象又可进一步分为软参照对象和幻影参照对象。
让我们一点一点地来。
强引用对象
StringBuilder builder = new StringBuilder();
这是引用对象的默认类型/类,如果没有指定的话:builder
是一个强引用对象。这种引用使得被引用的对象不符合GC的条件。也就是说,每当一个对象被一系列强引用对象引用时,它就不能被垃圾回收。
弱引用对象
WeakReference<StringBuilder> weakBuilder = new WeakReference<StringBuilder>(builder);
弱引用对象不是引用对象的默认类型/类,要使用它们,应该像上面的示例中那样显式指定它们。这种引用使引用对象符合GC的条件。也就是说,如果内存中StringBuilder
对象的唯一可达引用实际上是弱引用,则允许GC对StringBuilder
对象进行垃圾回收。当内存中的对象只能由弱引用对象访问时,它将自动成为GC的合格对象。
级别的弱点
可以使用两种不同级别的弱点:软性和幻影。
软引用对象基本上是保留在内存中的弱引用对象:通常,它拒绝GC周期,直到没有内存可用,并且存在OutOfMemoryError
的风险(在这种情况下,它可以被删除)。
另一方面,幻影引用对象只有在确切地知道对象何时被有效地从内存中删除时才有用:通常它们用于修复奇怪的finalize()恢复/复活行为,因为它们实际上不返回对象本身,而只是帮助in keeping track of their memory presence。
弱引用对象是实现缓存模块的理想选择。实际上,只要对象/值不能再通过强引用链访问,就可以通过允许GC清理内存区域来实现一种自动逐出。保留弱密钥的WeakHashMap就是一个例子。
https://stackoverflow.com/questions/9809074
复制相似问题