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运行它,看看会发生什么...... :)
是.看看高盛的收藏品.
他们完全重新实现了JDK的集合框架(以及更多),重点是内存占用量低.例如,他们HashMap在Entry真正需要之前不会创建对象.请查看此处的文档.
还有Javolution,一个较小的库,目的略有不同 - 主要用于接近实时和时间可预测的类,这也意味着低垃圾.
如果要存储基元(避免创建包装器),请查看以下其中一个:
我们还编写了一个名为CoralBits的数据结构集合,它提供了高性能和零垃圾创建.它重用迭代器和池映射条目对象.对于使用基元作为键的映射,我们写了IntMap和LongMap.对于我们编写的通用映射PooledHashMap实现java.util.Map,您可以将代码交换为零垃圾.
Trove和Javolution是其他选择,但我们发现Javolution在某些情况下会产生垃圾.
CoralBits还提供了一个MemorySampler检测类,您可以使用它来查找代码中创建垃圾的位置.在java.util.HashMap罪魁祸首的情况下:
java.util.HashMap.createEntry(HashMap.java:901)
Run Code Online (Sandbox Code Playgroud)
您可以查看我编写的这篇文章,其中给出了一个如何使用MemorySampler检测应用程序中的垃圾的示例.
免责声明:我是CoralBits的开发者之一.