1 ภาพรวม
Java เป็นที่รู้จักกันดีในการสนับสนุนแพลตฟอร์ม Agnostic, Security และ Network Mobility แพลตฟอร์ม Java ประกอบด้วย Java Virtual Machines และ Java Core Classes ซึ่งให้อินเทอร์เฟซการเขียนโปรแกรมแบบครบวงจรสำหรับโปรแกรม Java บริสุทธิ์โดยไม่คำนึงถึงระบบปฏิบัติการที่ต่ำกว่า มันเป็นเพราะเครื่องเสมือนของ Java ที่เรียกร้องให้ "รวบรวมหนึ่งครั้งวิ่งไปทุกที่" สามารถรับประกันได้
1.1 กระบวนการดำเนินการโปรแกรม Java
การดำเนินการของโปรแกรม Java ขึ้นอยู่กับสภาพแวดล้อมการรวบรวมและสภาพแวดล้อมการทำงาน ซอร์สโค้ดจะถูกแปลงเป็นรหัสเครื่องที่ใช้งานได้ซึ่งเสร็จสิ้นโดยกระบวนการต่อไปนี้:
หลักของเทคโนโลยี Java คือ Java Virtual Machine เนื่องจากโปรแกรม Java ทั้งหมดทำงานบนเครื่องเสมือน การทำงานของโปรแกรม Java ต้องการความร่วมมือของ Java Virtual Machine, ไฟล์ Java API และ Java Class อินสแตนซ์ของเครื่องเสมือน Java รับผิดชอบในการเรียกใช้โปรแกรม Java เมื่อโปรแกรม Java เริ่มต้นขึ้นอินสแตนซ์ของเครื่องเสมือนจะเกิดขึ้น เมื่อโปรแกรมสิ้นสุดลงอินสแตนซ์ของเครื่องเสมือนจะตาย
คุณสมบัติข้ามแพลตฟอร์มของ Java เป็นเพราะมีเครื่องเสมือนที่กำหนดเป้าหมายไปที่แพลตฟอร์มที่แตกต่างกัน
1.2 Java Virtual Machine
ภารกิจหลักของเครื่องเสมือน Java คือการโหลดไฟล์คลาสและเรียกใช้งานไบต์ในนั้น ดังที่เห็นได้จากรูปด้านล่างเครื่องเสมือน Java มีตัวโหลดคลาสซึ่งสามารถโหลดไฟล์คลาสจากโปรแกรมและ APIs เฉพาะคลาสที่จำเป็นสำหรับการดำเนินการโปรแกรมจะถูกโหลดใน Java API และ Bytecode จะดำเนินการโดยเอ็นจิ้นการดำเนินการ
เมื่อซอฟต์แวร์เสมือน Java ถูกนำมาใช้โดยซอฟต์แวร์ในระบบปฏิบัติการโฮสต์โปรแกรม Java จะโต้ตอบกับโฮสต์โดยเรียกวิธีการในท้องถิ่น วิธี Java ถูกเขียนในภาษา Java รวบรวมไว้ใน bytecode และเก็บไว้ในไฟล์คลาส วิธีการในท้องถิ่นถูกเขียนในภาษา C/C ++/แอสเซมบลีซึ่งรวบรวมไว้ในรหัสเครื่องที่เกี่ยวข้องกับโปรเซสเซอร์เก็บไว้ในไลบรารีลิงก์แบบไดนามิกและรูปแบบเป็นกรรมสิทธิ์ของแต่ละแพลตฟอร์ม ดังนั้นวิธีการในท้องถิ่นคือการเชื่อมต่อโปรแกรม Java เข้ากับระบบปฏิบัติการโฮสต์พื้นฐาน
เนื่องจากเครื่องเสมือน Java ไม่ทราบว่าไฟล์คลาสถูกสร้างขึ้นอย่างไรและไม่ว่าจะถูกดัดแปลงมันจึงใช้เครื่องตรวจจับไฟล์คลาสเพื่อให้แน่ใจว่าประเภทที่กำหนดไว้ในไฟล์คลาสสามารถใช้งานได้อย่างปลอดภัย ตัวตรวจสอบไฟล์คลาสช่วยให้มั่นใจได้ถึงความแข็งแกร่งของโปรแกรมผ่านการสแกนอิสระสี่ครั้ง:
・ การรวบรวมไฟล์คลาส
・ ตรวจสอบความหมายของข้อมูลประเภท
・ การตรวจสอบ bytecode
・ การตรวจสอบการอ้างอิงสัญลักษณ์
เมื่อดำเนินการ bytecode เครื่องเสมือน Java จะดำเนินการกลไกการรักษาความปลอดภัยในตัวอื่น ๆ พวกเขาเป็นลักษณะของการสร้างความมั่นใจในความทนทานของโปรแกรม Java เป็นภาษาการเขียนโปรแกรม Java และยังเป็นลักษณะของเครื่องเสมือน Java:
・ การแปลงอ้างอิงประเภทปลอดภัย
・ การเข้าถึงหน่วยความจำที่มีโครงสร้าง
・ การรวบรวมขยะอัตโนมัติ
・ การตรวจสอบขอบเขตอาร์เรย์
・ การตรวจสอบใบเสนอราคาเปล่า
1.3 ประเภทข้อมูลเครื่องเสมือน Java
เครื่องเสมือน Java ทำการคำนวณผ่านประเภทข้อมูลบางชนิด ชนิดข้อมูลสามารถแบ่งออกเป็นสองประเภท: ประเภทพื้นฐานและประเภทอ้างอิงดังแสดงในรูปด้านล่าง:
แต่บูลีนค่อนข้างพิเศษ เมื่อคอมไพเลอร์คอมไพล์ซอร์สโค้ด Java ลงใน bytecode มันจะเป็นตัวแทนของบูลีนด้วย int หรือ byte ในเครื่องเสมือน Java False จะแสดงด้วย 0 และ TRUE จะแสดงโดยจำนวนเต็มที่ไม่ใช่ศูนย์ทั้งหมด เช่นเดียวกับภาษา Java ช่วงค่าของประเภทพื้นฐานของเครื่องเสมือน Java นั้นสอดคล้องกันทุกที่ไม่ว่าแพลตฟอร์มโฮสต์จะเป็นอย่างไรความยาวนั้นเป็นจำนวนเต็มที่ลงนามกับส่วนประกอบ 64 บิตของสองในเครื่องเสมือนใด ๆ
สำหรับ returnaddress ประเภทพื้นฐานนี้ใช้เพื่อใช้ประโยคในที่สุดในโปรแกรม Java โปรแกรมเมอร์ Java ไม่สามารถใช้ประเภทนี้ได้ค่าของมันจะชี้ไปที่ opcode ของคำสั่งเครื่องเสมือน
2architecture
ในข้อกำหนดของเครื่องเสมือน Java พฤติกรรมของอินสแตนซ์ของเครื่องเสมือนได้อธิบายไว้ในแง่ของระบบย่อยพื้นที่หน่วยความจำชนิดข้อมูลและคำแนะนำและส่วนประกอบเหล่านี้รวมกันแสดงสถาปัตยกรรมภายในเครื่องเสมือนจริงที่เป็นนามธรรม
ไฟล์ 2.1class
ไฟล์ Javaclass มีข้อมูลทั้งหมดเกี่ยวกับคลาสหรืออินเทอร์เฟซ "ประเภทพื้นฐาน" ของไฟล์คลาสมีดังนี้:
| U1 | 1 ไบต์ประเภทที่ไม่ได้ลงนาม |
| U2 | 2 ไบต์ประเภทที่ไม่ได้ลงนาม |
| U4 | 4 ไบต์ประเภทที่ไม่ได้ลงนาม |
| U8 | 8 ไบต์ประเภทที่ไม่ได้ลงนาม |
หากคุณต้องการทราบข้อมูลเพิ่มเติม JVM SE7 ของ Oracle ให้ข้อมูลจำเพาะอย่างเป็นทางการ: ข้อมูลจำเพาะของเครื่องเสมือนJava®
เนื้อหาของไฟล์คลาส:
ClassFile {U4 Magic; // หมายเลขเวทย์มนตร์: 0xCafeBabe ใช้เพื่อตรวจสอบว่าเป็นไฟล์คลาส Java u2 minor_version; // หมายเลขรุ่นรอง u2 major_version; // หมายเลขเวอร์ชันหลัก U2 constant_pool_count; // ขนาดพูลคงที่ cp_info constant_pool [constant_pool_count-1]; // พูลคงที่ u2 access_flags; // การเข้าถึงธงที่ระดับคลาสและอินเทอร์เฟซ (ได้รับผ่าน | การดำเนินการ) U2 this_class; // ดัชนีคลาส (ชี้ไปที่ค่าคงที่คลาสในพูลคงที่) U2 super_class; // ดัชนีคลาสปัจจุบัน (ชี้ไปที่ค่าคงที่คลาสในพูลคงที่) U2 interfaces_count; // อินเตอร์เฟสดัชนีตัวนับอินเตอร์เฟส U2 [interfaces_count]; // ดัชนีอินเตอร์เฟสตั้งค่า U2 fields_count; // ฟิลด์ตัวนับฟิลด์ฟิลด์ฟิลด์ฟิลด์ [ฟิลด์ fields_count]; // ตารางฟิลด์ตั้งค่า u2 methods_count; // วิธีการนับเมธอด method_info [methods_count]; // เมธอดตารางชุด u2 attributes_count; // จำนวนแอตทริบิวต์แอตทริบิวต์ _info แอตทริบิวต์ [attributes_count]; // ตารางแอตทริบิวต์} 2.2 ระบบย่อยตัวโหลดคลาส
ระบบย่อยตัวโหลดคลาสมีหน้าที่รับผิดชอบในการค้นหาและโหลดข้อมูลประเภท ในความเป็นจริงมีรถตักสองประเภทสำหรับเครื่องเสมือน Java: โหลดของระบบและรถตักที่กำหนดโดยผู้ใช้ อดีตเป็นส่วนหนึ่งของการใช้งานเครื่องเสมือน Java ในขณะที่หลังเป็นส่วนหนึ่งของโปรแกรม Java
・ Bootstrapclassloader: ใช้ในการโหลดไลบรารีหลักของ Java นำไปใช้ในรหัสดั้งเดิมและไม่ได้รับการสืบทอดจาก java.lang.classloader
・ ExtensionClassLoader: ใช้ในการโหลดไลบรารีส่วนขยาย Java การใช้งานเครื่องเสมือน Java จะให้ไดเรกทอรีส่วนขยายของไลบรารี ตัวโหลดคลาสนี้ค้นหาและโหลดคลาส Java ในไดเรกทอรีนี้
・ แอปพลิเคชันคลาสโหลดเดอร์: มันโหลดคลาส Java ตาม classpath ของแอปพลิเคชัน Java (classpath) โดยทั่วไปแล้วคลาสแอปพลิเคชัน Java จะถูกโหลดโดย สามารถรับได้ผ่าน classloader.getSystemClassLoader ()
นอกเหนือจากตัวโหลดคลาสที่จัดทำโดยระบบแล้วนักพัฒนาสามารถใช้ตัวโหลดคลาสของตัวเองได้โดยการสืบทอดคลาส Java.lang.Classloader เพื่อตอบสนองความต้องการพิเศษบางอย่าง
ระบบย่อยตัวโหลดคลาสเกี่ยวข้องกับส่วนประกอบอื่น ๆ ของเครื่องเสมือน Java และคลาสจากไลบรารี Java.lang วิธีการที่กำหนดโดย classloader ให้อินเทอร์เฟซสำหรับโปรแกรมเพื่อเข้าถึงกลไกการโหลดคลาส นอกจากนี้สำหรับแต่ละประเภทที่โหลดเครื่องเสมือน Java จะสร้างอินสแตนซ์ของคลาส java.lang.class เพื่อแสดงประเภท เช่นเดียวกับวัตถุอื่น ๆ ตัวโหลดคลาสที่ผู้ใช้กำหนดและอินสแตนซ์ของคลาสจะถูกวางไว้ในพื้นที่ฮีปในหน่วยความจำในขณะที่ข้อมูลประเภทที่โหลดอยู่ในพื้นที่วิธีการ
นอกเหนือจากการค้นหาและนำเข้าไฟล์คลาสไบนารีแล้วระบบย่อยตัวโหลดคลาสจะต้องรับผิดชอบในการตรวจสอบความถูกต้องของคลาสที่นำเข้าจัดสรรและเริ่มต้นหน่วยความจำสำหรับตัวแปรคลาสและการวิเคราะห์การอ้างอิงเชิงสัญลักษณ์ การกระทำเหล่านี้จำเป็นต้องดำเนินการตามลำดับต่อไปนี้:
・ โหลด (ค้นหาและโหลดข้อมูลไบนารีของประเภท)
・ การเชื่อมต่อ (การตรวจสอบการดำเนินการ: ตรวจสอบความถูกต้องของประเภทที่นำเข้า; การเตรียม: จัดสรรหน่วยความจำสำหรับตัวแปรคลาสและเริ่มต้นเป็นค่าเริ่มต้นการแยกวิเคราะห์: แปลงการอ้างอิงเชิงสัญลักษณ์ในประเภทเป็นข้อมูลอ้างอิงโดยตรง)
・ การเริ่มต้น (ตัวแปรคลาสจะเริ่มต้นเป็นค่าเริ่มต้นที่ถูกต้อง)
2.3 พื้นที่วิธีการ
ในเครื่องเสมือน Java ข้อมูลเกี่ยวกับประเภทที่โหลดจะถูกเก็บไว้ในหน่วยความจำในพื้นที่วิธีการ เมื่อเครื่องเสมือนโหลดประเภทที่แน่นอนจะใช้ตัวโหลดคลาสเพื่อค้นหาไฟล์คลาสที่สอดคล้องกันจากนั้นอ่านไฟล์คลาสและถ่ายโอนไปยังเครื่องเสมือน จากนั้นเครื่องเสมือนจะดึงข้อมูลประเภทไว้ในนั้นและเก็บข้อมูลนี้ไว้ในพื้นที่วิธีการ นอกจากนี้ยังสามารถรวบรวมพื้นที่ของวิธีการโดยเครื่องเก็บขยะเนื่องจากเครื่องเสมือนช่วยให้สามารถขยายไดนามิกของโปรแกรม Java ผ่านตัวโหลดคลาสที่ผู้ใช้กำหนด
ข้อมูลต่อไปนี้ถูกเก็บไว้ในพื้นที่วิธีการ:
・ ชื่อที่ผ่านการรับรองประเภทนี้ (เช่นชื่อ Java.lang.Object)
・ ชื่อที่ผ่านการรับรองของ superclass โดยตรงประเภทนี้
・ เป็นประเภทคลาสประเภทนี้หรือประเภทอินเตอร์เฟส
・ ตัวดัดแปลงการเข้าถึงประเภทนี้ (ชุดย่อยของสาธารณะ, บทคัดย่อ, สุดท้าย)
・ รายการเรียงลำดับชื่อที่ผ่านการรับรองเต็มรูปแบบสำหรับ hyperinterface โดยตรงใด ๆ
・ พูลคงที่ประเภทนี้ (คอลเลกชันที่สั่งซื้อรวมถึงค่าคงที่โดยตรง [สตริง, จำนวนเต็มและค่าคงที่ลอยตัว] และการอ้างอิงเชิงสัญลักษณ์ไปยังประเภทอื่น ๆ ฟิลด์และวิธีการ)
・ ข้อมูลฟิลด์ (ชื่อฟิลด์, ประเภท, ตัวดัดแปลง)
・ ข้อมูลวิธีการ (ชื่อวิธี, ประเภทการส่งคืน, จำนวนพารามิเตอร์และประเภท, ตัวดัดแปลง)
・ ตัวแปรคลาสทั้งหมด (คงที่) ยกเว้นค่าคงที่
・ การอ้างอิงถึงคลาส classloader (เมื่อโหลดแต่ละประเภทเครื่องเสมือนต้องติดตามว่าโหลดโดยตัวโหลดคลาสเริ่มต้นหรือตัวโหลดคลาสที่ผู้ใช้กำหนด)
・ การอ้างอิงถึงคลาสคลาส (สำหรับแต่ละประเภทที่โหลดเครื่องเสมือนจะสร้างอินสแตนซ์ของ Java.lang.class คลาสตามตัวอย่างเช่นหากคุณมีการอ้างอิงถึงวัตถุของ Java.lang
2.4 กอง
อินสแตนซ์หรืออาร์เรย์คลาสทั้งหมดที่สร้างโดยโปรแกรม Java ที่รันไทม์ (อาร์เรย์เป็นวัตถุจริงในเครื่องเสมือน Java) จะถูกวางไว้ในกองเดียวกัน เนื่องจากอินสแตนซ์ของเครื่องเสมือน Java มีพื้นที่เพียงหนึ่งกองเธรดทั้งหมดจะแบ่งปันกองนี้ ควรสังเกตว่าเครื่องเสมือน Java มีคำแนะนำในการจัดสรรวัตถุในกอง แต่ไม่มีคำแนะนำในการเพิ่มหน่วยความจำเนื่องจากเครื่องเสมือนส่งมอบงานนี้ให้กับนักสะสมขยะสำหรับการประมวลผล ข้อกำหนดของเครื่องเสมือน Java ไม่ได้บังคับใช้นักสะสมขยะ แต่ต้องการเพียงการใช้งานเครื่องเสมือนจะต้องจัดการพื้นที่กองของตัวเอง "ในบางวิธี" ตัวอย่างเช่นการใช้งานอาจมีพื้นที่กองขนาดคงที่เท่านั้น เมื่อพื้นที่เต็มไปด้วยมันเพียงแค่โยนข้อยกเว้น outofmemory ซึ่งไม่ได้พิจารณาปัญหาของวัตถุขยะรีไซเคิล แต่มันก็สอดคล้องกับข้อกำหนด
ข้อกำหนดของเครื่องเสมือน Java ไม่ได้ระบุว่าวัตถุ Java ถูกแสดงใน HEAP อย่างไรซึ่งจะช่วยให้ผู้ดำเนินการตัดสินใจของเครื่องเสมือนเกี่ยวกับวิธีการออกแบบ การออกแบบกองที่เป็นไปได้มีดังนี้:
พูลด้ามจับพูลวัตถุ การอ้างอิงของวัตถุคือตัวชี้ท้องถิ่นไปยังพูลด้ามจับ ประโยชน์ของการออกแบบนี้เอื้อต่อการจัดเรียงชิ้นส่วนกอง เมื่อย้ายวัตถุในพูลวัตถุส่วนที่จับจะต้องเปลี่ยนที่อยู่ใหม่ของตัวชี้ที่ชี้ไปที่วัตถุ ข้อเสียคือทุกครั้งที่มีการเข้าถึงตัวแปรอินสแตนซ์ของวัตถุจะต้องส่งผ่านตัวชี้สองตัว
2.5 Java Stack
เมื่อใดก็ตามที่มีเธรดเริ่มต้นเครื่องเสมือน Java จะจัดสรรสแต็ก Java ให้กับมัน สแต็ค Java ประกอบด้วยเฟรมสแต็กจำนวนมากเฟรมหนึ่งสแต็กมีสถานะของการเรียกใช้วิธี Java เมื่อเธรดเรียกวิธี Java เครื่องเสมือนจะผลักเฟรมสแต็กใหม่ลงในสแต็ก Java ของเธรด เมื่อวิธีการส่งคืนเฟรมสแต็กจะปรากฏขึ้นจากสแต็ก Java Java Stack เก็บสถานะของการเรียกใช้วิธี Java ในเธรด - รวมถึงตัวแปรท้องถิ่นพารามิเตอร์ค่าส่งคืนและผลลัพธ์ระดับกลางของการดำเนินงาน ฯลฯ เครื่องเสมือน Java ไม่มีการลงทะเบียนและชุดคำสั่งของพวกเขาใช้ Java Stack เพื่อจัดเก็บข้อมูลกลาง เหตุผลสำหรับการออกแบบนี้คือการรักษาชุดคำสั่งของเครื่องเสมือน Java ให้มีขนาดกะทัดรัดที่สุดเท่าที่จะเป็นไปได้และยังอำนวยความสะดวกในการใช้งานเครื่องเสมือน Java บนแพลตฟอร์มที่มีการลงทะเบียนทั่วไปเพียงไม่กี่ตัว นอกจากนี้สถาปัตยกรรมที่ใช้สแต็กยังช่วยเพิ่มประสิทธิภาพรหัสของคอมไพเลอร์แบบไดนามิกและคอมไพเลอร์ทันทีที่ใช้งานโดยเครื่องเสมือนบางอย่างในระหว่างการรันไทม์
2.5.1 กรอบสแต็ก
เฟรมสแต็กประกอบด้วยพื้นที่ตัวแปรท้องถิ่นตัวถูกดำเนินการสแต็กและพื้นที่ข้อมูลเฟรม เมื่อเครื่องเสมือนเรียกใช้วิธี Java จะได้รับพื้นที่ตัวแปรท้องถิ่นและขนาดสแต็กของวิธีการนี้จากข้อมูลประเภทของคลาสที่สอดคล้องกันและจัดสรรหน่วยความจำเฟรมสแต็กตามนี้แล้วดันเข้าไปในสแต็ก Java
2.5.1.1 พื้นที่ตัวแปรท้องถิ่น
พื้นที่ตัวแปรท้องถิ่นถูกจัดเป็นอาร์เรย์นับตั้งแต่ 0 ในหน่วยที่มีความยาวคำ คำสั่ง bytecode ใช้ข้อมูลในดัชนีเริ่มต้นจาก 0 ค่าของประเภท int, ลอยการอ้างอิงและ returnaddress ครอบครองหนึ่งรายการในอาร์เรย์ในขณะที่ค่าของประเภทไบต์สั้นและถ่านจะถูกแปลงเป็นค่า int ก่อนที่จะถูกเก็บไว้ในอาร์เรย์และยังครอบครองหนึ่งรายการ แต่ค่าของประเภทที่ยาวและเป็นสองเท่าครอบครองสองคำติดต่อกันในอาร์เรย์
2.5.1.2 ตัวถูกดำเนินการสแต็ก
เช่นเดียวกับพื้นที่ตัวแปรท้องถิ่นสแต็กตัวถูกดำเนินการยังถูกจัดเป็นอาร์เรย์ในความยาวของคำ มันเข้าถึงได้ผ่านสแต็กสแต็กสแต็คมาตรฐานและสแต็คออก เนื่องจากตัวนับโปรแกรมไม่สามารถเข้าถึงได้โดยตรงโดยคำแนะนำโปรแกรมคำแนะนำของเครื่องเสมือน Java จึงได้รับตัวถูกดำเนินการจากตัวถูกดำเนินการดังนั้นการดำเนินการของมันจึงขึ้นอยู่กับสแต็กมากกว่าในการลงทะเบียน เครื่องเสมือนใช้ตัวถูกดำเนินการสแต็กเป็นพื้นที่ทำงานเนื่องจากคำแนะนำส่วนใหญ่ต้องปรากฏขึ้นข้อมูลจากที่นี่ดำเนินการแล้วผลักผลลัพธ์กลับไปยังสแต็กตัวถูกดำเนินการ
2.5.1.3 พื้นที่ข้อมูลเฟรม
นอกเหนือจากพื้นที่ตัวแปรท้องถิ่นและตัวถูกดำเนินการเฟรม Java Stack ยังต้องใช้พื้นที่ข้อมูลเฟรมเพื่อรองรับการวิเคราะห์สระว่ายน้ำอย่างต่อเนื่องการกลับมาของวิธีปกติและกลไกการจัดส่งข้อยกเว้น เมื่อใดก็ตามที่เครื่องเสมือนต้องการดำเนินการคำสั่งที่ต้องใช้ข้อมูลพูลคงที่มันจะเข้าถึงได้ผ่านตัวชี้ไปยังพูลคงที่ในพื้นที่ข้อมูลเฟรม นอกเหนือจากการแยกวิเคราะห์สระว่ายน้ำคงที่พื้นที่ข้อมูลเฟรมยังช่วยให้เครื่องเสมือนจัดการกับปลายปกติหรือการยกเลิกวิธีการชวาผิดปกติ หากการส่งคืนสิ้นสุดตามปกติเครื่องเสมือนจะต้องกู้คืนเฟรมสแต็กของวิธีการเริ่มต้นการโทรรวมถึงการตั้งค่าตัวนับโปรแกรมเพื่อชี้ไปที่คำสั่งถัดไปที่เริ่มต้นวิธีการโทร หากวิธีการมีค่าส่งคืนเครื่องเสมือนจะต้องผลักมันเข้าไปในสแต็กตัวถูกดำเนินการของวิธีการเริ่มต้นการโทร เพื่อจัดการกับข้อยกเว้นในระหว่างการดำเนินการวิธี Java พื้นที่ข้อมูลเฟรมยังมีการอ้างอิงถึงตารางข้อยกเว้นของวิธีนี้
2.6 เคาน์เตอร์โปรแกรม
สำหรับโปรแกรม Java ที่รันแต่ละเธรดมีตัวนับโปรแกรม เคาน์เตอร์โปรแกรมเรียกอีกอย่างว่า PC Registers ตัวนับโปรแกรมสามารถถือได้ทั้งตัวชี้ท้องถิ่นและ returnaddress เมื่อเธรดดำเนินการวิธี Java ค่าของตัวนับโปรแกรมจะเป็นที่อยู่ของคำสั่งที่ดำเนินการต่อไปเสมอ ที่อยู่ที่นี่สามารถเป็นตัวชี้ท้องถิ่นหรือชดเชยในวิธีการ bytecode เทียบกับคำสั่งเริ่มต้นวิธีการ หากเธรดกำลังดำเนินการวิธีการท้องถิ่นค่าของตัวนับโปรแกรมคือ "ไม่ได้กำหนด"
2.7 วิธีการในท้องถิ่นสแต็ก
อินเทอร์เฟซวิธีการใด ๆ จะใช้สแต็ควิธีการในท้องถิ่น เมื่อเธรดเรียกวิธี Java เครื่องเสมือนจะสร้างเฟรมสแต็กใหม่และดันเข้าไปในสแต็ก Java เมื่อเรียกใช้วิธีการในท้องถิ่นเครื่องเสมือนจะเก็บสแต็คชวาไม่เปลี่ยนแปลงและไม่ผลักเข้าไปในสแต็คใหม่ในสแต็คจาวาเกลียวอีกต่อไป เครื่องเสมือนเพียงเชื่อมต่อแบบไดนามิกและเรียกใช้วิธีการท้องถิ่นที่ระบุโดยตรง
พื้นที่วิธีการและกองถูกแชร์โดยเธรดทั้งหมดในอินสแตนซ์ของเครื่องเสมือน เมื่อเครื่องเสมือนโหลดไฟล์คลาสจะวิเคราะห์ข้อมูลประเภทจากข้อมูลไบนารีที่มีอยู่ในไฟล์คลาสแล้ววางข้อมูลประเภทในพื้นที่เมธอด เมื่อโปรแกรมกำลังทำงานเครื่องเสมือนจะวางวัตถุทั้งหมดที่สร้างโดยโปรแกรมที่รันไทม์ลงในฮีป
เช่นเดียวกับพื้นที่หน่วยความจำรันไทม์อื่น ๆ พื้นที่หน่วยความจำที่ครอบครองโดยสแต็กวิธีการในท้องถิ่นสามารถขยายหรือหดตัวได้ตามต้องการ
3 เอ็นจินการดำเนินการ
ในข้อกำหนดของเครื่องเสมือน Java พฤติกรรมของเอ็นจิ้นการดำเนินการถูกกำหนดโดยใช้ชุดคำสั่ง นักออกแบบที่ใช้งานเอ็นจิ้นการดำเนินการจะตัดสินใจว่าจะดำเนินการ bytecode วิธีการใช้งานสามารถตีความได้รวบรวมได้ทันทีหรือดำเนินการโดยตรงโดยใช้คำแนะนำบนชิปหรือส่วนผสมของพวกเขา
เอ็นจิ้นการดำเนินการสามารถเข้าใจได้ว่าเป็นข้อกำหนดที่เป็นนามธรรมการใช้งานที่เป็นรูปธรรมหรืออินสแตนซ์ที่กำลังดำเนินอยู่ ข้อมูลจำเพาะบทคัดย่อใช้ชุดคำสั่งเพื่อระบุพฤติกรรมของเอ็นจิ้นการดำเนินการ การใช้งานที่เฉพาะเจาะจงอาจใช้เทคโนโลยีที่แตกต่างหลากหลาย - รวมถึงซอฟต์แวร์ฮาร์ดแวร์หรือการรวมกันของเทคโนโลยีต้นไม้ เอ็นจิ้นการดำเนินการเป็นอินสแตนซ์รันไทม์เป็นเธรด
แต่ละเธรดของโปรแกรม Java ที่รันเป็นอินสแตนซ์ของเอ็นจินการดำเนินการเครื่องเสมือนอิสระ ตั้งแต่ต้นจนถึงจุดสิ้นสุดของวงจรชีวิตของเธรดมันเป็นทั้งการดำเนินการ bytecode หรือดำเนินการวิธีการในท้องถิ่น
3.1 ชุดคำสั่ง
Bytecode Stream ของวิธีการประกอบด้วยลำดับของคำแนะนำจากเครื่องเสมือน Java แต่ละคำสั่งมี opcode ไบต์เดียวตามด้วย 0 ตัวหรือมากกว่าตัวถูกดำเนินการ opcode แสดงถึงการดำเนินการที่จะดำเนินการ; ตัวถูกดำเนินการจัดหาข้อมูลเพิ่มเติมของเครื่องชวาพร้อมข้อมูลเพิ่มเติมที่จำเป็นในการดำเนินการ opcode เมื่อเครื่องเสมือนดำเนินการคำสั่งมันอาจใช้รายการในพูลคงที่ปัจจุบันค่าในตัวแปรท้องถิ่นของเฟรมปัจจุบันหรือค่าที่ด้านบนของสแต็กตัวถูกดำเนินการของเฟรมปัจจุบัน
เอ็นจิ้นการดำเนินการเชิงนามธรรมดำเนินการคำสั่งหนึ่งไบต์ทีละคำสั่ง แต่ละเธรด (อินสแตนซ์เอ็นจิ้นการดำเนินการ) ของโปรแกรมที่ทำงานในเครื่องเสมือน Java ดำเนินการนี้ เอ็นจิ้นการดำเนินการจะได้รับ opcode และหาก opcode มีตัวถูกดำเนินการจะได้รับตัวถูกดำเนินการ มันดำเนินการตามที่ระบุโดย opcode และตัวถูกดำเนินการติดตามจากนั้นรับ opcode ถัดไป กระบวนการของการดำเนินการ bytecode นี้จะดำเนินการต่อไปจนกว่าเธรดจะเสร็จสมบูรณ์และการเสร็จสิ้นของเธรดสามารถทำเครื่องหมายได้โดยการกลับมาจากวิธีการเริ่มต้นหรือไม่จับข้อยกเว้นที่ถูกโยนทิ้ง
4 อินเตอร์เฟสวิธีการท้องถิ่น
อินเทอร์เฟซ Local Java หรือที่เรียกว่า JNI (JavanativeInterface) พร้อมสำหรับการพกพา อินเทอร์เฟซวิธีการในท้องถิ่นช่วยให้วิธีการในพื้นที่ต่อไปนี้:
ผ่านหรือส่งคืนข้อมูล
ตัวแปรอินสแตนซ์การดำเนินการ
ใช้งานตัวแปรคลาสหรือวิธีการโทร
อาร์เรย์ตัวถูกดำเนินการ
ล็อควัตถุกอง
โหลดคลาสใหม่
โยนข้อยกเว้น
จับข้อยกเว้นที่ถูกโยนโดยวิธีการในท้องถิ่นที่เรียกวิธี Java
จับข้อยกเว้นแบบอะซิงโครนัสที่ถูกโยนลงโดยเครื่องเสมือนจริง
ระบุว่าไม่จำเป็นต้องใช้วัตถุเก็บขยะอีกต่อไป
สรุป
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้เกี่ยวกับความเข้าใจเชิงลึกของสถาปัตยกรรมเครื่องเสมือน Java และฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!