JRE คืออะไร? บทนำสู่ Java Runtime Environment

Java Development Kit (JDK), Java Virtual Machine (JVM) และ Java Runtime Environment (JRE) ร่วมกันสร้างองค์ประกอบสามส่วนที่มีประสิทธิภาพของแพลตฟอร์ม Java สำหรับการพัฒนาและรันแอปพลิเคชัน Java ฉันเคยแนะนำ JDK และ JVM ไปแล้ว ในบทช่วยสอนฉบับย่อนี้คุณจะได้เรียนรู้เกี่ยวกับ JRE ซึ่งเป็นสภาพแวดล้อมรันไทม์สำหรับ Java

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

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

เราจะเจาะลึกลงไปมากว่าส่วนประกอบเหล่านี้ทำงานร่วมกันอย่างไรในหัวข้อต่อไปนี้

การติดตั้ง JDK, JRE และ JVM

จากมุมมองการติดตั้งทุกครั้งที่คุณดาวน์โหลด JDK จะมี JRE ที่เข้ากันได้กับเวอร์ชันและ JRE นั้นจะรวม JVM เริ่มต้น คุณยังสามารถดาวน์โหลด JRE แยกต่างหากจาก JDK และคุณสามารถเลือก JVM ได้หลายแบบ ค่าเริ่มต้นทำงานได้ดีสำหรับการใช้งานส่วนใหญ่โดยเฉพาะอย่างยิ่งเมื่อคุณเริ่มต้นด้วย Java

สภาพแวดล้อมรันไทม์คืออะไร?

โปรแกรมซอฟต์แวร์จำเป็นต้องดำเนินการและต้องมีสภาพแวดล้อมในการรันสภาพแวดล้อมรันไทม์โหลดไฟล์คลาสและทำให้แน่ใจว่ามีการเข้าถึงหน่วยความจำและทรัพยากรระบบอื่น ๆ ในอดีตซอฟต์แวร์ส่วนใหญ่ใช้ระบบปฏิบัติการ (OS) เป็นสภาพแวดล้อมรันไทม์ โปรแกรมทำงานภายในคอมพิวเตอร์ทุกเครื่อง แต่อาศัยการตั้งค่าระบบปฏิบัติการสำหรับการเข้าถึงทรัพยากร ทรัพยากรในกรณีนี้จะเป็นเช่นหน่วยความจำไฟล์โปรแกรมและการอ้างอิง Java Runtime Environment เปลี่ยนแปลงทั้งหมดอย่างน้อยสำหรับโปรแกรม Java

WORA สำหรับ Java

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

Java Runtime Environment

เราสามารถมองซอฟต์แวร์เป็นชุดของเลเยอร์ที่อยู่ด้านบนของฮาร์ดแวร์ระบบ แต่ละเลเยอร์มีบริการที่จะใช้ (และจำเป็น) โดยเลเยอร์ที่อยู่ด้านบน Java Runtime Environment เป็นเลเยอร์ซอฟต์แวร์ที่ทำงานบนระบบปฏิบัติการของคอมพิวเตอร์โดยให้บริการเพิ่มเติมเฉพาะสำหรับ Java

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

ในระยะสั้น JRE เป็นประเภทของ meta-OS สำหรับโปรแกรม Java เป็นตัวอย่างแบบคลาสสิกของAbstractionโดยนำระบบปฏิบัติการพื้นฐานมาเป็นแพลตฟอร์มที่สอดคล้องกันสำหรับการเรียกใช้แอปพลิเคชัน Java

JRE ทำงานร่วมกับ JVM อย่างไร

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

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

ในมุมมองเลเยอร์ที่ฉันเพิ่งอธิบาย JVM ถูกสร้างขึ้นโดย JRE จากมุมมองของแพ็คเกจ JRE มี JVM ดังรูปที่ 1 แสดง

Matthew Tyson

การติดตั้งและใช้ JRE

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

ในกรณีส่วนใหญ่คอมพิวเตอร์ของคุณจะติดตั้ง Java และ JRE จะรวมอยู่ด้วย หากคุณจำเป็นต้องติดตั้งหรืออัปเกรดด้วยตนเองคุณสามารถดาวน์โหลด JRE เวอร์ชันปัจจุบันได้จาก Oracle

เวอร์ชัน JRE

Java Runtime Environment ได้รับการอัปเดตสำหรับ Java เวอร์ชันใหม่แต่ละเวอร์ชันและหมายเลขเวอร์ชันสอดคล้องกับระบบการกำหนดเวอร์ชันแพลตฟอร์ม Java ตัวอย่างเช่น JRE 1.8 รัน Java 8 ในขณะที่คุณมีแพ็คเกจ JDK ให้เลือกมากมาย (เช่น Enterprise Edition หรือ Standard Edition) ซึ่งไม่ใช่กรณีของ JRE คอมพิวเตอร์ส่วนใหญ่ใช้ JRE ที่พัฒนาขึ้นสำหรับ Java SE ซึ่งสามารถเรียกใช้แอปพลิเคชัน Java ใดก็ได้ไม่ว่าจะพัฒนาอย่างไร อุปกรณ์พกพาส่วนใหญ่มาพร้อมกับ JRE สำหรับ Java ME ซึ่งติดตั้งไว้ล่วงหน้าในอุปกรณ์พกพาและไม่สามารถดาวน์โหลดได้

เมื่อติดตั้ง JRE แล้วคุณสามารถโต้ตอบกับมันบนบรรทัดคำสั่งได้โดยการป้อน  java -versionซึ่งจะบอกคุณว่าติดตั้งเวอร์ชันใด ในระบบ POSIX คุณสามารถตรวจสอบตำแหน่งที่ติดตั้งด้วยwhich java.

JRE ใน devops

JRE ไม่ได้สังเกตเห็นได้ชัดเจนในขั้นตอนการพัฒนาซึ่งส่วนใหญ่จะเรียกใช้โปรแกรมของคุณใน OS หรือ IDE ที่คุณเลือก JRE มีบทบาทที่โดดเด่นกว่าเล็กน้อยในการพัฒนาและการดูแลระบบเนื่องจากใช้สำหรับการตรวจสอบและกำหนดค่า

โดยทั่วไป JRE จะจัดเตรียม "ลูกบิด" ที่คุณจะใช้เพื่อกำหนดค่าและควบคุมคุณลักษณะของแอปพลิเคชัน Java การใช้หน่วยความจำเป็นตัวอย่างที่สำคัญซึ่งเป็นส่วนสำคัญของการดูแลระบบ แม้ว่าการใช้หน่วยความจำจะมีความสำคัญเสมอ แต่ก็มีความสำคัญในการกำหนดค่าระบบคลาวด์และ devops เป็นเทคโนโลยีบนคลาวด์ หากคุณกำลังทำงานในสภาพแวดล้อม devops หรือสนใจที่จะแตกแขนงออกไปเป็น devops คุณควรทำความเข้าใจว่าหน่วยความจำ Java ทำงานอย่างไรและตรวจสอบอย่างไรใน JRE

Devops หรือ sysadmin?

Devopsเป็นคำศัพท์ใหม่ แต่อธิบายถึงสิ่งที่เป็นจริงมานานหลายทศวรรษซึ่งเป็นความสามารถในการทำงานร่วมกันระหว่างการพัฒนาและการดำเนินงาน ในแง่นี้devopsเป็นเพียงคำศัพท์ใหม่สำหรับสิ่งที่เคยเรียกว่าการดำเนินการหรือการดูแลระบบ เช่นเดียวกับ sysadmin สิ่งสำคัญของ devops คือการจัดการระบบที่จำเป็นในการรันซอฟต์แวร์ การจัดการ JRE เป็นส่วนหนึ่งของการจัดการระบบที่รันแอ็พพลิเคชัน Java

หน่วยความจำ Java และ JRE

หน่วยความจำ Java ประกอบด้วยสามองค์ประกอบ: ฮีปสแต็กและ metaspace (ซึ่งก่อนหน้านี้เรียกว่า permgen)

  • Metaspaceเป็นที่ที่ Java จะเก็บข้อมูลที่ไม่เปลี่ยนแปลงของโปรแกรมของคุณเช่นนิยามคลาส
  • Heap spaceเป็นที่ที่ Java เก็บเนื้อหาตัวแปร
  • สแต็คสเปซเป็นที่ที่ Java เก็บการเรียกใช้ฟังก์ชันและการอ้างอิงตัวแปร

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

จนถึง Java 8 metaspace เรียกว่า permgen นอกจากจะเป็นชื่อที่เท่กว่ามากแล้ว metaspace ยังเป็นการเปลี่ยนแปลงที่สำคัญในการที่นักพัฒนาโต้ตอบกับพื้นที่หน่วยความจำของ Java ก่อนหน้านี้คุณจะใช้คำสั่งjava -XX:MaxPermSizeเพื่อตรวจสอบขนาดของพื้นที่ Permgen จาก Java 8 ไปข้างหน้า Java จะเพิ่มขนาดของ metaspace โดยอัตโนมัติเพื่อรองรับความต้องการเมตาของโปรแกรมของคุณ Java 8 ยังเปิดตัวแฟMaxMetaspaceSizeล็กใหม่ซึ่งสามารถใช้เพื่อ จำกัด ขนาด metaspace

ตัวเลือกหน่วยความจำอื่น ๆ ฮีปและสแต็กยังคงเหมือนเดิมใน Java 8

การกำหนดค่าพื้นที่ฮีป

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

การกำหนดค่าพื้นที่สแต็ก

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

คุณใช้-Xssสวิตช์เพื่อกำหนดค่าขนาดเริ่มต้นของสแต็ก จากนั้นสแต็กจะเติบโตแบบไดนามิกตามความต้องการของโปรแกรม

การตรวจสอบแอปพลิเคชัน Java

แม้ว่าการตรวจสอบแอปพลิเคชันจะเป็นฟังก์ชันของ JVM แต่ JRE ก็มีตัวเลือกการกำหนดค่าซึ่งเป็นพื้นฐานที่จำเป็นสำหรับการมอนิเตอร์ มีเครื่องมือมากมายสำหรับการมอนิเตอร์แอ็พพลิเคชัน Java ตั้งแต่คลาสสิก (เช่นคำสั่ง Unix top) ไปจนถึงโซลูชันการมอนิเตอร์ระยะไกลที่ซับซ้อนเช่นการมอนิเตอร์โครงสร้างพื้นฐานของ Oracle

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

สรุป

Java Runtime Environment เป็นโปรแกรมบนดิสก์ที่โหลดแอปพลิเคชัน Java เพื่อให้ JVM ดำเนินการ JRE ถูกรวมไว้โดยค่าเริ่มต้นเมื่อคุณดาวน์โหลด Java Development Kit และ JRE แต่ละตัวจะมีไลบรารีคลาส Java หลักตัวโหลดคลาส Java และ Java Virtual Machine การทำความเข้าใจว่า JVM, JDK และ JRE โต้ตอบกันอย่างไรโดยเฉพาะอย่างยิ่งสำหรับการทำงานในสภาพแวดล้อมคลาวด์และ Devops ในสภาพแวดล้อมเหล่านี้ JRE มีบทบาทในการตรวจสอบและกำหนดค่าที่แข็งแกร่งกว่าในการพัฒนาแอปพลิเคชัน Java แบบเดิม

เรื่องนี้ "JRE คืออะไรบทนำสู่ Java Runtime Environment" เผยแพร่ครั้งแรกโดย JavaWorld