JVM คืออะไร? อธิบาย JVM Archiเทคเจอร์
⚡ สรุปอย่างชาญฉลาด
Java เครื่องเสมือน (JVM) คือกลไกที่ให้สภาพแวดล้อมการทำงานเพื่อขับเคลื่อนโปรแกรม Java โค้ดนี้แปลงไบต์โค้ดที่ไม่ขึ้นกับแพลตฟอร์มให้เป็นภาษาเครื่องดั้งเดิม ซึ่งเป็นส่วนหนึ่งของ... Java สภาพแวดล้อมการทำงานและการเปิดใช้งาน Javaความสามารถในการเขียนครั้งเดียวใช้งานได้ทุกที่

JVM คืออะไร Java?
Java เครื่องเสมือน (JVM) เป็นเอ็นจิ้นที่ให้สภาพแวดล้อมรันไทม์ในการขับเคลื่อน Java โค้ดหรือแอปพลิเคชัน มันแปลง Java bytecode เป็นภาษาเครื่อง JVM เป็นส่วนหนึ่งของ Java สภาพแวดล้อมการทำงาน (Runtime Environment หรือ JRE) ในภาษาโปรแกรมอื่นๆ คอมไพเลอร์จะสร้างรหัสเครื่องสำหรับระบบใดระบบหนึ่ง แต่ในภาษาโปรแกรมอื่นๆ นั้น... Java คอมไพเลอร์สร้างโค้ดสำหรับเครื่องเสมือนที่เรียกว่า Java เครื่องเสมือน
JVM ทำงานอย่างไร?
ประการแรก Java โค้ดจะถูกคอมไพล์เป็นไบต์โค้ด ไบต์โค้ดนี้จะถูกตีความในเครื่องต่างๆ ระหว่างระบบโฮสต์และ Java โค้ดไบต์เป็นภาษากลาง JVM ใน Java มีหน้าที่รับผิดชอบในการจัดสรรพื้นที่หน่วยความจำ
การทำงานของ Java เครื่องเสมือน (JVM)
Archiการสอนของ JVM (Java เครื่องเสมือน)
ต่อไปนี้ เรามาทำความเข้าใจสถาปัตยกรรมของ JVM กัน สถาปัตยกรรมของ JVM ใน Java ประกอบด้วยคลาสโหลดเดอร์ พื้นที่หน่วยความจำ กลไกการประมวลผล และอื่นๆ อีกมากมาย
Java เครื่องเสมือน Archiเทคเจอร์
1) คลาสโหลดเดอร์
ตัวโหลดคลาสเป็นระบบย่อยที่ใช้สำหรับโหลดไฟล์คลาส โดยทำหน้าที่หลักสามอย่าง ได้แก่ การโหลด การเชื่อมโยง และการเริ่มต้นใช้งาน
2) พื้นที่วิธีการ
พื้นที่เมธอด (Method Area) ของ JVM จะเก็บโครงสร้างของคลาส เช่น เมตาเดตา กลุ่มค่าคงที่สำหรับการทำงาน และโค้ดสำหรับเมธอดต่างๆ
3) ฮีป
ทั้งหมด วัตถุตัวแปรอินสแตนซ์ที่เกี่ยวข้อง และอาร์เรย์จะถูกจัดเก็บไว้ในฮีป หน่วยความจำนี้เป็นเรื่องธรรมดาและแชร์ในหลายเธรด
4) สแต็กภาษาของ JVM
Java สแต็กของภาษาจะเก็บตัวแปรโลคอลและผลลัพธ์บางส่วนของตัวแปรเหล่านั้น แต่ละเธรดจะมีสแต็ก JVM ของตัวเอง ซึ่งถูกสร้างขึ้นพร้อมกับการสร้างเธรดนั้น เฟรมใหม่จะถูกสร้างขึ้นทุกครั้งที่มีการเรียกใช้เมธอด และจะถูกลบเมื่อกระบวนการเรียกใช้เมธอดเสร็จสิ้น
5) การลงทะเบียนพีซี
รีจิสเตอร์ PC จะเก็บที่อยู่ของ Java คำสั่งเครื่องเสมือนที่กำลังทำงานอยู่ในขณะนี้ Javaแต่ละเธรดจะมีรีจิสเตอร์ PC แยกต่างหากของตัวเอง
6) สแต็ควิธีดั้งเดิม
เมธอดสแต็กแบบเนทีฟจะเก็บคำสั่งของโค้ดเนทีฟที่ขึ้นอยู่กับไลบรารีเนทีฟ โดยจะเขียนด้วยภาษาอื่นแทน Java.
7) กลไกการดำเนินการ
กลไกการประมวลผลจะอ่านไบต์โค้ดและประมวลผลทีละส่วน โดยใช้ตัวแปลภาษาและคอมไพเลอร์แบบ Just-In-Time (JIT) เพื่อแปลงไบต์โค้ดเป็นโค้ดเครื่องจักรดั้งเดิมและเรียกใช้งาน
8) อินเทอร์เฟซเมธอดเนทีฟ
Native Method Interface เป็นเฟรมเวิร์กการเขียนโปรแกรม มันช่วยให้ Java โค้ดที่ทำงานใน JVM เพื่อเรียก และถูกเรียกโดยแอปพลิเคชันและไลบรารีแบบเนทีฟ
9) ไลบรารีวิธีดั้งเดิม
Native Libraries คือชุดของไลบรารีเนทีฟ (C, C++) ซึ่งจำเป็นโดย Execution Engine
ซอฟต์แวร์ Code กระบวนการคอมไพล์และดำเนินการ
ในการเขียนและเรียกใช้โปรแกรมซอฟต์แวร์ คุณจำเป็นต้องมีสิ่งต่อไปนี้:
- 1) บรรณาธิการ – คุณสามารถใช้โปรแกรมของคุณพิมพ์ลงในไฟล์นั้นได้ เช่น โปรแกรม Notepad
- 2) ผู้รวบรวม – เพื่อแปลงโปรแกรมภาษาโปรแกรมระดับสูงของคุณให้เป็นโค้ดเครื่องจักรแบบเนทีฟ
- 3) ลิงค์เกอร์ – เพื่อรวมการอ้างอิงไฟล์โปรแกรมต่างๆ เข้าด้วยกันในโปรแกรมหลักของคุณ
- 4) ตัวโหลด – เพื่อโหลดไฟล์จากอุปกรณ์จัดเก็บข้อมูลสำรอง เช่น ฮาร์ดดิสก์ แฟลชไดรฟ์ หรือซีดี เข้าสู่หน่วยความจำหลัก (RAM) เพื่อประมวลผล การโหลดจะดำเนินการโดยอัตโนมัติเมื่อคุณเรียกใช้โค้ดของคุณ
- 5) การดำเนินการ – การประมวลผลโค้ดจริง ซึ่งจัดการโดยระบบปฏิบัติการและโปรเซสเซอร์ของคุณ
ด้วยข้อมูลพื้นฐานนี้ โปรดดูวิดีโอต่อไปนี้เพื่อเรียนรู้การทำงานภายในและสถาปัตยกรรมของ JVM (Java เครื่องเสมือน)
คลิก Good Farm Animal Welfare Awards หากไม่สามารถเข้าถึงวิดีโอได้
กระบวนการรวบรวมและดำเนินการรหัส C
เพื่อให้เข้าใจ Java ก่อนอื่น เรามาดูขั้นตอนการคอมไพล์และการเชื่อมโยงในภาษาซีกันอย่างคร่าวๆ ก่อน
สมมติว่าในฟังก์ชันหลัก คุณได้เรียกใช้ฟังก์ชันสองฟังก์ชัน คือ f1 และ f2 โดยฟังก์ชันหลักนั้นถูกเก็บไว้ในไฟล์ a1.c
ฟังก์ชัน f1 ถูกจัดเก็บไว้ในไฟล์ a2.c
ฟังก์ชัน f2 ถูกจัดเก็บไว้ในไฟล์ a3.c
ไฟล์ทั้งหมดเหล่านี้ ได้แก่ a1.c, a2.c และ a3.c จะถูกส่งไปยังคอมไพเลอร์ ซึ่งผลลัพธ์ที่ได้คือไฟล์ออบเจ็กต์ที่เกี่ยวข้อง ซึ่งก็คือรหัสเครื่องนั่นเอง
ขั้นตอนต่อไปคือการรวมไฟล์อ็อบเจ็กต์ทั้งหมดเหล่านี้เข้าเป็นไฟล์ .exe ไฟล์เดียวโดยใช้ตัวเชื่อมโยง (linker) ตัวเชื่อมโยงจะรวมไฟล์ทั้งหมดเข้าด้วยกันและสร้างไฟล์ .exe ขึ้นมา
ในระหว่างการทำงานของโปรแกรม โปรแกรมโหลดจะโหลดไฟล์ .exe เข้าไปในระบบ แรม เพื่อดำเนินการ
Java การรวบรวมโค้ดและการดำเนินการใน Java VM
ต่อไปนี้ เรามาดูขั้นตอนกัน Javaในฟังก์ชันหลักของคุณ มีสองเมธอด คือ f1 และ f2
- เมธอดหลักถูกเก็บไว้ในไฟล์ a1.java
- f1 ถูกเก็บไว้ในไฟล์เป็น a2.java
- f2 ถูกเก็บไว้ในไฟล์เป็น a3.java
คอมไพเลอร์จะคอมไพล์ไฟล์ทั้งสามไฟล์และสร้างไฟล์ .class ที่เกี่ยวข้องสามไฟล์ ซึ่งประกอบด้วยโค้ดไบต์ ต่างจากภาษา C ตรงที่ไม่มีการสร้างลิงก์
การขอ Java VM ทอง Java เครื่องเสมือน (Virtual Machine) ทำงานอยู่บนหน่วยความจำ RAM ระหว่างการทำงาน ระบบจะนำไฟล์คลาสเข้ามาใน RAM โดยใช้ตัวโหลดคลาส และมีการตรวจสอบรหัสไบต์ (BYTE code) เพื่อหาช่องโหว่ด้านความปลอดภัย
ถัดไป กลไกการประมวลผลจะแปลงไบต์โค้ดเป็นโค้ดเครื่องจักรดั้งเดิม นี่คือการคอมไพล์แบบทันเวลา (just-in-time compiling) ซึ่งเป็นหนึ่งในเหตุผลหลักว่าทำไม Java ค่อนข้างช้า
หมายเหตุ: JIT หรือคอมไพเลอร์แบบทันเวลาพอดี (Just-in-time compiler) เป็นส่วนหนึ่งของ... Java เครื่องเสมือน (JVM) ทำหน้าที่ตีความส่วนของไบต์โค้ดที่มีฟังก์ชันการทำงานคล้ายกันในเวลาเดียวกัน
เป็นเพราะเหตุใด Java ทั้งภาษาตีความและภาษาเรียบเรียง?
ภาษาโปรแกรม แบ่งออกเป็นประเภทต่างๆ ดังนี้:
- ภาษาขั้นสูง เช่น C++, Java
- ภาษาในระดับกลาง เช่น C
- ภาษาโปรแกรมระดับต่ำ เช่น Assembly
- สุดท้าย ระดับต่ำสุดคือภาษาเครื่อง
A ผู้รวบรวม คือโปรแกรมที่แปลงโปรแกรมจากระดับภาษาหนึ่งไปอีกระดับหนึ่ง ตัวอย่างเช่น การแปลงโปรแกรม C++ แปลงโปรแกรมเป็นรหัสเครื่อง Java คอมไพเลอร์แปลงระดับสูง Java แปลงโค้ดเป็นไบต์โค้ด (ซึ่งเป็นโค้ดเครื่องประเภทหนึ่งเช่นกัน)
An ล่าม เป็นโปรแกรมที่แปลงโปรแกรมในระดับหนึ่งไปเป็นภาษาโปรแกรมอื่นในระดับเดียวกัน ระดับเดียวกันตัวอย่างเช่น การแปลงค่าของ Java โปรแกรมเข้า C++.
In Javaตัวสร้างโค้ดแบบ Just-In-Time จะแปลงไบต์โค้ดเป็นโค้ดเครื่องจักรดั้งเดิม ซึ่งอยู่ในระดับการเขียนโปรแกรมเดียวกัน ดังนั้น Java เป็นทั้งภาษาคอมไพล์และภาษาอินเตอร์พรีเตอร์
เป็นเพราะเหตุใด Java ช้า?
สองเหตุผลหลักที่อยู่เบื้องหลังความเชื่องช้าของ Java คือ:
- การเชื่อมโยงแบบไดนามิก: ต่างจาก C ตรงที่การเชื่อมโยงจะเกิดขึ้น ณ รันไทม์ ทุกครั้งที่รันโปรแกรม Java.
- ล่ามรันไทม์: การแปลงรหัสไบต์เป็นรหัสเครื่องเนทิฟจะดำเนินการ ณ รันไทม์ใน Javaซึ่งยิ่งทำให้ความเร็วลดลงไปอีก
อย่างไรก็ตาม เวอร์ชันล่าสุดของ Java ได้แก้ไขปัญหาคอขวดด้านประสิทธิภาพเหล่านี้ไปได้มากแล้ว











