我正在测试缓存实现的 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 内存分析器查看堆内容,在这两种情况下,除了 Soft 之外,没有其他引用链。
如果有人对这种奇怪的行为有解释,我很感兴趣。