Alasan mengapa Java dipromosikan sebenarnya adalah alasan besar karena itu adalah cross-platform, dan perannya yang besar adalah karena hubungan mesin virtual.
Secara umum, pengembang tidak perlu memperhatikan implementasi internal mesin virtual untuk dikembangkan setiap hari, tetapi kadang -kadang ketika menyangkut kinerja, mereka perlu memahami mekanisme implementasi mesin virtual.
Jadi apa yang saya tulis hari ini lebih banyak tentang menyusun serangkaian mesin virtual Anda sendiri untuk membuka jalan untuk memahami prinsip -prinsip mendasar dari mesin virtual di masa depan.
Mengkompilasi mesin virtual mungkin menghadapi banyak jebakan dan akan memakan waktu. Karena perbedaan dalam lingkungan kita, masalah yang mungkin kita temui tidak konsisten.
Saya hanya bisa mengatakan bahwa saya telah mendaftarkan semua masalah yang saya temui, hanya ingin membuat percikan.
1 Pertama -tama, kita harus mengunduh kode sumber OpenJDK. OpenJDK ini sebenarnya memiliki riwayat versi. Anda bisa mempelajarinya.
Maka sebagian besar konten kode sumber di sini sama dengan konten Oracle JDK, dan beberapa konten berbeda.
Kode sumber OpenJDK yang saya unduh di sini adalah OpenJDK-7U75-SRC-B13-18_DEC_2014.ZIP. Versi setiap orang mungkin berbeda, tetapi ini adalah kode sumber OpenJDK.
2 Selain menyiapkan hal -hal di atas, Anda juga perlu menyiapkan JDK Oracle. Saya menggunakan JDK-6U32-linux-x64.bin untuk JDK ini.
3 Kemudian persiapkan berbagai ketergantungan di Linux terlebih dahulu. Ketergantungan ini akan diperoleh nanti. Selain itu, saya ingin berbicara tentang sistem Linux di sini.
Ini adalah 16.04LTS 64-bit Ubuntu, jadi yang terbaik adalah mempersiapkan 64-bit untuk hal-hal sebelumnya.
Semuanya sudah siap, sekarang kita akan mulai bekerja! Lai Lai Lai
1Jika Anda mengatur variabel lingkungan java_home atau classpath sebelumnya, silakan komentar terlebih dahulu.
2 Unzip OpenJDK-7U75-SRC-B13-18_DEC_2014.zip dan dapatkan folder OpenJDK. Kami meletakkannya di bawah /usr.
3 Execute JDK-6U32-Linux-x64.bin untuk mendapatkan folder JDK1.6.0_32. Mari kita bicara tentang memasukkan folder ini di /usr /java.
4 Masukkan vim /etc /profile dan tambahkan konten berikut di akhir:
Ekspor Lang = C#Bootstrap-JDK Path Instalasi, ganti dengan jalur bootstrap-jdk ekspor alt_bootdir =/usr/java/jdk1.6.0_32#Sama seperti di atas, saya menggunakan OpenJDK untuk dikompilasi, dan ketika saya menjalankan hotspot, saya diganti dengan Oracle. Readers can directly replace it with OracleJDKexport ALT_JDK_IMPORT_PATH=/usr/java/jdk1.6.0_32#Specify several threads to execute this script export HOTSPOT_BUILD_JOBS=4export ALT_PARALLEL_COMPILE_JOBS=4#The content to be compiled, readers can choose to export BUILD_LANGTOOLS=true#export Build_jaxws = false#Ekspor build_jaxp = false#Ekspor build_corba = falseexport build_hotspot = trueExport build_jdk = trueExport skip_compare_images = TrueBuild_deploy = falsebuild_install = false Path to the compileD. Ekspor alt_outputdir =/usr/openjdk/buildExport allow_downloads = true#Dua variabel lingkungan perlu dihapus, jika tidak akan ada masalah yang tidak disetel java_homeunset classpathmake 2> & 1 | tee $ alt_outputdir/build.log
Perhatikan bahwa sumber /etc /profile diperlukan untuk memperbarui konfigurasi. Tetapi setelah input, itu akan segera berjalan, tetapi itu tidak akan berhasil sekarang karena itu tergantung pada mereka yang belum dilakukan. Tekan Ctrl+C segera untuk berhenti.
5 Jalankan beberapa perintah di terminal untuk menginstal dependensi yang diperlukan, perintah adalah sebagai berikut:
sudo apt-get menginstal build-esensial gawk m4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif-common semut semut semut
Beberapa tempat juga menginstal OpenJDK-6-JDK. Bahkan, lebih baik tidak menginstal ini di sini. Kami menggunakan Oracle JDK untuk menyusun kode sumber OpenJDK kami. Tidak disarankan untuk menggunakan OpenJDK-6-JDK untuk mengkompilasi kode sumber OpenJDK. Itulah sebabnya alamat JDK menunjuk pada skrip build.sh saya adalah ekspor alt_bootdir =/usr/java/jdk1.6.0_32.
6 Sekarang kita pergi ke direktori /USR /OpenJDK untuk menjalankan perintah Make Sanity, dan periksa apakah konfigurasinya OK. Jika tidak ada masalah, itu akan ditampilkan
70.000 barang tersedia, hanya angin timur yang diperlukan, masuk membuat dan mulai menyusun. Hal -hal yang dikompilasi akan dihasilkan di Direktori/USR/OpenJDK/Build.
Ini adalah prosesnya, tetapi beberapa masalah akan terjadi selama periode ini. Menurut kesalahan yang dilaporkan olehnya, kita perlu memperbaiki beberapa kesalahan. Setelah koreksi, kami akan terus membuat perintah dan kemudian mengkompilasi.
Berikut adalah beberapa kesalahan dan solusi yang saya temui.
1>
echo "*** OS ini tidak didukung:" `uname -a`; keluar 1;
OpenJDK/Hotspot/Make/Linux/Makefile: 240: Resep untuk target 'check_os_version' gagal
menyelesaikan:
Komentar keluar tiga baris centang_os_version berikut/openjdk/hotspot/make/linux/makefile
check_os_version:
#ifeq ($ (disable_hotspot_os_version_check) $ (kosong_if_not_supported),),)
# $ (Diam -diam)> & 2 echo "*** OS ini tidak didukung:" `uname -a`; keluar 1;
#endif
2>
Referensi yang tidak ditentukan untuk `void g1satbcardtableModrefbs :: write_ref_array_pre_work <oopdesc*> (oopdesc **, int) '
Solusi: Set G1SATBCARDTABLEMODREFBS.CPP DI HOTSPOT/SRC/SHARE/VM/GC_IMPLEMENTASI/G1
Template <class t> void g1satbcardtablemodrefbs :: write_ref_array_pre_work (t* dst, int count) {if (! javathread :: Satb_mark_queue_set (). is_active ()) kembali; T* elem_ptr = dst; untuk (int i = 0; i <count; i ++, elem_ptr ++) {t heap_oop = oopdesc :: load_heap_oop (elem_ptr); if (! oopdesc :: is_null (heap_oop)) {enqueue (oopdesc :: decode_heap_oop_not_null (heap_oop)); }}} Tambahkan konten berikut ke konten
// 2017-10-19 Vicent_Chen Menambahkan void g1satbcardtableModrefbs :: write_ref_array_pre (oop* dst, int count, bool dest_uniniitialized) {if (! Dest_uniniitialized) {write_ref_array_pre_work (dst, dst); }} void g1satbcardtableModrefbs :: write_ref_array_pre (narrowoop* dst, int count, bool dest_uninialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }} // 2017-10-19 vicent_chen ditambahkan
Masukkan g1satbcardtableModrefbs.hpp di hotspot/src/share/vm/gc_implementation/g1 sebagai berikut
virtual void write_ref_array_pre (oop* dst, int count, bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }} virtual void write_ref_array_pre (narrowoop* dst, int count, bool dest_uninitialized) {if (! dest_uniniitialized) {write_ref_array_pre_work (dst, count); }}
Komentar keluar, dan kemudian tambahkan virtual void write_ref_array_pre (oop* dst, int count, bool dest_uninitialized); virtual void write_ref_array_pre (sempit* dst, int count, bool dest_unintialized);
3>
Kesalahan: Waktu lebih dari 10 tahun dari sekarang: 1136059200000
menyelesaikan:
Waktu berikut di OpenJDK/JDK/SRC/Bagikan/Kelas/Java/Util/CurrencyData.Properties file diubah menjadi dalam 10 tahun.
AZ = AZM; 2005-12-31-20-00-00; AZN
MZ = MZM; 2006-06-30-22-00-00; MZN
RO = ROL; 2005-06-30-21-00-00; Ron
TR = TRL; 2004-12-31-22-00-00; coba
VE = VEB; 2008-01-01-04-00-00; VEF
4> Di masa depan, ketika menyusun RMISERVERIMPL_STUB.class, ada kemungkinan bahwa memori tidak cukup, karena saya mengamati melalui monitor sistem bahwa memori telah meningkat tajam selama periode ini. Saya tidak tahu alasan spesifik, tetapi saya telah memasuki kembali perintah Make beberapa kali berturut-turut, sampai terakhir kalinya
Sukses lagi. Jadi ketika Anda menghadapi situasi ini, Anda dapat melakukannya lagi berkali -kali. Terakhir kali ingatan tidak meroket.
Kompilasi berhasil sebagai berikut:
Kemudian Anda dapat menemukan JDK yang dikompilasi di folder build.
Terima kasih semuanya, jika Anda memiliki pertanyaan, tolong tanyakan kepada saya.
Penjelasan terperinci di atas tentang kompilasi berdasarkan kompilasi mesin virtual JVM-OPENJDK adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.