[英]How to detect whether the JVM has been upgraded without rebooting (on Windows)?
我們經常從Windows用戶那里獲得以下堆棧跟蹤:
java.lang.UnsatisfiedLinkError: sun.awt.image.ImageRepresentation.setBytePixels(IIII[BIILsun/awt/image/ByteComponentRaster;I)V
at sun.awt.image.ImageRepresentation.setBytePixels(Native Method)
at sun.awt.image.ImageRepresentation.setPixels(Unknown Source)
at sun.awt.image.ImageDecoder.setPixels(Unknown Source)
at sun.awt.image.GifImageDecoder.sendPixels(Unknown Source)
at sun.awt.image.GifImageDecoder.parseImage(Native Method)
at sun.awt.image.GifImageDecoder.readImage(Unknown Source)
at sun.awt.image.GifImageDecoder.produceImage(Unknown Source)
at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
at sun.awt.image.ImageFetcher.run(Unknown Source)
當用戶升級Java,然后嘗試運行我們的應用程序而不先重新啟動時,就會發生這種情況。 顯然,升級Java需要重新啟動計算機(就像Windows上的其他所有工具一樣),以使事情恢復到可用狀態。
這不是我們可以捕獲的異常,因為我們的代碼都不在調用堆棧中。 我們可以從Thread.UncaughtExceptionHandler
處理異常,這是我們現在正在做的。
相反,我們希望有一種方法可以在啟動時檢查是否處於升級后需要重新引導的狀態,方法是直接導致此異常並捕獲它,或者進行其他檢查。 (目前,我們不知道是什么觸發了這個……)有人知道我們可能會怎么做嗎?
恐怕你不走運。 可能會有一個注冊表項讓OS知道它需要重新啟動,但是只有在安裝程序需要時才設置。 唯一的其他例外是如果存在使用DLL的代碼,否則該代碼將被安裝程序替換。 安裝過程將從操作系統觸發“需要重新啟動才能完成”對話框。
我尚未進行Java自動更新,要求我重新啟動計算機。 如果操作系統從未處於“需要重新啟動”狀態,則沒有任何內容可供您查找和檢查。 您能做的最好的就是捕獲異常並顯示一條不錯的錯誤消息。 我會將這個問題作為錯誤報告給Oracle(否則很難適應)。 也許將來的更新將正常運行。
如果您保證能夠在異常發生之前調用某些代碼,則建議考慮進行手動Java版本檢查。 您永遠不會知道上次升級是否會導致此類崩潰,但是您始終可以檢查自上次執行以來Java版本是否已更改。 讓我們以一種簡單的方式將其存儲在某個地方。
然后,在每次啟動期間,如果Java版本已更改,您將顯示信息“ Java已更新,並且我的應用程序可能無法正常運行。 建議重新啟動”和/或停止繼續。
就像是:
public static void main(String[] argv) {
String lastJVM = retrieveJVMversionFromLastExecution();
String currentJVM = System.getProperty("java.version");
if (!currentJVM.equals(lastJVM)) {
throw new RuntimeException("New JVM. Please reboot");
} else {
storeJVMversionPersistently(currentJVM);
}
// ... your normal operation
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.