Java中是否有不产生垃圾的HashMap实现?

Java中是否有不产生垃圾的HashMap实现?,java,collections,hashmap,hashtable,real-time,Java,Collections,Hashmap,Hashtable,Real Time,我注意到,java.util.HashMap在我的高性能系统上使用时会为GC产生垃圾,这基本上是一个从网络读取的选择器。除了java.util.HashMap(也就是说,它甚至不需要实现java.util.Map,换句话说,它可以有自己的API)之外,还有一种我可以使用的、不会留下垃圾的替代方法吗 垃圾=超出范围且必须由GC收集的对象 对于@durron597: public static void main(String[] args) { Map<String, Stri

我注意到,
java.util.HashMap
在我的高性能系统上使用时会为GC产生垃圾,这基本上是一个从网络读取的选择器。除了
java.util.HashMap
(也就是说,它甚至不需要实现
java.util.Map
,换句话说,它可以有自己的API)之外,还有一种我可以使用的、不会留下垃圾的替代方法吗


垃圾=超出范围且必须由GC收集的对象


对于@durron597:

public static void main(String[] args) {

    Map<String, String> map = new HashMap<String, String>();

    while(true) {

        map.put("foo1", "bah1");
        map.put("foo2", "bah2");

        map.remove("foo1");

        Iterator<String> iter = map.keySet().iterator();

        while(iter.hasNext()) {
            iter.next();
        }
    }
}
publicstaticvoidmain(字符串[]args){
Map Map=newhashmap();
while(true){
地图放置(“foo1”、“bah1”);
地图放置(“foo2”、“bah2”);
地图。删除(“foo1”);
迭代器iter=map.keySet().Iterator();
while(iter.hasNext()){
iter.next();
}
}
}
现在用-verbose:gc运行它,看看会发生什么…:)

是的。看一看

他们完全重新实现了JDK的收集框架(以及更多),重点是低内存占用。例如,他们的
HashMap
不会创建
条目
对象,直到他们真正需要时才创建

还有一个较小的库,用途稍有不同-主要用于接近实时和时间可预测的类,这也意味着低垃圾

如果要存储基本体(避免创建它们的包装器),请查看以下选项之一:

  • -原语的“标准”集合
  • 又是高盛集团
  • -较低级别的访问,通常比Trove稍快,但使您能够更轻松地将自己射入足部
  • -由OpenHFT公司的人制造的一种槽叉。疯狂的快,进化的快。截至目前(2014年9月),仅支持地图和集合
编辑2020:
另请参见。

我们还编写了一个名为的数据结构集合,它提供了零垃圾创建的高性能。它重新使用迭代器和池映射条目对象。对于使用原语作为键的映射,我们编写了
IntMap
LongMap
。对于通用映射,我们编写了
PooledHashMap
,它实现了
java.util.map
,因此您可以在代码中交换零垃圾

还有其他的选择,但我们发现Javolution在某些情况下会产生垃圾

CoralBits还提供了一个MemorySampler instrumentation类,您可以使用该类找出在代码中创建垃圾的位置。在
java.util.HashMap
的情况下,罪魁祸首是:

java.util.HashMap.createEntry(HashMap.java:901)
您可以看一看我写的文章,其中给出了一个如何使用MemorySampler检测应用程序中垃圾的示例


免责声明:我是CoralBits的开发者之一。

如果将地图条目存储在堆外,您可以避免大量垃圾收集。有许多库可以帮助您做到这一点:

  • 编年史地图()
  • MapDB()
  • 二进制offheaphahmap()

    • LibGdx库有ArrayMap,它是hashmap的无垃圾版本

      他们还有其他几个无垃圾收集。


      它们工作得很好,但有一个小小的限制,即不允许对同一迭代器进行嵌套递归。

      你说的“垃圾”是什么意思?垃圾是GC行为还是内存使用中的垃圾?或者您只是想在内存不足时逐出旧条目?@double\u word\u disruptor-很少有更频繁地强制GC可以提高性能的情况。@double\u word\u disruptor@double\u word\u disruptor您如何判断垃圾创建的行?该行是分配对象的位置。不管它是否会变成垃圾,那就另当别论了。在
      java.util.HashMap
      的情况下,它是为GC发布的,因此它确实变成了垃圾。我们使用
      -javaagent
      来执行这个指令插入。这可能是真的,但它取决于读写访问模式和堆外集合的API。在读取路径上,如果某些堆外集合将反序列化堆外数据,并在每次读取数据时为其创建新的Java对象表示,则它们会产生比堆上集合更多的对象搅动,从而产生更多的垃圾。堆集合可以通过返回同一个已经在堆上的对象来避免这个问题。GS集合已经迁移到Eclipse基金会,现在是Eclipse集合。