JVM คืออะไร? Java เครื่องเสมือน Archiเทคเจอร์
JVM คืออะไร Java?
Java เครื่องเสมือน (JVM) เป็นเอ็นจิ้นที่ให้สภาพแวดล้อมรันไทม์ในการขับเคลื่อน Java รหัสหรือแอปพลิเคชัน มันแปลง Java bytecode เป็นภาษาเครื่อง JVM เป็นส่วนหนึ่งของ Java สภาพแวดล้อมรันไทม์ (JRE) ในภาษาการเขียนโปรแกรมอื่น คอมไพลเลอร์จะสร้างรหัสเครื่องสำหรับระบบเฉพาะ อย่างไรก็ตาม, Java คอมไพเลอร์สร้างโค้ดสำหรับเครื่องเสมือนที่เรียกว่า Java เครื่องเสมือน
JVM ทำงานอย่างไร?
ประการแรก Java โค้ดจะถูกคอมไพล์เป็นไบต์โค้ด ไบต์โค้ดนี้จะถูกตีความบนเครื่องต่างๆ ระหว่างระบบโฮสต์และ Java แหล่งที่มา Bytecode เป็นภาษาตัวกลาง JVM ใน Java มีหน้าที่รับผิดชอบในการจัดสรรพื้นที่หน่วยความจำ

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