我在tomcat下部署了一个
java Web应用程序,突然显示API的响应时间在快照显示时减慢(抱歉,由于缺乏声誉,我无法发布图像).重启tomcat后会恢复正常.
我唯一关注的可疑代码是ConcurrentHashMap的putIfAbsent的使用,所以我写了一个测试JSP页面,如下所示:
ConcurrentHashMap testMap2 = new ConcurrentHashMap();
long putStart2 = System.currentTimeMillis();
for (int i = 0; i < size; i++) {
testMap2.put(i, data[i]);
}
out.println("concurrent put -> " + (System.currentTimeMillis() - putStart2));
out.println("");
ConcurrentHashMap testMap = new ConcurrentHashMap();
long putStart = System.currentTimeMillis();
for (int i = 0; i < size; i++) {
testMap.putIfAbsent(i, data[i]);
}
out.println("concurrent putIfAbsent -> " + (System.currentTimeMillis() - putStart));
out.println("");
结果如下:
concurrent put -> 36
concurrent putIfAbsent -> 157
JDK版本是1.7.0_45,我检查了ConcurrentHashMap的源代码,putIfAbsent应该比put更快或至少相同.
我认为差异可能是由JIT引起的,所以我在日志编译中添加了JVM选项:
记录ConcurrentHashMap.putIfAbsent
记录ConcurrentHashMap.put
我无法完全理解日志,这是否意味着putIfAbsent被去优化?但我补充说
-XX:-UseCodeCacheFlushing -XX:ReservedCodeCacheSize=80m
为什么在putIfAbsent上发生了优化?