首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >google-guava MapMaker .softValues() -值没有GC-ed,OOME: HeapSpace如下

google-guava MapMaker .softValues() -值没有GC-ed,OOME: HeapSpace如下
EN

Stack Overflow用户
提问于 2011-08-05 01:54:25
回答 1查看 618关注 0票数 1

我在使用google-guava的MapMaker时遇到了问题。代码如下:

代码语言:javascript
复制
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中吗?

谁能解释一下我做错了什么,为什么我的假设是错误的?

向你致以最好的问候,武杰克

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-05 02:10:18

您对key和value使用相同的对象,因此它作为key是强可达的,并且不符合垃圾收集的条件,尽管value是软可达的:

代码语言:javascript
复制
map.put(s, s); 

尝试使用不同的实例:

代码语言:javascript
复制
map.put(s, new String(s));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6946213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档