เหตุผลที่ Java ได้รับการเลื่อนตำแหน่งเป็นเหตุผลใหญ่เพราะมันเป็นข้ามแพลตฟอร์มและบทบาทใหญ่ของมันเป็นเพราะความสัมพันธ์ของเครื่องเสมือน
โดยทั่วไปนักพัฒนาไม่จำเป็นต้องให้ความสนใจกับการใช้งานเครื่องเสมือนภายในเพื่อพัฒนาทุกวัน แต่บางครั้งเมื่อพูดถึงประสิทธิภาพพวกเขาจำเป็นต้องเข้าใจกลไกการใช้งานของเครื่องเสมือน
ดังนั้นสิ่งที่ฉันเขียนในวันนี้คือการรวบรวมชุดเครื่องเสมือนของคุณเองเพื่อปูทางสำหรับการทำความเข้าใจหลักการพื้นฐานของเครื่องเสมือนจริงในอนาคต
การรวบรวมเครื่องเสมือนอาจพบกับข้อผิดพลาดมากมายและต้องใช้เวลา เนื่องจากความแตกต่างในสภาพแวดล้อมของเราปัญหาที่เราอาจพบนั้นไม่สอดคล้องกัน
ฉันสามารถพูดได้ว่าฉันได้ระบุปัญหาทั้งหมดที่ฉันได้พบเช่นเดียวกับการสาด
1 ก่อนอื่นเราควรดาวน์โหลดซอร์สโค้ดของ OpenJDK OpenJDK นี้มีประวัติเวอร์ชันจริง ๆ คุณสามารถเรียนรู้เกี่ยวกับมัน
จากนั้นเนื้อหาซอร์สโค้ดส่วนใหญ่ที่นี่จะเหมือนกับเนื้อหาของ Oracle JDK และเนื้อหาบางส่วนจะแตกต่างกัน
ซอร์สโค้ดของ OpenJDK ฉันดาวน์โหลดที่นี่คือ OpenJDK-7U75-SRC-B13-18_DEC_2014.ZIP เวอร์ชันของทุกคนอาจแตกต่างกัน แต่เป็นซอร์สโค้ดของ OpenJDK
2 นอกเหนือจากการเตรียมสิ่งต่าง ๆ ข้างต้นคุณต้องเตรียม Oracle JDK ฉันใช้ jdk-6u32-linux-x64.bin สำหรับ JDK นี้
3 จากนั้นเตรียมการพึ่งพาต่าง ๆ บน Linux ก่อน การพึ่งพาเหล่านี้จะได้รับในภายหลัง นอกจากนี้ฉันต้องการพูดคุยเกี่ยวกับระบบ Linux ที่นี่
มันเป็น 16.04LTS 64 บิตของ Ubuntu ดังนั้นจึงเป็นการดีที่สุดที่จะเตรียม 64 บิตสำหรับสิ่งก่อนหน้านี้
ทุกอย่างพร้อมแล้วตอนนี้เราจะเริ่มทำงาน! - - -
1 หากคุณตั้งค่าตัวแปรสภาพแวดล้อม java_home หรือ classpath มาก่อนโปรดแสดงความคิดเห็นก่อน
2 UNZIP OPENJDK-7U75-SRC-B13-18_DEC_2014.ZIP และรับโฟลเดอร์ OpenJDK เราวางไว้ใต้ /usr
3Execute JDK-6U32-LINUX-X64.bin เพื่อรับโฟลเดอร์ JDK1.6.0_32 มาพูดถึงการวางโฟลเดอร์นี้ไว้ใน /usr /java
4 ป้อน vim /etc /profile และเพิ่มเนื้อหาต่อไปนี้ในตอนท้าย:
ส่งออก lang = c#bootstrap-jdk เส้นทางการติดตั้งแทนที่ด้วยเส้นทางของ bootstrap-jdk ส่งออก alt_bootdir =/usr/java/jdk1.6.0_32#เหมือนกับข้างบนฉันใช้ openjdk เพื่อรวบรวมและเมื่อฉันวิ่งฮอตสปอต ผู้อ่านสามารถแทนที่ด้วย oraclejdkexport alt_jdk_import_path =/usr/java/jdk1.6.0_32#ระบุหลายเธรดเพื่อเรียกใช้งานสคริปต์นี้ส่งออก hotspot_build_jobs = 4Export alt_parallel_compile_jobs = 4 build_jaxws = false#ส่งออก build_jaxp = false#ส่งออก build_corba = falseexport build_hotspot = trueeexport build_jdk = trueeexport skip_compare_images = trueBuild_deploy = tallebuild_install# Export Alt_OutputDir =/usr/openjdk/buildExport lewal_downloads = true#ตัวแปรสภาพแวดล้อมสองตัวต้องถูกลบออกมิฉะนั้นจะมีปัญหา unset java_homeunset classpathmake 2> & 1 | tee $ alt_outputdir/build.log
โปรดทราบว่าจำเป็นต้องมีแหล่งที่มา /etc /profile เพื่ออัปเดตการกำหนดค่า แต่หลังจากอินพุตมันจะทำงานทันที แต่มันจะไม่ประสบความสำเร็จในขณะนี้เพราะมันขึ้นอยู่กับสิ่งที่ยังไม่ได้ทำ กด Ctrl+C ทันทีเพื่อหยุดชั่วคราว
5 ดำเนินการคำสั่งบางอย่างในเทอร์มินัลเพื่อติดตั้งการพึ่งพาที่จำเป็นคำสั่งมีดังนี้:
sudo apt-get ติดตั้ง build-essential gawk m4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-proto-print-dev binutils libmotif-common ant มด
สถานที่บางแห่งยังติดตั้ง OpenJDK-6-JDK ในความเป็นจริงมันจะดีกว่าที่จะไม่ติดตั้งที่นี่ เราใช้ Oracle JDK เพื่อรวบรวมซอร์สโค้ด OpenJDK ของเรา ไม่แนะนำให้ใช้ OpenJDK-6-JDK เพื่อรวบรวมซอร์สโค้ด OpenJDK นั่นคือเหตุผลที่ที่อยู่ JDK ชี้ไปที่ในสคริปต์ build.sh ของฉันคือการส่งออก alt_bootdir =/usr/java/jdk1.6.0_32
6 ตอนนี้เราไปที่ไดเรกทอรี /USR /OpenJDK เพื่อดำเนินการคำสั่ง Make Sanity และตรวจสอบว่าการกำหนดค่านั้นตกลงหรือไม่ หากไม่มีปัญหาจะปรากฏขึ้น
มี 70,000 สิ่งที่มีเฉพาะลมตะวันออกเท่านั้นที่จำเป็นต้องป้อนและเริ่มรวบรวม สิ่งที่รวบรวมจะถูกสร้างขึ้นในไดเรกทอรี/usr/openjdk/build
นี่คือกระบวนการ แต่ปัญหาบางอย่างจะเกิดขึ้นในช่วงเวลานี้ ตามข้อผิดพลาดที่รายงานโดยเขาเราต้องแก้ไขข้อผิดพลาดบางอย่าง หลังจากการแก้ไขเราจะดำเนินการตามคำสั่งและรวบรวม
นี่คือข้อผิดพลาดและวิธีแก้ปัญหาที่ฉันพบ
1>
echo "*** ระบบปฏิบัติการนี้ไม่ได้รับการสนับสนุน:" `uname -a`; ออกจาก 1;
openjdk/hotspot/make/linux/makefile: 240: สูตรสำหรับเป้าหมาย 'check_os_version' ล้มเหลว
แก้ปัญหา:
แสดงความคิดเห็นออกมาสามบรรทัดต่อไปนี้ของ check_os_version in/openjdk/hotspot/make/linux/makefile
check_os_version:
#ifeq ($ (disable_hotspot_os_version_check) $ (emport_if_not_supported),)
# $ (เงียบ ๆ )> & 2 echo "*** ระบบปฏิบัติการนี้ไม่ได้รับการสนับสนุน:" `uname -a`; ออกจาก 1;
#endif
2>
การอ้างอิงที่ไม่ได้กำหนดเป็น `void G1SATBCARDTABLEMODREFBS :: WRITE_REF_ARRAY_PRE_WORK <OOPDESC*> (OOPDESC **, int) '
วิธีแก้ปัญหา: SET G1SATBCARDTABLEMODREFBS.CPP ใน HOTSPOT/SRC/Share/VM/GC_IMPLEMENTATION/G1
เทมเพลต <คลาส T> โมฆะ G1SATBCARDTABLEMODREFBS :: WRITE_REF_ARRAY_PRE_WORK (T* DST, จำนวน int) {ถ้า (! javathread :: satb_mark_queue_set (). is_active ()) กลับ; t* elem_ptr = dst; สำหรับ (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)); }}} เพิ่มเนื้อหาต่อไปนี้ลงในเนื้อหา
// 2017-10-19 VICENT_CHEN เพิ่มโมฆะ G1SATBCARDTABLEMODREFBS :: WRITE_REF_ARRAY_PRE (OOP* DST, จำนวน int, bool dest_uninitialized) {ถ้า (! dest_uninitialized) {write_ref_array_pre_work }} เป็นโมฆะ G1SATBCARDTABLEMODREFBS :: WRITE_REF_ARRAY_PRE (แคบ* DST จำนวน int จำนวน bool dest_uninitialized) {ถ้า (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }} // 2017-10-19 เพิ่ม Vicent_Chen
ใส่ G1SATBCARDTABLEMODREFBS.HPP ใน HOTSPOT/SRC/Share/VM/GC_Implementation/G1 ดังนี้
Virtual Void write_ref_array_pre (oop* dst, จำนวน int, bool dest_uninitialized) {ถ้า (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }} Virtual Void write_ref_array_pre (แคบ* dst, จำนวน int, bool dest_uninitialized) {ถ้า (! dest_uninitialized) {write_ref_array_pre_work (dst, count); -
แสดงความคิดเห็นจากนั้นเพิ่มโมฆะเสมือน Write_ref_array_pre (OOP* DST, จำนวน int, bool dest_uninitialized); Virtual Void write_ref_array_pre (แคบ* dst, จำนวน int, bool dest_unintialized);
3>
ข้อผิดพลาด: เวลามากกว่า 10 ปีนับจากปัจจุบัน: 1136059200000
แก้ปัญหา:
เวลาต่อไปนี้ใน OpenJDK/JDK/SRC/Share/classes/Java/Util/CurrencyData.properties เปลี่ยนเป็นภายใน 10 ปี
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; ลอง
VE = VEB; 2008-01-01-04-00-00; VEF;
4> ในอนาคตเมื่อรวบรวม rmiserverimpl_stub.class เป็นไปได้ว่าหน่วยความจำไม่เพียงพอเนื่องจากฉันสังเกตเห็นผ่านการตรวจสอบระบบว่าหน่วยความจำเพิ่มขึ้นอย่างรวดเร็วในช่วงเวลานี้ ฉันไม่ทราบเหตุผลเฉพาะ แต่ฉันกลับมาที่คำสั่ง Make หลายครั้งติดต่อกันจนกระทั่งครั้งสุดท้าย
ประสบความสำเร็จอีกครั้ง ดังนั้นเมื่อคุณพบสถานการณ์นี้คุณสามารถทำได้อีกหลายครั้ง ครั้งสุดท้ายที่หน่วยความจำไม่พุ่งสูงขึ้น
การรวบรวมประสบความสำเร็จดังนี้:
จากนั้นคุณสามารถค้นหา JDK ที่รวบรวมได้ในโฟลเดอร์ Build
ขอบคุณทุกคนหากคุณมีคำถามใด ๆ โปรดถามฉัน
คำอธิบายโดยละเอียดข้างต้นของการรวบรวมตามการรวบรวมเครื่องเสมือน JVM-Openjdk เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น