Ini sebenarnya adalah bug JDK. Telah dilaporkan beberapa kali selama bertahun-tahun, tetapi hanya pada 8139507 yang akhirnya dianggap serius oleh Oracle.
Masalahnya adalah dalam kode sumber JDK untuk WindowsPreferences.java
. Di kelas ini, kedua node userRoot
dan systemRoot
dinyatakan statis seperti pada:
/**
* User root node.
*/
static final Preferences userRoot =
new WindowsPreferences(USER_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);
/**
* System root node.
*/
static final Preferences systemRoot =
new WindowsPreferences(SYSTEM_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);
Ini berarti bahwa pertama kali kelas direferensikan, kedua variabel statis akan diinisiasi dan dengan ini Kunci Registri untuk HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
(= susunan sistem) akan dicoba dibuat jika belum ada.
Jadi, bahkan jika pengguna mengambil setiap tindakan pencegahan dalam kodenya sendiri dan tidak pernah menyentuh atau merujuk pohon sistem, maka JVM sebenarnya akan tetap mencoba untuk instantiate systemRoot
, sehingga menyebabkan peringatan. Ini adalah bug halus yang menarik.
Ada perbaikan yang dilakukan pada sumber JDK pada Juni 2016 dan itu adalah bagian dari Java9 dan seterusnya. Ada juga backport untuk Java8 yang ada di u202.
Apa yang Anda lihat sebenarnya adalah peringatan dari pencatat internal JDK. Ini bukan pengecualian. Saya percaya bahwa peringatan itu dapat diabaikan dengan aman .... kecuali kode pengguna memang menginginkan preferensi sistem, tetapi itu sangat jarang terjadi.
Info bonus
Bug tidak mengungkapkan dirinya dalam versi sebelum Java 1.7.21, karena sampai saat itu installer JRE akan membuat kunci Registry HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
untuk Anda dan ini akan secara efektif menyembunyikan bug. Di sisi lain Anda tidak pernah benar-benar diminta untuk menjalankan installer untuk memiliki JRE pada mesin Anda, atau setidaknya ini bukan niat Sun / Oracle. Seperti yang Anda ketahui, Oracle telah mendistribusikan JRE untuk Windows dalam .tar.gz
format selama bertahun-tahun.