keyu's Blog


  • 首页

  • 关于

  • 归档

视频组的两个月总结

发表于 2020-05-22 |
  1. 太过害怕麻烦别人 ,
  2. 不敢发问,怕问出别人的问题,需要不懂就问,多问才清晰。
  3. 对下面的人在做的事情不够清晰
  4. 可以对现有问题进行分析,尝试提出相应的解决方案,动脑动的太少
  5. 死要面子活受罪
  6. 自我驱动的能力太差
  7. 总结能力有待提升,
  8. 关注项目的开始时间,提测时间,上线的时间
  9. 每天要有计划
  10. 要学会切分大任务到小任务,逐步细化
  11. 先吃掉那只青蛙,处理为难,拖延很久的事情
  12. 多画图,多列大纲

计划:

  1. 回归HQ组后,多站在整个组的角度讨论问题,多了解不属于自己的项目,要有leader的思维
  2. 不要只会纸上谈兵,手上要有进度
  3. 每天要有总结,每天要有计划,大的计划,划分为小任务

My Gallery

发表于 2018-06-20 |

Java高编译低运行错误(ConcurrentHashMap.keySet)

发表于 2018-06-19 |
问题

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

定位问题

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

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

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

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

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>

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

然后网上看到这篇文章

得到结论与解决方法

在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中提供的类。原因是接口不易改变,而实现类遵循“宽收严发”原则,方法的入参和出参都是易变的。

Liukeyu

3 日志
1 标签
© 2020 Liukeyu
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4