【发布时间】:2014-03-04 03:42:50
【问题描述】:
我正在测试缓存实现的 SoftReference,我发现了一个奇怪的行为:
我有一个 setName(String name) 方法,它通过 SoftReference 设置 Graph 对象的名称:
public void setName(String newName) {
getData().name = new SoftReference<String>(newName,garbagedData);
}
(garbagedData 是一个 ReferenceQueue,在这个特定问题中似乎并不重要)。
当我从主线程调用graph.setName("name"); 时,当à 强制OutOfMemory 错误时,引用指向的值不会被垃圾,但如果我调用graph.setName(new String("name")),那么它就是。
我用 Eclipse 内存分析器查看堆内容,在这两种情况下,除了软引用链之外,没有其他引用链。
如果有人对这种奇怪的行为有解释,我很感兴趣。
【问题讨论】:
-
内存有限的缓存是一个非常糟糕的主意:旧项目将被保存很长时间。
-
@kdgregory:我同意这是一个坏主意,但大多数情况下你根本无法控制。但是您通常无法判断“使用寿命”是多少,并且无法平衡不同的缓存(例如:您必须决定诸如“缓存 1 的限制是否应为 1000 个条目?”而不是“让缓存 1和 cache-2 一起使用不超过 100 MB")。
-
就我而言,“使用寿命”是最长的。但是如果我使用强引用,可能会出现内存不足。 @kdgregory:如果 gc 可以在需要时删除它们,那么将对象保存在内存中是一件坏事吗? @maaartinus:我总是可以手动将引用设置为 null 并限制缓存大小,我错了吗?
标签: java garbage-collection soft-references