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

chr*_*tek 11 java collections hashtable real-time hashmap

我注意到,java.util.HashMap当我在高性能系统上使用GC时会产生垃圾,它基本上是从网络读取的选择器.是否有替代java.util.HashMap(即,甚至不需要实现java.util.Map,换句话说,它可以有自己的API),我可以使用,不会留下任何垃圾?


GARBAGE =超出范围的对象,必须由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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在使用-verbose:gc运行它,看看会发生什么...... :)

Pet*_*ček 9

是.看看高盛的收藏品.

他们完全重新实现了JDK的集合框架(以及更多),重点是内存占用量低.例如,他们HashMapEntry真正需要之前不会创建对象.请查看此处的文档.

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

如果要存储基元(避免创建包装器),请查看以下其中一个:

  • Trove - 原语的"标准"集合
  • Goldman Sachs再次收藏
  • HPPC - 较低级别的访问,通常比Trove稍快,但是可以让您更轻松地射击自己
  • Koloboke - 由OpenHFT人员制作的Trove叉子.疯狂快速,快速发展.截至目前(2014年9月),仅支持地图和集合.

  • GS Collections 已迁移到 Eclipse Foundation,现在更名为 Eclipse Collections - http://www.eclipse.org/collections/ (2认同)

rda*_*ida 6

我们还编写了一个名为CoralBits的数据结构集合,它提供了高性能和零垃圾创建.它重用迭代器和池映射条目对象.对于使用基元作为键的映射,我们写了IntMapLongMap.对于我们编写的通用映射PooledHashMap实现java.util.Map,您可以将代码交换为零垃圾.

TroveJavolution是其他选择,但我们发现Javolution在某些情况下会产生垃圾.

CoralBits还提供了一个MemorySampler检测类,您可以使用它来查找代码中创建垃圾的位置.在java.util.HashMap罪魁祸首的情况下:

java.util.HashMap.createEntry(HashMap.java:901)
Run Code Online (Sandbox Code Playgroud)

您可以查看我编写的这篇文章,其中给出了一个如何使用MemorySampler检测应用程序中的垃圾的示例.

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