您好,登錄后才能下訂單哦!
這篇文章主要介紹了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)。
所以也解釋了,為什么是偶發現象,文件修改時間如果判斷的兩個值正好跨秒時,部署就是成功的,否則失敗。
測試代碼: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 平臺不存在此 Bug。
# 編譯執行 $ 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 最新版本,目前仍然沒有修復該問題。
# 編譯執行 $ 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]
# 編譯執行 $ 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]
關于“Java中的Bug分析”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Java中的Bug分析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。