- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 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();
}
}
当 java 像这样调用时:java -Xms2m -Xmx2m -cp guava-r09.jar:. test.MapMakerTest
(堆设置故意设置得如此之小,以便更容易看到发生了什么)在第 60 次迭代时它会爆炸并出现 OutOfMemoryError: HeapSpace。
但是,当映射为 Map<String, SoftReference<String>>
(并根据其余代码的变化:监听器和 put)时,我可以看到正在发生驱逐,并且代码简单地工作,并且值被垃圾收集。
在所有文档中,包括这个文档:http://guava-libraries.googlecode.com/svn/tags/release09/javadoc/index.html,都没有明确提到 SoftReferences。调用 put 时,Map 实现不应该将值包装在 SoftReference 中吗?我真的对假定的用法感到困惑。
我正在使用 Guava r09。
谁能解释我做错了什么,为什么我的假设是错误的?
最好的问候,乌耶克
最佳答案
您对键和值使用相同的对象,因此它作为键是强可达的,并且不符合垃圾回收的条件,尽管值是软可达的:
map.put(s, s);
尝试使用不同的实例:
map.put(s, new String(s));
关于java - google-guava MapMaker .softValues() - 值没有得到 GC-ed,OOME : HeapSpace follows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6946213/
我用的是 Guava 17.0 private static final ConcurrentMap imageMap = new MapMaker().softValues().ma
我在使用 google-guava 的 MapMaker 时遇到问题。这是代码: package test; import java.lang.ref.SoftReference; import ja
我是一名优秀的程序员,十分优秀!