Java中的Bug分析
发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,这篇文章主要介绍了Java中的Bug分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的Bug分析文章都会有所收获,下面我们一起来看看吧。背景15年在中信银行做
千家信息网最后更新 2025年01月17日Java中的Bug分析
这篇文章主要介绍了Java中的Bug分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的Bug分析文章都会有所收获,下面我们一起来看看吧。
背景
15年在中信银行做持续集成时,由于当时的项目是基于三方采购的 Java 配置开发平台做的,平台自己基于 Ant
插件实现了增量和热部署。
其中有几个项目在持续集成部署时,经常发现 Linux
平台部署成功后(Windows
不会出现,Linux
也是偶发现象),新版本代码并没有生效(反编译 class)。
起初我是在本地 windows
上跟踪调试基于 Ant
插件的代码,但始终重现不了(最后测试发现 Windows 无此 Bug)。
后来,通过分析代码逻辑,其中有段逻辑是通过文件的最后修改时间(File.lastModified()
)来判断要不要覆盖部署的,最后通过单测发现,是由于 Java
的 File.lastModified()
方法在 Windows
和 Linux/Unix
平台获取的精度不一样导致的,Windows
精度为毫秒,而 Linux/Unix
只能到秒(JDK Bug:JDK-8177809)。
所以也解释了,为什么是偶发现象,文件修改时间如果判断的两个值正好跨秒时,部署就是成功的,否则失败。
Bug 重现
测试代码:FileTest.java
import java.io.File;import java.io.IOException;import java.nio.file.Files;import java.text.SimpleDateFormat;public class FileTest { private static final long LM = 1599276952718L; public static void main(String[] args) throws IOException { // java版本号 System.out.println("Java Version:" + System.getProperty("java.version")); File f = new File("test.txt"); f.createNewFile(); // 设置最后修改时间 f.setLastModified(LM); // 获取修改时间,存在 bug System.out.printf("Test f.lastModified [%s]: %b\n",f.lastModified(), f.lastModified() == LM); // 格式化输出,正确不存在 bug System.out.printf("Test f.lastModified DateFormat [%s]\n",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss").format(f.lastModified())); // Files.getLastModifiedTime() 获取修改时间,同样存在 bug System.out.printf("Test Files.getLastModifiedTime [%s]: %b\n",Files.getLastModifiedTime(f.toPath()).toMillis(),(Files.getLastModifiedTime(f.toPath()).toMillis() == LM)); // 格式化输出,正确不存在 bug System.out.printf("Test Files.getLastModifiedTime DateFormat [%s]\n",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss").format(f.lastModified())); f.delete(); }}
命令行下编译、执行:
# 编译执行$ javac FileTest.java && java FileTest
Windows 执行结果
Windows 平台不存在此 Bug。
# 编译执行$ javac FileTest.java && java FileTestJava Version:1.8.0_202Test f.lastModified [1599276952718]: trueTest f.lastModified DateFormat [2020-09-05 11:35:52.052]Test Files.getLastModifiedTime [1599276952718]: trueTest Files.getLastModifiedTime DateFormat [2020-09-05 11:35:52.052]
Mac 执行结果
JDK 8 最新版本,目前仍然没有修复该问题。
# 编译执行$ javac FileTest.java && java FileTestJava Version:1.8.0_261Test f.lastModified [1599276952000]: falseTest f.lastModified DateFormat [2020-09-05 11:35:52.052]Test Files.getLastModifiedTime [1599276952000]: falseTest Files.getLastModifiedTime DateFormat [2020-09-05 11:35:52.052]
Linux 执行结果
# 编译执行$ javac FileTest.java && java FileTestJava Version:1.8.0_171Test f.lastModified [1599276952000]: falseTest f.lastModified DateFormat [2020-09-05 11:35:52.052]Test Files.getLastModifiedTime [1599276952000]: falseTest Files.getLastModifiedTime DateFormat [2020-09-05 11:35:52.052]
关于"Java中的Bug分析"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Java中的Bug分析"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
分析
平台
时间
编译
代码
知识
结果
成功
内容
插件
文件
格式
版本
现象
篇文章
精度
逻辑
项目
测试
输出
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全态势感知常态化
股市数据库算法
服务器市场占有率
数据库中键值什么意思
社交网络安全威胁案例
数据库索引的原理是什么
江西项目管控软件开发平台
三丰云服务器怎么调
数据库怎么加上唯一标识符
gdc服务器硬盘盒连接线
软件开发需要学会什么软件
手机芯片和服务器级别
cacti 数据库修复
滦州市教育局网络安全活动
福建十三水软件开发商
高效网络数据库维护
二维码能够做数据库吗
服务器 核数
软件开发公司如何开发市场
网络安全架构解析
沈阳软件开发培训机构有哪些
第五人格服务器异常怎么回事
电霸软件开发
网络安全晚会观后感800字
梦幻西游钓鱼岛服务器好卡
数据库怎么导出一个表
麓晨互联网科技有限公司
服务器转入
中国网络安全的成就
如何给管理员申请服务器