Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentHashMap.keySet()挂起_Java_Multithreading_Concurrenthashmap_Jstack - Fatal编程技术网

Java ConcurrentHashMap.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

我在Linux机箱上观察到一个奇怪的行为。代码在Win7上运行良好。有问题的代码挂起在xmlToJavaMap.keySet()上。两个日志语句都没有被记录!!!在堆转储中未找到死锁

    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循环之前,然后什么也没有发生。这个问题在几周前的一个环境中开始出现。