Java ConcurrentHashMap.keySet()挂起
我在Linux机箱上观察到一个奇怪的行为。代码在Win7上运行良好。有问题的代码挂起在xmlToJavaMap.keySet()上。两个日志语句都没有被记录!!!在堆转储中未找到死锁Java ConcurrentHashMap.keySet()挂起,java,multithreading,concurrenthashmap,jstack,Java,Multithreading,Concurrenthashmap,Jstack,我在Linux机箱上观察到一个奇怪的行为。代码在Win7上运行良好。有问题的代码挂起在xmlToJavaMap.keySet()上。两个日志语句都没有被记录!!!在堆转储中未找到死锁 ConcurrentHashMap<String,String> xmlToJavaMap = ApplicationContext.getBean("map"); logger.info("before for loop"); for (String key : xmlToJa
ConcurrentHashMap<String,String> xmlToJavaMap = ApplicationContext.getBean("map");
logger.info("before for loop");
for (String key : xmlToJavaMap.keySet()) {
logger.info("key: " + key);
...
}
logger.info("map processed.");
ConcurrentHashMapXMLTOJavaMap=ApplicationContext.getBean(“map”);
logger.info(“之前为循环”);
for(字符串键:xmlToJavaMap.keySet()){
logger.info(“键:”+键);
...
}
logger.info(“已处理地图”);
站台:
java版本“1.7.0_11”
Java(TM)SE运行时环境(build 1.7.0_11-b21)
Java HotSpot(TM)64位服务器虚拟机(构建23.6-b04,混合模式)
Red Hat 4.4.7使用jps-v监视java进程。然后使用jstack查看线程堆栈。这可以帮助您找到解决方案。以下是实际发生的情况:)
xmlToJavaMap.keySet()
实际上使用NoSuchMethod失败,线程正在终止。错误堆栈跟踪记录在另一个日志文件中,这导致了混乱。一旦错误得到解决,一切都会恢复正常 我发现了相同的情况,挂起keySet()
方法。实际上,线程是通过NoSuchMethodError退出的。
解决方案是只需声明
ConcurrentHashMap<String,String> xmlToJavaMap = ApplicationContext.getBean("map");
ConcurrentHashMapXMLTOJavaMap=ApplicationContext.getBean(“map”);
至
Map<String,String> xmlToJavaMap = ApplicationContext.getBean("map");
Map xmlToJavaMap=ApplicationContext.getBean(“Map”);
或
Map<String,String> xmlToJavaMap = ApplicationContext.getBean("map");
确保代码和依赖项jar由相同的jdk版本编译
根本原因是:
在版本7和版本8中,
keySet()
方法不是相同的返回,此错误可能不在项目的日志或控制台中,而是在堆中。您可以转储heap来查找与keySet()
相关的java.lang.NoSuchMethodError
,jstack转储非常庞大,它不会检测到任何死锁!你不能执行一个隔离这个问题的命令吗?这可以减少堆栈,我可以做到。它的遗留代码(内部第三方库)。CHM bean大约有50个键、值对。您需要检查此代码是否正在实际执行,或者您的代码是否在其他地方有问题。ConcurrentHashMap读取应该是非锁定的。这就是令人费解的地方。CHM.keySet()不应被阻止。执行一直到for循环之前,然后什么也没有发生。这个问题在几周前的一个环境中开始出现。