发布于: 2018-06-19 11:13:37

问题

有个程序,在有些机器会出现清空数据失败的问题,不抛出任何错误,本机无法重现。

定位问题

由于不抛出任何错误,只能增加日志, 最终定位到调用ConcurrentHashMap.keySet()方法卡死

对比出现问题的机器与没有问题的机器,发现出问题的机器JDK版本是1.7, 而没有问题的JDK版本是1.8

基本可以确定是由于keySet() 方法与JDK 版本不一致导致的问题

但是我本机pom.xml中已经指定language level 为1.7:

org.apache.maven.plugins

maven-compiler-plugin

3.1

1.7

1.7

按理应该不会出现版本不一问题

然后网上看到这篇文章

得到结论与解决方法

在javac指定了这些参数,降低版本号来编译,会导致生成class文件被标识为较低版本以供指定的JVM加载。但是,基于JDK 8的bootstrap class编译而成的keySet()方法,其返回值依旧是JDK 8中ConcurrentHashMap$KeySetView这个新增内部类。运行时,1.7的JVM尝试加载这个class文件,一定找不到KeySetView作为返回值的keySet()方法,出错。

解决方式

使用父类/接口替换子类,即ConcurrentMap替换ConcurrentHashMap声明

即使用ConcurrentMap map = new ConcurrentHashMap()替换 ConcurrentHashMap map = new ConcurrentHashMap()

结论

保证编译、打包环境和最终部署环境JDK版本的一致性

如果无法保证,就尽量面向接口编程,尤其是JDK中提供的类。原因是接口不易改变,而实现类遵循“宽收严发”原则,方法的入参和出参都是易变的。

Java高版本编译低版本运行_Java高版本编译低版本运行错误(ConcurrentHashMap.keySet)...相关推荐

  1. java 高并发第三阶段实战_Java 高并发第三阶段实战---Java并发包深入解析与使用详解...

    第三阶段的课程主要围绕着Java并发包的使用,展开详细的介绍,主要内容有1.原子包源码剖析,2.并发包工具类详细介绍,3.线程服务以及Future和callable等详细介绍,4.高并发容器和阻塞容器 ...

  2. java中有测试方法主方法不运行_java – 我的Eclipse无法再运行(或调试)我的JUnit测试...

    我使用 Eclipse IDE:面向Web开发人员的Eclipse Java EE IDE.版本:Indigo Release 我使用JUnit 4.对于项目属性> Java构建路径>库: ...

  3. boost thread 判断是否正在运行_java高端基础:Thread源码解读

    阅读本篇文章之前建议先了解线程的生命周期以及状态之间的可能的转换 Java高端基础:线程的生命周期 wait() 使当前线程等待,直到其他线程调用该对象的notify()或者notifyAll()方法 ...

  4. java命令行执行编译好的类_Java命令行编译并执行Java程序

    通过命令行执行Java程序. 首先,保证正常的环境变量配置正确: JAVA_HOME=C:\jdk150_04; PATH=%JAVA_HOME%\bin;%PATH% CLASSPATH=.;%JA ...

  5. java web 服务 构建与运行_Java Web 服务:构建与运行(影印版)

    基本详情信息 书名:Java Web 服务:构建与运行 ISBN:9787564119270 作者:卡林(Martin Kalin) 著 出版社:东南大学出版社 出版日期:2010-1-1 其他信息 ...

  6. java jdk运行_java运行机制、Jdk版本及Java环境变量

    一.语言特性 计算机高级语言按程序的执行方式可分为:编译型和解释型两种.编译型的语言是指使用专门的编译器,针对特定的平台(操作系统)一次性翻译成被该平台硬件执行的机器码,并包装成该平台可执行性程序文件 ...

  7. IDEA版本过低,配置更高版本

    IDEA版本过低,配置更高版本** 运行代码提示: java - source 1.5中 不支持diamond运算符. 是配置中Java JDK版本过低的原因,需要升级版本号 步骤如下: File - ...

  8. CAD文件版本怎么转换?如何将高版本转换成低版本?

    CAD文件版本怎么转换?如何将高版本转换成低版本?随着AutoCAD软件的更新,如今网上有许多的AutoCAD软件版本,我们电脑上的AutoCAD软件一般都不少最新版本,此时如果我们接收到最新版本的C ...

  9. Mac OS 10.14 低版本如何安装Xcode 11.6 高版本教程

    文章目录 0. 关于安装高版本XCode,点击agree后就没反应了,也没有报错的解决方案 0. 关于高版本的XCode编译工程报错, 而低版本的XCode编译正常的解决方案 1. 电脑系统版本 2. ...

最新文章

  1. php – Laravel 7 Session Lifetime
  2. linux搭建markdown服务,Markdown新手快速入门基础教程及Ubuntu下的安装
  3. 如何在数据库中高效实现订座功能?
  4. 必须重启计算机才能关闭用户控制,Win10如何彻底关闭用户帐户控制?Win10关闭用户控制方法...
  5. HDU2544最短路---(Dijkstra)
  6. python卡尔曼滤波跟踪_使用卡尔曼滤波器以圆周运动跟踪机器人
  7. 十九、PHP框架Laravel学习笔记——批量赋值和软删除
  8. grpc简单使用 java_gRPC学习记录(四)-官方Demo - Java 技术驿站-Java 技术驿站
  9. flask get 参数_用它 5 分钟以后,我放弃用了四年的 Flask
  10. megento 获取url参数
  11. 解决Dataframe删除操作时警告:SettingWithCopyWarning:A value is trying to be set on a copy of a slice from a...
  12. 华为上半年收入4540亿元;GitHub服务中断,已恢复​;Python 3.8.4发布|极客头条
  13. 前后端交互之封装Ajax+SpringMVC源码分析
  14. Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx
  15. excel随机数_【收藏】Excel生成随机数、不重复随机数技巧,试验检测办公必备...
  16. 用观察者模式设计一个气象台
  17. 你拍一我拍一上学得学计算机,儿歌你拍一我拍一
  18. 组件的生命周期,小程序如何引入第三方ui框架
  19. 正则表达式去掉回车、换行、空白符号、空格
  20. 交通预测论文翻译:Deep Learning on Traffic Prediction: Methods,Analysis and Future Directions

热门文章

  1. C++拷贝构造函数(深拷贝,浅拷贝)
  2. Python-读写文件
  3. OpenCV图像处理——判断图像是否失焦模糊
  4. 论文笔记:MTCNN
  5. Linux 2.6内核配置说明(Networking网络)
  6. double free
  7. JavaScript中的原型(prototype)与继承
  8. 磁盘格式化,磁盘挂载,手动增加swap空间
  9. Html中的次方符号怎么写
  10. 安装教程_Typora+Pandoc导出word