繁体   English   中英

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

[英]Is there a HashMap implementation in Java that produces no garbage?

我注意到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();
        }
    }
}

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

是的。 看看例如高盛的收藏

他们完全重新实现了 JDK 的集合框架(以及更多),重点是低内存占用。 例如,他们的HashMap在真正需要之前不会创建Entry对象。 看看这里的文档。

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

如果要存储原语(避免创建它们的包装器),请查看以下内容之一:

  • Trove - 原语的“标准”集合
  • 再次高盛收藏
  • HPPC - 较低级别的访问,通常比 Trove 稍快,但使您可以更轻松地将自己射入脚下
  • Koloboke - 由 OpenHFT 人员制作的 Trove 分叉。 飞速发展,飞速发展。 截至目前(2014 年 9 月),仅支持 Maps 和 Sets。

编辑 2020:

另请参阅https://github.com/TimeAndSpaceIO/SmoothieMap

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

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

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

java.util.HashMap.createEntry(HashMap.java:901)

您可以查看我写的这篇文章该文章给出了如何使用 MemorySampler 检测应用程序中的垃圾的示例。

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

如果将地图条目存储在堆外,则可以避免大量垃圾收集。 有许多库可以帮助您解决这个问题:

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

http://libgdx.badlogicgames.com/

他们还有其他几个无垃圾收集。 https://github.com/libgdx/libgdx/tree/master/gdx/src/com/badlogic/gdx/utils

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM