JVM คืออะไร? แนะนำ Java Virtual Machine

Java Virtual Machine เป็นโปรแกรมที่มีจุดประสงค์เพื่อเรียกใช้งานโปรแกรมอื่น ๆ มันเป็นความคิดที่เรียบง่ายที่ยังยืนเป็นหนึ่งในตัวอย่างที่ยิ่งใหญ่ที่สุดของเราในการเข้ารหัสกังฟู JVM ทำให้สภาพที่เป็นอยู่ในเวลานั้นแย่ลงและยังคงสนับสนุนนวัตกรรมการเขียนโปรแกรมในปัจจุบัน

JVM ใช้สำหรับอะไร

JVM มีฟังก์ชันหลัก 2 อย่างคืออนุญาตให้โปรแกรม Java ทำงานบนอุปกรณ์หรือระบบปฏิบัติการใด ๆ (เรียกว่าหลักการ "เขียนครั้งเดียวรันที่ไหนก็ได้") และเพื่อจัดการและเพิ่มประสิทธิภาพหน่วยความจำของโปรแกรม เมื่อ Java เปิดตัวในปี 1995 โปรแกรมคอมพิวเตอร์ทั้งหมดถูกเขียนลงในระบบปฏิบัติการเฉพาะและหน่วยความจำโปรแกรมได้รับการจัดการโดยนักพัฒนาซอฟต์แวร์ ดังนั้น JVM จึงเป็นการเปิดเผย

JavaWorld /

การมีคำจำกัดความทางเทคนิคสำหรับ JVM นั้นมีประโยชน์และยังมีวิธีการในชีวิตประจำวันที่นักพัฒนาซอฟต์แวร์คิดเกี่ยวกับเรื่องนี้ มาทำลายสิ่งเหล่านี้:

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

เมื่อนักพัฒนาพูดถึง JVM เรามักหมายถึงกระบวนการที่ทำงานบนเครื่องโดยเฉพาะเซิร์ฟเวอร์ที่แสดงและควบคุมการใช้ทรัพยากรสำหรับแอป Java เปรียบเทียบสิ่งนี้กับข้อกำหนด JVMซึ่งอธิบายถึงข้อกำหนดสำหรับการสร้างโปรแกรมที่ทำงานเหล่านี้

ใครเป็นผู้พัฒนาและดูแล JVM?

JVM ได้รับการปรับใช้อย่างกว้างขวางใช้งานอย่างมากและดูแลโดยโปรแกรมเมอร์ที่มีความสว่างสูงทั้งในองค์กรและโอเพ่นซอร์ส โครงการ OpenJDK เป็นลูกหลานของ Sun Microsystems ที่ตัดสินใจใช้ Java โอเพนซอร์ส OpenJDK ยังคงดำเนินต่อไปผ่านการดูแล Java ของ Oracle โดยวิศวกรของ Oracle ได้รับการยกระดับอย่างหนักในทุกวันนี้

การจัดการหน่วยความจำใน JVM

ปฏิสัมพันธ์ที่พบบ่อยที่สุดกับ JVM ที่รันคือการตรวจสอบการใช้หน่วยความจำในฮีปและสแต็ก การปรับที่พบบ่อยที่สุดคือการปรับการตั้งค่าหน่วยความจำของ JVM

เก็บขยะ

ก่อน Java โปรแกรมเมอร์จัดการหน่วยความจำโปรแกรมทั้งหมด ใน Java หน่วยความจำโปรแกรมถูกจัดการโดย JVM JVM จัดการหน่วยความจำผ่านกระบวนการที่เรียกว่าการรวบรวมขยะซึ่งจะระบุและกำจัดหน่วยความจำที่ไม่ได้ใช้ในโปรแกรม Java อย่างต่อเนื่อง การรวบรวมขยะเกิดขึ้นภายใน JVM ที่ทำงานอยู่

ในยุคแรก Java ได้รับการวิพากษ์วิจารณ์อย่างมากว่าไม่ "ใกล้เคียงกับโลหะ" เท่ากับ C ++ ดังนั้นจึงไม่เร็วเท่า กระบวนการเก็บขยะเป็นที่ถกเถียงกันโดยเฉพาะ ตั้งแต่นั้นมาจึงมีการเสนออัลกอริทึมและแนวทางต่างๆสำหรับการเก็บขยะ ด้วยการพัฒนาและการเพิ่มประสิทธิภาพอย่างสม่ำเสมอการรวบรวมขยะได้รับการปรับปรุงอย่างมาก

'ใกล้เคียงกับโลหะ' หมายถึงอะไร?

เมื่อโปรแกรมเมอร์พูดว่าภาษาโปรแกรมหรือแพลตฟอร์ม "ใกล้เคียงกับโลหะ" เราหมายถึงนักพัฒนาซอฟต์แวร์สามารถจัดการหน่วยความจำของระบบปฏิบัติการโดยใช้โปรแกรม (โดยการเขียนโค้ด) ตามทฤษฎีแล้วโปรแกรมเมอร์สามารถเพิ่มประสิทธิภาพจากโปรแกรมของเราได้โดยกำหนดจำนวนที่จะใช้และเวลาที่จะทิ้ง ในกรณีส่วนใหญ่การมอบหมายการจัดการหน่วยความจำไปยังกระบวนการที่มีความละเอียดสูงเช่น JVM จะให้ประสิทธิภาพที่ดีกว่าและมีข้อผิดพลาดน้อยกว่าการทำด้วยตัวเอง

JVM แบ่งออกเป็นสามส่วน

อาจกล่าวได้ว่า JVM มีสามด้าน ได้แก่ ข้อกำหนดการใช้งานและอินสแตนซ์ ลองพิจารณาแต่ละสิ่งเหล่านี้

1. ข้อกำหนด JVM

ประการแรก JVM เป็นข้อกำหนดของซอฟต์แวร์ ในรูปแบบที่ค่อนข้างเป็นวงกลมข้อมูลจำเพาะของ JVM เน้นว่ารายละเอียดการใช้งานไม่ได้กำหนดไว้ในข้อกำหนดเพื่อให้สามารถสร้างสรรค์ได้สูงสุดในการใช้งาน

"ในการใช้งานเครื่องเสมือน Java อย่างถูกต้องคุณต้องสามารถอ่านclassรูปแบบไฟล์และดำเนินการตามที่ระบุไว้ในนั้นได้อย่างถูกต้อง"

JS Bach เคยอธิบายการสร้างเพลงไว้ในทำนองเดียวกัน:

"สิ่งที่คุณต้องทำคือแตะปุ่มที่ถูกต้องในเวลาที่เหมาะสม"

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

JVM เป็นเครื่องเสมือน

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

2. การติดตั้ง JVM

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

JVM ที่ได้รับอนุญาตเกือบทั้งหมดถูกสร้างขึ้นโดยใช้ส้อมจาก OpenJDK และ HotSpot JVM รวมถึง JDK ที่ได้รับอนุญาตของ Oracle นักพัฒนาที่สร้างทางแยกที่ได้รับอนุญาตจาก OpenJDK มักได้รับแรงบันดาลใจจากความปรารถนาที่จะเพิ่มการปรับปรุงประสิทธิภาพเฉพาะ OS โดยทั่วไปคุณดาวน์โหลดและติดตั้ง JVM เป็นส่วนที่รวมของ Java Runtime Environment (JRE)

3. อินสแตนซ์ JVM

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

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

ข้อกำหนดซอฟต์แวร์คืออะไร?

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

การโหลดและเรียกใช้ไฟล์คลาสใน JVM

เราได้พูดคุยเกี่ยวกับบทบาทของ JVM ในการเรียกใช้แอปพลิเคชัน Java แต่มันทำงานอย่างไร? ในการรันแอ็พพลิเคชัน Java JVM ขึ้นอยู่กับตัวโหลดคลาส Java และเอ็นจินการเรียกใช้งาน Java

ตัวโหลดคลาส Java ใน JVM

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

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

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

เครื่องมือดำเนินการใน JVM

