论坛首页 Java企业应用论坛

理解 Java 的 GC 与 幽灵引用

浏览 60000 次
该帖已经被评为精华帖
作者 正文
   发表时间:2009-09-18  
solonote 写道

ConcurrentHashMap<String, SoftReference>
刚才自己捣鼓了一下,确实没有什么好办法可以保证当SoftReference被回收时,Key也自动被Remove.
觉得Memory Leak倒不是大问题,因为Key所占内存不多,最主要是Key过多会影响检索的效率.
个人觉得解决这个问题应该很简单:

我们使用SoftReference,必然要在获取SoftReference后需要检查SoftReference.get()是否为空,如果为空,就只有一种可能,在你没有手动Remove的情况下,虚拟机把它回收了,那么回收必然造成有一些无效的key,在这种情况下做一次清理就可以了
注意SoftReference.get()==null不应该平凡出现,除非虚拟机平凡对SoftReference进行回收,如果这样,你或许要检查你程序了。

另外通过继承ConcurrentHashMap 重写put/get几个方法,应该可以把这些操作封装到子类中,还是让子类作为一个Map<K, T>来使用。

感觉直接使用ConcurrentHashMap<String, SoftReference>还是别扭。

 

楼主,打拼音的吧。

0 请登录后投票
   发表时间:2009-09-18  
看了boost的 Smart_ptr, 感觉很神似
0 请登录后投票
   发表时间:2009-10-13  
jiyanliang 写道
patrickyao1988 写道
今天才知道原来还有这么多种引用类型的啊。。。请问有关这方面的什么书讲的比较好呢?

thinking in java中介绍 对象的集合 时在介绍持有引用时提到了一些,但是很可惜,不是很详细。。。

深入java虚拟机 第二版 第9章 也有讲到
0 请登录后投票
   发表时间:2009-12-04  
看不懂啊 需要提前预备哪些知识吗?
0 请登录后投票
   发表时间:2010-05-19  
taowen 写道
如果我用一个ConcurrentHashMap<String, SoftReference>来持有我的Cache。那么我是应该是Finalizer呢还是ReferenceQueue来把SoftReference从cache中清除出去?目的就是把缓存尽可能长的时间持有,除非内存不够了。


把这个老帖子翻出来是因为今天一个同事看到 google-collections MapMaker 已经提供了类似功能

    ConcurrentMap<Key, Graph> graphs = new MapMaker()
        .concurrencyLevel(32)
        .softKeys()
        .weakValues()
        .expiration(30, TimeUnit.MINUTES)
        .makeComputingMap(
            new Function<Key, Graph>() {
              public Graph apply(Key key) {
                return createExpensiveGraph(key);
              }
            });}


key 和  value 的 reference 类型以及 expiration strategy 都可以指定, 用起来很方便
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics