当前位置: 首页 > 面试题库 >

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

公冶和豫
2023-03-14
问题内容

我有大量的名称-值对(大约100k),我需要将它们存储在某种高速缓存(例如哈希映射)中,其中值是一个平均大小约为30k字节的字符串

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

关于如何解决此问题的任何建议?


问题答案:

千万 不能
使用中的String.intern(已经有过多年的与此相关的各种内存问题)。而是创建您自己的缓存,类似于String.intern。基本上,您需要一个Map,每个键都映射到其自身。然后,在缓存任何字符串之前,您“实习”它:

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;
  }
}

注意,对键和值使用弱引用,这样就不会保留不再使用的字符串的引用。



 类似资料:
  • 问题内容: 我正在使用 map [string] string 优化代码,其中 map 的值仅为“ A”或“ B”。因此,我认为显然, map [string] bool 更好,因为该地图可容纳约5000万个元素。 结果是: 在测试时,我发现有些奇怪,为什么带有很长字符串的 a2 使用8个字节,就像 一个 只有一个字母一样? 问题答案: 不会递归地进入数据结构,它只是报告传递的值的“浅”大小。引用

  • 我在Java中有一个包含字符串的对象。我很好奇字符串的内存使用是如何工作的。我试图优化我的程序的内存使用,应用程序将有大约10000个这样的对象。对于像“Hello World”这样的字符串,内存使用量是多少?

  • 问题内容: 如何将一个JSON.stringify()一集? 在Chromium 43中不起作用的事情: 我希望得到类似于序列化数组的东西。 问题答案: 不能直接与集合一起使用,因为存储在集合中的数据不会存储为属性。 但是您可以将集合转换为数组。然后,您将能够正确地对其进行分类。 以下任何一项都可以解决问题:

  • 问题内容: 我正在运行一个wordpress网站,每个PHP进程的使用空间约为200mb至250mb。使用16GB的ram,服务器只能处理大约70个进程。通过将虚拟内存增加到16GB,它可以处理140个。之后,负载不断增加。如果10分钟内有200个连接,则在3Ghz四核xeon处理器上服务器负载将达到20个! 我曾尝试停用所有插件,但这只会使每个进程的PHP内存使用量减少不到10%。suPHP告诉

  • 问题内容: 阅读了SCJP Tip Line的作者Corey McGlone在javaranch网站上的文章后,我都感到困惑。从字面上看是Strings,由Kathy Sierra(javaranch的联合创始人)和Bert Bates共同编写的《 SCJP Java 6程序员指南》。 我将尝试引用Corey先生和Kathy Sierra女士对String Literal Pool的引用。 1.根

  • 我需要解析“txf”格式的数据文件。这些文件可能包含 1000 多个条目。由于格式像JSON一样定义得很好,我想做一个像JSON这样的通用解析器,它可以序列化和解串化txf文件。 与JSON相反,标记没有办法识别对象或数组。如果一个带有相同标签的条目出现,我们需要把它看作一个数组。 标记对象的开始。 标记对象的成员 标记对象的结尾 下面是一个示例“txf”文件 我能够使用NSScanner创建通用