เมื่อคลาสโหลดเดอร์ทำงานโหลดคลาสเสร็จแล้ว JVM จะเริ่มรันโค้ดในแต่ละคลาส เอ็นจินการดำเนินการคือส่วนประกอบ JVM ที่จัดการกับฟังก์ชันนี้ เอ็นจิ้นการดำเนินการมีความสำคัญต่อ JVM ที่ทำงานอยู่ ในความเป็นจริงสำหรับวัตถุประสงค์ในทางปฏิบัติทั้งหมดมันคืออินสแตนซ์ JVM

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

กลไกการดำเนินการจัดการทรัพยากรระบบอย่างไร

ทรัพยากรระบบสามารถแบ่งออกเป็นสองประเภทกว้าง ๆ : หน่วยความจำและอื่น ๆ

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

นอกเหนือจากหน่วยความจำแล้วเอ็นจิ้นการดำเนินการจะจัดการทรัพยากรสำหรับการเข้าถึงระบบไฟล์และ I / O เครือข่าย เนื่องจาก JVM สามารถทำงานร่วมกันได้ในระบบปฏิบัติการจึงไม่ใช่งานที่มีความหมาย นอกเหนือจากความต้องการทรัพยากรของแต่ละแอปพลิเคชันแล้วเอ็นจิ้นการดำเนินการจะต้องตอบสนองต่อสภาพแวดล้อมของระบบปฏิบัติการแต่ละระบบ นั่นคือวิธีที่ JVM สามารถจัดการกับความต้องการที่เกิดขึ้นได้

วิวัฒนาการของ JVM: อดีตปัจจุบันอนาคต

ในปี 1995 JVM ได้นำเสนอแนวคิดการปฏิวัติสองประการที่กลายเป็นค่ามาตรฐานสำหรับการพัฒนาซอฟต์แวร์สมัยใหม่ ได้แก่ "เขียนครั้งเดียวทำงานได้ทุกที่" และการจัดการหน่วยความจำอัตโนมัติ ความสามารถในการทำงานร่วมกันของซอฟต์แวร์เป็นแนวคิดที่ชัดเจนในเวลานั้น แต่นักพัฒนาเพียงไม่กี่คนในปัจจุบันจะคิดถึงเรื่องนี้สองครั้ง ในทำนองเดียวกันในขณะที่บรรพบุรุษด้านวิศวกรรมของเราต้องจัดการหน่วยความจำโปรแกรมด้วยตนเองคนรุ่นของฉันเติบโตมาพร้อมกับการเก็บขยะ

เราสามารถพูดได้ว่า James Gosling และ Brendan Eich เป็นผู้คิดค้นโปรแกรมสมัยใหม่ แต่คนอื่น ๆ อีกหลายพันคนได้กลั่นกรองและสร้างแนวคิดของพวกเขาในช่วงทศวรรษต่อ ๆ มา ในขณะที่ Java Virtual Machine มีไว้สำหรับ Java เท่านั้นในปัจจุบันได้มีการพัฒนาเพื่อรองรับภาษาสคริปต์และการเขียนโปรแกรมมากมายรวมถึง Scala, Groovy และ Kotlin มองไปข้างหน้ามันยากที่จะเห็นอนาคตที่ JVM ไม่ใช่ส่วนสำคัญของแนวการพัฒนา

ทุกอย่างเกี่ยวกับ JVM

  • ผู้ท้าชิง Java: ลักษณะการทำงานของเธรดใน JVM
  • ผู้ท้าชิง Java: เมธอดโอเวอร์โหลดใน JVM
  • การเพิ่มประสิทธิภาพภายใน JVM
  • พื้นฐาน Bytecode: JVM จัดการ bytecode อย่างไร
  • ข้อยกเว้นของ Java: JVM จัดการกับข้อยกเว้นอย่างไร
  • ขอแนะนำเครื่องเสมือน Java แบบลีนที่มีค่าเฉลี่ย

เรื่องนี้ "JVM คืออะไรแนะนำ Java Virtual Machine" เผยแพร่ครั้งแรกโดย JavaWorld