我在使用google-guava的MapMaker时遇到了问题。代码如下:
package test;
import java.lang.ref.SoftReference;
import java.util.Map;
import java.util.Random;
import com.google.common.collect.MapEvictionListener;
import com.google.common.collect.MapMaker;
public class MapMakerTest {
private static Random RANDOM = new Random();
private static char[] CHARS =
("abcdefghijklmnopqrstuvwxyz" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"1234567890-=!@#$%^&*()_+").toCharArray();
public static void main(String[] args) throws Exception {
MapEvictionListener<String, String> listener = new MapEvictionListener<String, String>() {
@Override
public void onEviction(String key, String value) {
System.out.println(">>>>> evicted");
}
};
Map<String, String> map = new MapMaker().
concurrencyLevel(1).softValues().
evictionListener(listener).makeMap();
while (true) {
System.out.println(map.size());
String s = getRandomString();
map.put(s, s);
Thread.sleep(50);
}
}
private static String getRandomString() {
int total = 50000;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < total; ++i) {
sb.append(CHARS[RANDOM.nextInt(CHARS.length)]);
}
return sb.toString();
}
}但是,当映射为Map<String, SoftReference<String>>时(根据其余代码的更改:侦听器和put),我可以看到驱逐发生了,代码简单地工作,值被垃圾收集。
在所有文档中,包括这个文档:http://guava-libraries.googlecode.com/svn/tags/release09/javadoc/index.html,都没有明确提到SoftReferences。映射实现不应该在调用put时将值包装在SoftReference中吗?
谁能解释一下我做错了什么,为什么我的假设是错误的?
向你致以最好的问候,武杰克
发布于 2011-08-05 02:10:18
您对key和value使用相同的对象,因此它作为key是强可达的,并且不符合垃圾收集的条件,尽管value是软可达的:
map.put(s, s); 尝试使用不同的实例:
map.put(s, new String(s));https://stackoverflow.com/questions/6946213
复制相似问题