JVM คืออะไร? อธิบาย JVM Archiเทคเจอร์

⚡ สรุปอย่างชาญฉลาด

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

  • 🧩 ตัวเชื่อมต่อไบต์โค้ด: การขอ Java คอมไพเลอร์สร้างไบต์โค้ดแทนที่จะเป็นรหัสเครื่อง และ JVM จะตีความไบต์โค้ดนั้นบนระบบโฮสต์ใดๆ ก็ได้
  • 🏗️ แกน Archiเทคเจอร์: JVM ผสานรวม ClassLoader, พื้นที่เมธอด, ฮีป, สแต็ก, รีจิสเตอร์ PC และเอนจินการประมวลผลเข้าด้วยกันเพื่อรันโปรแกรม
  • 🔄 ขั้นตอนการคอมไพล์: ต่างจากซี Java ไม่จำเป็นต้องมีการเชื่อมโยง ไฟล์คลาสจะถูกโหลดเข้าสู่ RAM ตรวจสอบความถูกต้อง แล้วจึงดำเนินการในขณะรันไทม์
  • คอมไพเลอร์ JIT: คอมไพเลอร์แบบ Just-In-Time จะแปลงไบต์โค้ดเป็นโค้ดเครื่องจักรดั้งเดิมในระหว่างการประมวลผลเพื่อปรับปรุงประสิทธิภาพ
  • 🐢 หมายเหตุประสิทธิภาพ: การเชื่อมโยงแบบไดนามิกและการตีความขณะรันไทม์ในอดีตทำให้ Java ช้าลงกว่าเดิม แต่เวอร์ชันสมัยใหม่ได้ลดช่องว่างนั้นลงไปมากแล้ว

JVM Archiเทคเจอร์

JVM คืออะไร Java?

Java เครื่องเสมือน (JVM) เป็นเอ็นจิ้นที่ให้สภาพแวดล้อมรันไทม์ในการขับเคลื่อน Java โค้ดหรือแอปพลิเคชัน มันแปลง Java bytecode เป็นภาษาเครื่อง JVM เป็นส่วนหนึ่งของ Java สภาพแวดล้อมการทำงาน (Runtime Environment หรือ JRE) ในภาษาโปรแกรมอื่นๆ คอมไพเลอร์จะสร้างรหัสเครื่องสำหรับระบบใดระบบหนึ่ง แต่ในภาษาโปรแกรมอื่นๆ นั้น... Java คอมไพเลอร์สร้างโค้ดสำหรับเครื่องเสมือนที่เรียกว่า Java เครื่องเสมือน

JVM ทำงานอย่างไร?

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

การทำงานของ Java เครื่องเสมือน JVM

การทำงานของ Java เครื่องเสมือน (JVM)

Archiการสอนของ JVM (Java เครื่องเสมือน)

ต่อไปนี้ เรามาทำความเข้าใจสถาปัตยกรรมของ JVM กัน สถาปัตยกรรมของ JVM ใน Java ประกอบด้วยคลาสโหลดเดอร์ พื้นที่หน่วยความจำ กลไกการประมวลผล และอื่นๆ อีกมากมาย

JVM Archiเทคเจอร์

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

ฟังก์ชันหลักของโค้ด C a1.c

ฟังก์ชัน f1 ถูกจัดเก็บไว้ในไฟล์ a2.c

ฟังก์ชัน f1 a2.c ในโค้ด C

ฟังก์ชัน f2 ถูกจัดเก็บไว้ในไฟล์ a3.c

ฟังก์ชัน f2 a3.c ในโค้ด C

ไฟล์ทั้งหมดเหล่านี้ ได้แก่ a1.c, a2.c และ a3.c จะถูกส่งไปยังคอมไพเลอร์ ซึ่งผลลัพธ์ที่ได้คือไฟล์ออบเจ็กต์ที่เกี่ยวข้อง ซึ่งก็คือรหัสเครื่องนั่นเอง

คอมไพเลอร์โค้ด C สร้างไฟล์อ็อบเจ็กต์

ขั้นตอนต่อไปคือการรวมไฟล์อ็อบเจ็กต์ทั้งหมดเหล่านี้เข้าเป็นไฟล์ .exe ไฟล์เดียวโดยใช้ตัวเชื่อมโยง (linker) ตัวเชื่อมโยงจะรวมไฟล์ทั้งหมดเข้าด้วยกันและสร้างไฟล์ .exe ขึ้นมา

ตัวเชื่อมโยงโค้ด C สร้างไฟล์ .exe

ในระหว่างการทำงานของโปรแกรม โปรแกรมโหลดจะโหลดไฟล์ .exe เข้าไปในระบบ แรม เพื่อดำเนินการ

ตัวโหลดโค้ด C โหลดไฟล์ exe เข้าสู่ RAM

Java การรวบรวมโค้ดและการดำเนินการใน Java VM

ต่อไปนี้ เรามาดูขั้นตอนกัน Javaในฟังก์ชันหลักของคุณ มีสองเมธอด คือ f1 และ f2

  • เมธอดหลักถูกเก็บไว้ในไฟล์ a1.java
  • f1 ถูกเก็บไว้ในไฟล์เป็น a2.java
  • f2 ถูกเก็บไว้ในไฟล์เป็น a3.java

Java โค้ดจะคอมไพล์ไฟล์สามไฟล์ให้เป็นไฟล์คลาส

คอมไพเลอร์จะคอมไพล์ไฟล์ทั้งสามไฟล์และสร้างไฟล์ .class ที่เกี่ยวข้องสามไฟล์ ซึ่งประกอบด้วยโค้ดไบต์ ต่างจากภาษา C ตรงที่ไม่มีการสร้างลิงก์

การขอ Java VM ทอง Java เครื่องเสมือน (Virtual Machine) ทำงานอยู่บนหน่วยความจำ RAM ระหว่างการทำงาน ระบบจะนำไฟล์คลาสเข้ามาใน RAM โดยใช้ตัวโหลดคลาส และมีการตรวจสอบรหัสไบต์ (BYTE code) เพื่อหาช่องโหว่ด้านความปลอดภัย

Java ตัวโหลดคลาสจะนำไฟล์คลาสเข้าสู่หน่วยความจำ RAM

ถัดไป กลไกการประมวลผลจะแปลงไบต์โค้ดเป็นโค้ดเครื่องจักรดั้งเดิม นี่คือการคอมไพล์แบบทันเวลา (just-in-time compiling) ซึ่งเป็นหนึ่งในเหตุผลหลักว่าทำไม Java ค่อนข้างช้า

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 คือ:

  1. การเชื่อมโยงแบบไดนามิก: ต่างจาก C ตรงที่การเชื่อมโยงจะเกิดขึ้น ณ รันไทม์ ทุกครั้งที่รันโปรแกรม Java.
  2. ล่ามรันไทม์: การแปลงรหัสไบต์เป็นรหัสเครื่องเนทิฟจะดำเนินการ ณ รันไทม์ใน Javaซึ่งยิ่งทำให้ความเร็วลดลงไปอีก

อย่างไรก็ตาม เวอร์ชันล่าสุดของ Java ได้แก้ไขปัญหาคอขวดด้านประสิทธิภาพเหล่านี้ไปได้มากแล้ว

คำถามที่พบบ่อย

JVM รองรับการทำงานของเฟรมเวิร์กด้าน AI และบิ๊กดาต้า เช่น Deeplearning4j, Weka และ Apache Sparkคอมไพเลอร์แบบ Just-In-Time และระบบจัดการหน่วยความจำของไลบรารีเหล่านี้ ช่วยให้สามารถประมวลผลชุดข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพในทุกแพลตฟอร์ม โดยไม่ต้องเขียนโค้ดเนทีฟใหม่

ใช่แล้ว โปรแกรมวิเคราะห์ประสิทธิภาพที่ใช้ AI สามารถวิเคราะห์บันทึกการจัดการขยะ แนะนำขนาดฮีป และระบุเมธอดที่ทำงานช้าได้ มันช่วยปรับแต่งแฟล็กของ JVM และตรวจจับจุดคอขวดได้เร็วขึ้น อย่างไรก็ตาม นักพัฒนาควรตรวจสอบความถูกต้องของการเปลี่ยนแปลงที่แนะนำทุกครั้งอยู่ดี

JVM ประมวลผลไบต์โค้ด ส่วน JRE จะรวมไลบรารีหลักที่จำเป็นสำหรับการทำงานของ JVM เข้าไว้ด้วยกัน Java JDK เพิ่มเครื่องมือพัฒนาซอฟต์แวร์ เช่น คอมไพเลอร์และดีบักเกอร์ ดังนั้นจึงใช้ในการสร้างแอปพลิเคชัน

ไบต์โค้ดนั้นไม่ขึ้นกับแพลตฟอร์ม แต่ JVM เองนั้นขึ้นกับแพลตฟอร์ม ระบบปฏิบัติการแต่ละระบบต้องการการใช้งาน JVM ของตนเอง การออกแบบนี้ทำให้ไบต์โค้ดที่คอมไพล์แล้วสามารถทำงานได้ทุกที่ที่มีการติดตั้ง JVM ที่เข้ากันได้

สรุปโพสต์นี้ด้วย: