1

我在 Linux 机器上观察到一个奇怪的行为。该代码在 Win 7 上运行良好。有问题的代码挂在 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.");  

平台:java 版本 "1.7.0_11" Java(TM) SE Runtime Environment (build 1.7.0_11-b21) Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode) Red Hat 4.4.7

4

3 回答 3

1

使用 jps -v 查看您的 java 进程。然后使用 jstack 来观察你的线程堆栈。这可以帮助您找到解决方案。

于 2015-12-04T16:03:11.223 回答
0

这是实际发生的事情:) xmlToJavaMap.keySet()实际上是 NoSuchMethod 失败并且线程正在终止。错误堆栈跟踪被记录在导致混淆的不同日志文件中。一旦错误得到解决,一切恢复正常。

于 2015-12-11T14:55:45.887 回答
0

我发现了同样的情况,挂在keySet()方法上。实际上线程由 NoSuchMethodError 错误退出。解决方案是只需声明

ConcurrentHashMap<String,String> xmlToJavaMap = ApplicationContext.getBean("map");

Map<String,String> xmlToJavaMap = ApplicationContext.getBean("map");

或者

确保代码和依赖 jar 由相同的 jdk 版本编译。

根本原因是在Java 8中构建时出现“Undefined reference: .. ConcurrentHashMap.keySet()”,原因是:在版本7和8中,keySet()方法返回不一样,这个错误可能不在你的项目的日志或控制台中,但在堆中。您可以转储堆以查找java.lang.NoSuchMethodError相关keySet()

于 2019-08-06T04:05:35.557 回答