我們經常從我們的Windows用戶可以得到以下堆棧跟蹤:如何檢測JVM是否升級而不重新啓動(在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
的異常,這正是我們現在所做的。
我們希望有一種方法來檢查啓動時是否處於升級後需要重新引導的狀態,可以通過直接引發此異常並捕獲它或進行其他檢查。 (目前,我們不知道甚至觸發了這個......)有人知道我們可能會怎麼做嗎?
是否在執行任何代碼之前異常發生的呢? – 2010-11-04 22:16:53
@Grzegorz:好問題。我不知道,我沒有Windows機器來測試它。 – uckelman 2010-11-05 10:18:09