最近的一個項目采用JSP+Servlet開發的Web應用功能不復雜涉及到一些多線程處理及網絡編程測試期間發現在會造成系統時鐘變快基本運行不到一小時就快了來分鐘開出時鐘程序能明顯感覺秒鐘跳動比較快檢查過代碼沒有用到任何有關時間設置的調用JVMTOMCAT也換過多個版本依然沒能解決問題由於我們的項目程序不運行時系統時鐘一切正常啟動後立刻變快初步硬件或是其他程序造成的問題另外最奇怪的是並不是所有機器上運行都有這種問題公司裡的台Server上台有此現象另一台始終正常開發用的一些xp/vista的機器也不都存在這個問題
著實郁悶了很長一段時間始終找不到問題的關鍵更沒法找到解決辦法前兩天偶然查到一篇SUN網站bug庫中早些年的一篇文章(ID:)Calling Threadsleep with small argument affects system clock on windows 其中說明了當多線程處理時調用Threadsleep()方法時若sleep的參數小於ms就可能會造成windows系統時鐘變快不過該bug標記為jvm 中才存在並且已經在後續版本fixed而我們開發都是用的版本於是搜索了下項目代碼確實有用到Threadsleep()方法的地方而且某些部分由於需求關系程序中的參數不定的會依據一定算法計算出來這樣就有可能小於ms盡管理論上我們代碼中可能最小只設定到ms左右
接下來繼續搜了下其他的bug report包括ID為 的文章發現上述問題並未根本解決根據文章中提到的ForceTimeHighResolution關鍵字google一下發現這個參數是JVM 中的一個另外搜到老外的帖子裡有一篇關於applet游戲程序時鐘走快後其廠商給出的解決辦法就是需要開啟ForceTimeHighResolution參數!
這下好了這應該就是解決問題的關鍵所在重新將項目服務器時間校准然後在TOMCAT的catalinabat中將JAVA_OPTS參數中增加一項 XX:+ForceTimeHighResolution (注意 和 + 都是有的)啟動TOMCAT運行查看時鐘感覺沒有變快運行小時後未發現變快現象看來這個參數確實很有效剩下工作就是把所有安裝項目程序的服務器都修改了參數設置進行長時間運行測試直至目前為止均未在出現時鐘變快的現象
經過這件事後確實沒想到JVM還有這樣的BUG以前C#的代碼寫的多接觸JAVA時間不太長這次算是見識到了JAVA中千奇百怪的問題了不過至於程序中開啟了ForceTimeHighResolution這個參數會不會帶來別方面問題還無從得知只有待時間來檢驗了如果這方面有了解的朋友歡迎與我交流
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27346.html