JDK小Bug彙總

Java官方的Logger.getGlobal().info無效

  • 無效代碼
Logger.getGlobal().info("start");
  • 解決方案(三選一):
Logger.getLogger("global").setLevel(Level.INFO)
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).info("start");
Logger.getLogger("global").info("start");

JAVA線程加載圖片掛在 java.awt.MediaTracker.waitForID

  • 問題發生時打印的日誌通常以下所示
"AWT-EventQueue-0" prio=10 tid=0x0811e400 nid=0x3d80 in Object.wait() [0xdeb95000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0xe651f1f8> (a java.awt.MediaTracker)
        at java.awt.MediaTracker.waitForID(MediaTracker.java:651)
        - locked <0xe651f1f8> (a java.awt.MediaTracker)
        at javax.swing.ImageIcon.loadImage(ImageIcon.java:264)
        - locked <0xe651f1f8> (a java.awt.MediaTracker)
        at javax.swing.ImageIcon.<init>(ImageIcon.java:194)
  • 該問題屬於JDK Bug,加載圖片有較小概率會掛死當前線程。而掛死了UI線程等於整個客戶端都完蛋了。
  • 解決該問題的思路:
    • 首先用一個對象當鎖。
    • UI線程先啓動線程A,而後synchronize鎖並wait喚醒,可設超時時間。
    • 線程A加載圖片,在工做完成時synchronize鎖並notify對象。
  • 這樣就算線程A掛死,也不影響UI線程的正常運行。

參考資料
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6995182
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4881229java

控制檯輸出Unloading class

  • 問題發生時控制檯輸出通常以下
[Unloading class sun.reflect.GeneratedMethodAccessor22]
[Unloading class sun.reflect.GeneratedMethodAccessor47]
[Unloading class sun.reflect.GeneratedMethodAccessor24]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor6]
[Unloading class sun.reflect.GeneratedMethodAccessor26]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor13]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor16]
  • 緣由多是程序啓動參數裏含有-Xloggc

參考資料
http://stackoverflow.com/questions/2833983/meaning-of-the-unloading-class-messages
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7040410windows

SSH調用Windows下的Java程序提示版本異常

Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion'
has value '1.8', but '1.6' is required.
Error: Could not find java.dll
Error: Could not find Java SE Runtime Environment.

解決方案:bash

  • C:\ProgramData\Oracle\Java\javapathPATH環境變量中去除
  • C:\Windows\System32目錄下刪除javajavawjavaws
  • 最根本的解決方法是安裝JDK的時候不要勾選JRE

參考資料
http://stackoverflow.com/questions/29697543/registry-key-error-java-version-has-value-1-8-but-1-7-is-requiredssh

相關文章
相關標籤/搜索