您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java中的Bug分析的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java中的Bug分析文章都會有所收獲,下面我們一起來看看吧。
15年在中信銀行做持續(xù)集成時,由于當(dāng)時的項(xiàng)目是基于三方采購的 Java 配置開發(fā)平臺做的,平臺自己基于 Ant
插件實(shí)現(xiàn)了增量和熱部署。
其中有幾個項(xiàng)目在持續(xù)集成部署時,經(jīng)常發(fā)現(xiàn) Linux
平臺部署成功后(Windows
不會出現(xiàn),Linux
也是偶發(fā)現(xiàn)象),新版本代碼并沒有生效(反編譯 class)。
起初我是在本地 windows
上跟蹤調(diào)試基于 Ant
插件的代碼,但始終重現(xiàn)不了(最后測試發(fā)現(xiàn) Windows 無此 Bug)。
后來,通過分析代碼邏輯,其中有段邏輯是通過文件的最后修改時間(File.lastModified()
)來判斷要不要覆蓋部署的,最后通過單測發(fā)現(xiàn),是由于 Java
的 File.lastModified()
方法在 Windows
和 Linux/Unix
平臺獲取的精度不一樣導(dǎo)致的,Windows
精度為毫秒,而 Linux/Unix
只能到秒(JDK Bug:JDK-8177809)。
所以也解釋了,為什么是偶發(fā)現(xiàn)象,文件修改時間如果判斷的兩個值正好跨秒時,部署就是成功的,否則失敗。
測試代碼: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(); // 設(shè)置最后修改時間 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(); } }
命令行下編譯、執(zhí)行:
# 編譯執(zhí)行 $ javac FileTest.java && java FileTest
Windows 平臺不存在此 Bug。
# 編譯執(zhí)行 $ javac FileTest.java && java FileTest Java Version:1.8.0_202 Test f.lastModified [1599276952718]: true Test f.lastModified DateFormat [2020-09-05 11:35:52.052] Test Files.getLastModifiedTime [1599276952718]: true Test Files.getLastModifiedTime DateFormat [2020-09-05 11:35:52.052]
JDK 8 最新版本,目前仍然沒有修復(fù)該問題。
# 編譯執(zhí)行 $ javac FileTest.java && java FileTest Java Version:1.8.0_261 Test f.lastModified [1599276952000]: false Test f.lastModified DateFormat [2020-09-05 11:35:52.052] Test Files.getLastModifiedTime [1599276952000]: false Test Files.getLastModifiedTime DateFormat [2020-09-05 11:35:52.052]
# 編譯執(zhí)行 $ javac FileTest.java && java FileTest Java Version:1.8.0_171 Test f.lastModified [1599276952000]: false Test f.lastModified DateFormat [2020-09-05 11:35:52.052] Test Files.getLastModifiedTime [1599276952000]: false Test Files.getLastModifiedTime DateFormat [2020-09-05 11:35:52.052]
關(guān)于“Java中的Bug分析”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Java中的Bug分析”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。