[英]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 ,一个较小的库,目的略有不同 - 主要用于接近实时和时间可预测的类,这也意味着低垃圾。
如果要存储原语(避免创建它们的包装器),请查看以下内容之一:
我们还编写了一个名为CoralBits的数据结构集合,它提供了零垃圾创建的高性能。 它重用迭代器和池映射条目对象。 对于使用原语作为键的映射,我们编写了IntMap
和LongMap
。 对于通用映射,我们编写了实现java.util.Map
PooledHashMap
,因此您可以交换代码以实现零垃圾。
Trove和Javolution是其他选择,但我们发现 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.