使用的示例代码:
public static void main(String[] args) {
HazelcastInstance hz = Hazelcast.newHazelcastInstance();
HazelcastInstance hz1 = Hazelcast.newHazelcastInstance();
IMap<String, String> map = hz.getMap("map");
for(int i=0; i < 1000000 ; i++) {
String key = "key" +Integer.toString(i);
String value = "value"+Integer.toString(i);
map.setAsync(key,value);
}
System.out.println("Completed loading to Imap");
long timeStarted = System.currentTimeMillis();
//map.clear()
//map.evictAll()
//map.keySet().forEach(key -> map.delete(key));
map.keySet().forEach(key -> map.removeAsync(key));
long timeComplted = System.currentTimeMillis();
System.out.println("time took using clear::"+(timeComplted - timeStarted));
}
清除(): 已完成加载到Imap 使用clear :: 302的时间 CPU消耗过高(高于200%)
ecictAll(): 已完成加载到Imap 时间用了清楚:: 511 CPU消耗过高(高于200%)
使用每个键删除: 已完成加载到Imap 使用clear :: 81578的时间 CPU消耗很高(高于200%)
使用asyncRemove删除: 已完成加载到Imap 时间花了使用clear :: 9818 CPU消耗很高(高于200%)
注意:另一件事是如果缓存有1000万个条目,那么以上都不适用于我的本地。 {clear()/ evictAll()/ delete by key}花了很长时间,最后因内存不足而失败。 下图是尝试从地图中删除1000万个条目时的CPU使用情况。
答案 0 :(得分:6)
您的测试不是仅衡量执行IMap#clear()(或您测试的其他方法)所花费的时间:而是衡量{em>在执行时的执行时间IMap#clear()同时其他几个setAsync
操作很可能仍在执行。这就是你看到高CPU使用率的原因;这不是因为clear
是CPU密集型的,而是因为仍有异步操作排队并同时执行。你的紧密循环充斥着Hazelcast的异步操作,而你没有配置任何背压。如果没有配置背压(请参阅1),Hazelcast将接受任意数量的传入异步操作,您可以通过充满请求来点击OutOfMemoryException
。为了更好地观察您尝试的4种方法中的每种方法,最好在循环中使用set
而不是setAsync
,这样可以保证您的地图完全填充并且不会再进行任何操作在清理地图时。
此外,您在上面尝试的4种方法具有完全不同的语义:
IMap#clear()
javadoc )。此(或evictAll
)是清除IMap
IMap
定义MapStore,则此方法不会调用IMap#deleteAll()
(来自IMap#evictAll()
javadoc)。map.keySet().forEach(...);
变体,keySet
会返回地图中所有键的克隆,从而增加内存压力。最后一句话,您在同一JVM中使用2 HazelcastInstance
进行简单测试时观察到的结果可能与在2个不同主机上使用2 HazelcastInstance
s的实际部署完全不同。 / p>
1 http://docs.hazelcast.org/docs/3.9/manual/html-single/index.html#back-pressure