Java Virtual Machine - พื้นที่ข้อมูลรันไทม์
ข้อมูลจำเพาะของ JVM กำหนดพื้นที่ข้อมูลรันไทม์ที่จำเป็นในระหว่างการทำงานของโปรแกรม บางส่วนถูกสร้างขึ้นในขณะที่ JVM เริ่มทำงาน อื่น ๆ เป็นแบบโลคัลสำหรับเธรดและถูกสร้างขึ้นเฉพาะเมื่อเธรดถูกสร้างขึ้น (และถูกทำลายเมื่อเธรดถูกทำลาย) เหล่านี้แสดงไว้ด้านล่าง -
ลงทะเบียน PC (Program Counter)
เป็นโลคัลสำหรับแต่ละเธรดและมีแอดเดรสของคำสั่ง JVM ที่เธรดกำลังดำเนินการอยู่
ซ้อนกัน
เป็นโลคัลสำหรับแต่ละเธรดและเก็บพารามิเตอร์ตัวแปรโลคัลและที่อยู่ที่ส่งคืนระหว่างการเรียกใช้เมธอด ข้อผิดพลาด StackOverflow อาจเกิดขึ้นได้หากเธรดต้องการพื้นที่สแต็กมากกว่าที่อนุญาต หากสแต็กสามารถขยายได้แบบไดนามิกก็ยังสามารถโยน OutOfMemoryError ได้
กอง
มีการใช้ร่วมกันระหว่างเธรดทั้งหมดและมีอ็อบเจ็กต์ข้อมูลเมตาของคลาสอาร์เรย์ ฯลฯ ที่สร้างขึ้นระหว่างรันไทม์ สร้างขึ้นเมื่อ JVM เริ่มทำงานและถูกทำลายเมื่อ JVM ปิดตัวลง คุณสามารถควบคุมจำนวนฮีปความต้องการ JVM ของคุณจากระบบปฏิบัติการโดยใช้แฟล็กบางอย่าง (เพิ่มเติมในภายหลัง) ต้องใช้ความระมัดระวังไม่ให้ใช้หน่วยความจำน้อยเกินไปหรือมากเกินไปเนื่องจากมีผลต่อประสิทธิภาพที่สำคัญ นอกจากนี้ GC ยังจัดการพื้นที่นี้และกำจัดสิ่งของที่ตายแล้วอย่างต่อเนื่องเพื่อเพิ่มพื้นที่ว่าง
พื้นที่วิธีการ
พื้นที่รันไทม์นี้เป็นเรื่องปกติสำหรับเธรดทั้งหมดและถูกสร้างขึ้นเมื่อ JVM เริ่มทำงาน มันเก็บโครงสร้างต่อคลาสเช่นพูลคงที่ (เพิ่มเติมในภายหลัง) รหัสสำหรับตัวสร้างและวิธีการข้อมูลวิธีการ ฯลฯ JLS ไม่ได้ระบุว่าพื้นที่นี้จำเป็นต้องเก็บขยะหรือไม่ดังนั้นการใช้งาน JVM อาจเลือกที่จะเพิกเฉยต่อ GC นอกจากนี้อาจขยายหรือไม่ก็ได้ตามความต้องการของแอปพลิเคชัน JLS ไม่ได้มอบอำนาจใด ๆ เกี่ยวกับเรื่องนี้
Run-Time Constant Pool
JVM รักษาโครงสร้างข้อมูลต่อคลาส / ต่อชนิดที่ทำหน้าที่เป็นตารางสัญลักษณ์ (หนึ่งในหลายบทบาท) ในขณะที่เชื่อมโยงคลาสที่โหลด
สแต็ควิธีดั้งเดิม
เมื่อเธรดเรียกใช้เมธอดแบบเนทีฟเธรดจะเข้าสู่โลกใหม่ที่โครงสร้างและข้อ จำกัด ด้านความปลอดภัยของเครื่องเสมือน Java ไม่ขัดขวางเสรีภาพอีกต่อไป เมธอดดั้งเดิมสามารถเข้าถึงพื้นที่ข้อมูลรันไทม์ของเครื่องเสมือนได้ (ขึ้นอยู่กับอินเทอร์เฟซเมธอดดั้งเดิม) แต่ยังสามารถทำอย่างอื่นที่ต้องการได้อีกด้วย
การเก็บขยะ
JVM จัดการวงจรชีวิตทั้งหมดของอ็อบเจ็กต์ใน Java เมื่อสร้างออบเจ็กต์แล้วนักพัฒนาไม่จำเป็นต้องกังวลอีกต่อไป ในกรณีที่วัตถุตาย (นั่นคือไม่มีการอ้างอิงอีกต่อไป) วัตถุจะถูกขับออกจากฮีปโดย GC โดยใช้อัลกอริทึมแบบใดแบบหนึ่งเช่น Serial GC, CMS, G1 เป็นต้น
ในระหว่างกระบวนการ GC วัตถุจะถูกย้ายในหน่วยความจำ ดังนั้นวัตถุเหล่านั้นจึงไม่สามารถใช้งานได้ในขณะที่กำลังดำเนินการอยู่ แอปพลิเคชันทั้งหมดจะต้องหยุดลงในช่วงระยะเวลาของกระบวนการ การหยุดดังกล่าวเรียกว่าการหยุดชั่วคราวแบบ "หยุดโลก" และเป็นค่าใช้จ่ายที่มาก อัลกอริทึม GC มีเป้าหมายหลักเพื่อลดเวลานี้ เราจะพูดถึงเรื่องนี้โดยละเอียดในบทต่อไปนี้
ต้องขอบคุณ GC การรั่วไหลของหน่วยความจำนั้นหายากมากใน Java แต่ก็สามารถเกิดขึ้นได้ เราจะเห็นในบทต่อ ๆ ไปว่าจะสร้างการรั่วไหลของหน่วยความจำใน Java