加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

优化Java中的字符串集合的内存使用

发布时间:2020-12-14 14:26:36 所属栏目:Java 来源:网络整理
导读:我有大量的名称 – 值对(约100k),我需要存储在某种缓存(例如哈希映射)中,其中值是一个平均约30k字节大小的字符串. 现在我知道一个事实,大量的值具有完全相同的字符串数据.为了避免必须多次分配相同的字符串数据,我想以某种方式重用先前分配的字符串,从而消耗
我有大量的名称 – 值对(约100k),我需要存储在某种缓存(例如哈希映射)中,其中值是一个平均约30k字节大小的字符串.

现在我知道一个事实,大量的值具有完全相同的字符串数据.为了避免必须多次分配相同的字符串数据,我想以某种方式重用先前分配的字符串,从而消耗更少的内存.此外,这需要相当快.即逐个扫描所有先前分配的值不是一个选择.

关于我如何解决这个问题的任何建议?

解决方法

不要使用String.intern(这些年来已经出现了与此相关的各种内存问题).而是创建自己的缓存,类似于String.intern.基本上,你想要一个地图,每个键映射到它自己.那么,在缓存任何字符串之前,你“实习”它:
private Map<String,WeakReference<String>> myInternMap = new WeakHashMap<String,WeakReference<String>>();
public String intern(String value) {
  synchronized(myInternMap) {
    WeakReference<String> curRef = myInternMap.get(value);
    String curValue = ((curRef != null) ? curRef.get() : null);
    if(curValue != null) {
      return curValue;
    }

    myInternMap.put(value,new WeakReference<String>(value));
    return value;
  }
}

请注意,对于键和值使用weakreferences,以便不保留不再使用的字符串的引用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读