- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
有人可以解释三个引用类之间的区别(或发布一个很好的解释的链接)吗? SoftReference
> WeakReference
> PhantomReference
,但我什么时候会使用每一个?为什么有 WeakHashMap
而没有 SoftHashMap
或 PhantomHashMap
?
如果我使用以下代码...
WeakReference<String> ref = new WeakReference<String>("Hello!");
if (ref != null) { // ref can get collected at any time...
System.gc(); // Let's assume ref gets collected here.
System.out.println(ref.get()); // Now what?!
}
...会发生什么?我是否必须在每条语句之前检查 ref
是否为空(这是错误的,但我应该怎么做 )?很抱歉这些快速的问题,但我无法理解这些 Reference
类...谢谢!
最佳答案
Java 库 documentation for the java.lang.ref
package表征了三种显式引用类型的递减强度。
当您希望被引用的对象在主机进程内存不足之前保持 Activity 状态时,您可以使用 SoftReference
。在收集器需要释放内存之前,该对象将不符合收集条件。简单地说,绑定(bind)一个 SoftReference
的意思是,“固定对象,直到你不能再使用为止。”
相比之下,当您不想影响被引用对象的生命周期时,请使用 WeakReference
;您只想对引用的对象进行单独的断言about,只要它仍然存在。对象的收集资格不受绑定(bind)的 WeakReference
存在的影响。像从对象实例到相关属性的外部映射,只要相关对象还活着,就需要记录属性,这对于 WeakReference
s 和 WeakHashMap
来说是一个很好的用途>.
最后一个——PhantomReference
——更难描述。与 WeakReference
一样,这种绑定(bind)的 PhantomReference
不会影响被引用对象的生命周期。但与其他引用类型不同的是,甚至不能取消引用 PhantomReference
。从某种意义上说,就调用者所知,它并不指向它所指向的东西。它只允许将一些相关数据与引用对象相关联——当PhantomReference
在其相关ReferenceQueue
中排队时,这些数据可以在以后进行检查和操作。通常从 PhantomReference
派生一个类型,并在该派生类型中包含一些附加数据。不幸的是,使用这种派生类型需要进行一些向下转换。
在您的示例代码中,不是 ref
引用(或者,如果您愿意,“变量”)可以为空。而是调用 Reference#get()
得到的值。那可能是空的。如果发现为null,那就来不及了;被引用的对象已经在被收集的路上:
final String val = ref.get();
if (null != val)
{
// "val" is now pinned strongly.
}
else
{
// "val" is already ready to be collected.
}
关于java - 了解 Java 的引用类 : SoftReference, WeakReference 和 PhantomReference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3329691/
我的 Android 应用程序中有一个位图缓存,其中通过 SoftReference 引用位图。然而,位图被清空得太早了。缓存中最多可以有 20 个位图,如果我加载更多,GC 开始清空 SoftRef
Map> cache = new ConcurrentHashMap>(); 我已经 map 声明了一个类似于上面的 map ,我将其用作缓存。 问题是我要在将项目添加到缓存后立即对缓存执行所有操作,
我有一个创建一系列位图的应用程序。我将这些位图保存在 SoftReferences 中,以避免内存不足。我希望堆大小在开始收集我的 SoftReferences 之前增长到最大 16MB。然而,Sof
JDK 7 文档中有关于 SoftReference 的内容。 : "All soft references to softly-reachable objects are guaranteed to
我正在为我的 Android 应用程序实现缓存机制。 我使用 SoftReference,就像我发现的许多示例一样。问题是,当我在 ListView 中向上或向下滚动时,大部分 图像已经被清除。我可以
我正在为缓存实现测试 SoftReference,我发现了一个奇怪的行为: 我有一个 setName(String name) 方法,它通过 SoftReference 设置 Graph 对象的名称:
我正在使用一个搜索库,它建议将搜索句柄对象保持打开状态,因为这有利于查询缓存。随着时间的推移,我观察到缓存趋于膨胀(几百兆并不断增长)并且 OOM 开始出现。没有办法强制执行此缓存的限制,也没有计划它
看起来 Dalvik 的垃圾收集器不尊重 SoftReferences 并尽快删除它们,就像 WeakReferences 一样。我还不是 100% 确定,但尽管事实上仍有大约 3MB 的可用内存,但
我的应用程序出现了 OutOfMemoryError。当我阅读一些教程时,我开始知道,我可以通过使用 Softreference/Weakreference 来解决这个问题。但是我不知道如何使用Sof
我有一些代码使用了 SoftReference 子类的许多实例。我想测试它在所有/只有一些/没有这些引用被暂存以在 ReferenceQueue 中清除的情况下是否正常工作。对于“无”的情况,这很简单
请解释一下弱引用的用途。我通常确实了解 Java 概念,但这一个给我带来了麻烦。 我确实理解弱引用是什么,但它们的用法和性质在我的脑海中有点模糊。我无法想象一个正确的场景,其中使用弱引用成为必要。 我
编辑 到目前为止,大多数答案都集中在我错误地扩展 map 这一事实上。我已在示例代码中更正了此问题,但类型问题仍然存在,问题仍然存在。 我试图在 Scala 中实现 SoftHashMap,但遇到了类
我在这个 link 上找到了文档描述如下: 弱引用对于映射很有用,一旦它们不再被引用(从外部),应该自动删除它们的条目。 SoftReference 和 WeakReference 之间的区别在于决定
创建这么多Strong Reference会出现OOM错误是因为GC不会收集Strong Reference,但是如果没有额外的内存,GC会收集Weak Reference。所以我的问题是:我在设置
我在处理软引用和弱引用时遇到了问题。代码有一个可以切换的标志软引用和弱引用之间的所有逻辑。虽然引用很弱,但似乎为了工作正常,使用软引用我一直得到 OutOfMemoryError。这种情况发生在 Ma
使用 SoftReference 获取任何代码要进行全面测试,必须想出某种方法来测试“是的,它已被取消”的情况。人们可能或多或少地通过使用“for-test”代码路径强制引用为空来模拟这一点,但这不会
我实现了一个自定义适配器来创建一个显示与位置相关的信息的对话框(对话框的每个条目都包含一个图像、一个显示地址的文本字段和一个显示城市和国家/地区的文本字段。)在适配器的 getView (...) 方
我正在使用一个内部数据库连接池来缓存PreparedStatements。当连接返回到池中时,缓存的Statement并没有关闭。这些会在 mySQL 驱动程序中创建 OutOfMemoryExcep
我之前得出的结论是,如果您需要一个具有基于值(等于)的相等性的 SoftReference,那么设计就会很糟糕,但内部人员除外。这是继 Google Collections 和 Guava 之后,不包
我有一个包含 100 张不同图像的 ListView 。我的缓存如下所示, public class ImageCache { HashMap> myCache; .... .
我是一名优秀的程序员,十分优秀!