คำนำ
พื้นที่หน่วยความจำ Java ส่วนใหญ่ประกอบด้วยเคาน์เตอร์โปรแกรม, สแต็กเครื่องเสมือน Java, สแต็ควิธีการในท้องถิ่น, กองจาวา, พื้นที่วิธีการและพูลคงที่รันไทม์ บทความนี้จะแนะนำรายละเอียดเกี่ยวกับการแบ่งและข้อยกเว้นของพื้นที่หน่วยความจำ Java ฉันจะไม่พูดด้านล่างมากนักลองมาดูการแนะนำรายละเอียดด้วยกัน
พื้นที่ข้อมูลรันไทม์
เมื่อ JVM รันโปรแกรม Java มันจะแบ่งหน่วยความจำออกเป็นพื้นที่ข้อมูลที่แตกต่างกันหลายแห่ง
เคาน์เตอร์โปรแกรม
ด้ายส่วนตัว มันถือได้ว่าเป็นตัวบ่งชี้หมายเลขบรรทัดของ bytecode ที่ดำเนินการโดยเธรดปัจจุบัน การทำงานของล่าม Bytecode คือการอ่านคำสั่ง bytecode ถัดไปที่จะดำเนินการโดยการเปลี่ยนค่าการนับนี้
มัลติเธรดทำได้โดยการสลับเธรดในทางกลับกันและจัดสรรเวลาดำเนินการของโปรเซสเซอร์ ในเวลาใดเคอร์เนลสามารถดำเนินการตามคำแนะนำในเธรดเดียวเท่านั้น เพื่อที่จะกู้คืนไปยังตำแหน่งการดำเนินการที่ถูกต้องหลังจากการสลับเธรดแต่ละเธรดแต่ละตัวเลือกตัวนับโปรแกรมอิสระ นี่คือสิ่งที่ฉันพูดถึงในตอนต้นของ "เธรดส่วนตัว" หากวิธีการที่เธรดกำลังดำเนินการเป็นวิธี Java ตัวนับจะบันทึกที่อยู่คำสั่งของ Bytecode เครื่องเสมือน หากเป็นวิธีการดั้งเดิมค่าตัวนับจะว่างเปล่า ตัวนับโปรแกรมเป็นพื้นที่เดียวที่ไม่มีการระบุสถานการณ์ oom (outofMemoryError) ในข้อกำหนดของเครื่องเสมือน Java
สแต็กเครื่องเสมือน Java
เธรดเป็นส่วนตัวโดยมีวงจรชีวิตเช่นเดียวกับเธรด สแต็กเครื่องเสมือน Java อธิบายโมเดลหน่วยความจำของวิธี Java: แต่ละวิธีจะสร้างเฟรมสแต็กเมื่อดำเนินการจัดเก็บตารางตัวแปรท้องถิ่นตัวถูกดำเนินการสแต็กลิงก์ไดนามิกและข้อมูลการออกจากวิธีการ จากการโทรไปยังจุดสิ้นสุดแต่ละวิธีสอดคล้องกับการป้อนสแต็กและกระบวนการออกของเฟรมสแต็กนี้ในสแต็กเครื่องเสมือน ตารางตัวแปรท้องถิ่นบันทึกชนิดข้อมูลพื้นฐานที่หลากหลาย (int, double, char, byte ฯลฯ ), การอ้างอิงวัตถุ (ไม่ใช่วัตถุเอง) และประเภท returnaddress (ชี้ไปที่ที่อยู่ bytecode)
ข้อยกเว้นที่เป็นไปได้สองประการในพื้นที่นี้:
สแต็ควิธีการท้องถิ่น
สแต็กเครื่องเสมือนจริงข้างต้นดำเนินการบริการ Java Method สำหรับ JVM และวิธีการท้องถิ่นดำเนินการบริการดั้งเดิม คนอื่น ๆ มีความคล้ายคลึงกับสแต็คเครื่องเสมือนจริงและ Stackoverflowerror และ OutofMemoryError ก็จะถูกโยนลงไป
จาวากอง
โดยทั่วไปเรียกว่า "หน่วยความจำสแต็ก" และ "หน่วยความจำกอง" อดีตอ้างถึงสแต็กเครื่องเสมือนจริงและหลังหมายถึงกอง Java กอง Java ถูกใช้ร่วมกันโดยเธรด สร้างขึ้นเมื่อเครื่องเสมือนเริ่มต้น
บทบาทของกอง Java คือการจัดเก็บอินสแตนซ์วัตถุ กอง Java สามารถอยู่ในพื้นที่หน่วยความจำที่ไม่ต่อเนื่องทางร่างกายและต้องการเพียงอย่างต่อเนื่องอย่างมีเหตุผล
พื้นที่วิธีการ
พื้นที่ที่ใช้ร่วมกันโดยเธรด เก็บข้อมูลเช่นข้อมูลคลาสค่าคงที่ตัวแปรคงที่รหัสที่รวบรวมโดยคอมไพเลอร์ ฯลฯ ที่โหลดโดยเครื่องเสมือน เมื่อพื้นที่วิธีการไม่สามารถปฏิบัติตามข้อกำหนดการจัดสรรหน่วยความจำได้จะมีการโยน outofMemoryError
Runtime Constant Pool
พูลคงที่รันไทม์เป็นส่วนหนึ่งของพื้นที่วิธีการ C ใช้ในการเก็บค่าคงที่ตัวอักษรและการอ้างอิงเชิงสัญลักษณ์ที่สร้างขึ้นในช่วงระยะเวลาการรวบรวมและจะถูกเก็บไว้ในพูลคงที่รันไทม์ที่เข้าสู่พื้นที่วิธีการหลังการโหลดคลาส ภาษา Java ไม่ต้องการค่าคงที่ที่จะสร้างขึ้นในช่วงระยะเวลาการรวบรวมเท่านั้น กล่าวอีกนัยหนึ่งค่าคงที่ใหม่สามารถวางไว้ในช่วงระยะเวลาการวิ่ง
หน่วยความจำโดยตรง
หน่วยความจำโดยตรงไม่ได้เป็นส่วนหนึ่งของพื้นที่ข้อมูลรันไทม์ของเครื่องเสมือนจริงและไม่ใช่พื้นที่หน่วยความจำ การจัดสรรหน่วยความจำโดยตรงของเครื่องพื้นเมืองจะไม่ถูก จำกัด ด้วยขนาดของกอง Java แต่เป็นหน่วยความจำหลังจากทั้งหมด หากผลรวมของแต่ละพื้นที่หน่วยความจำมากกว่าขีด จำกัด ของหน่วยความจำทางกายภาพ outofMemoryError จะยังคงปรากฏขึ้น
กระบวนการสร้างวัตถุ
เครื่องเสมือนพบคำสั่ง "ใหม่":
เค้าโครงหน่วยความจำของวัตถุ
รูปแบบของวัตถุที่เก็บไว้ในหน่วยความจำสามารถแบ่งออกเป็น 3 พื้นที่:
ส่วนหัวของวัตถุ: เก็บข้อมูลรันไทม์ของวัตถุเช่นรหัสแฮชอายุการสร้าง GC, สถานะล็อคสถานะล็อค, ล็อคโดยเธรด, รหัสเธรดลำเอียง, ฯลฯ อีกส่วนหนึ่งคือตัวชี้ประเภทนั่นคือตัวชี้ไปยังเมตาดาต้าคลาสของวัตถุ เครื่องเสมือนใช้ตัวชี้นี้เพื่อพิจารณาว่าอินสแตนซ์ของคลาสใดที่วัตถุเป็นของ
ข้อมูลอินสแตนซ์: ข้อมูลที่ถูกต้องอย่างแท้จริงของวัตถุเนื้อหาของฟิลด์ประเภทต่างๆที่กำหนดไว้ในโปรแกรม
การจัดตำแหน่งอาหารเสริม: ไม่จำเป็นบทบาทของผู้อยู่อาศัย
ตำแหน่งการเข้าถึงวัตถุ
โปรแกรม Java ดำเนินการวัตถุอินสแตนซ์บนกองผ่านการอ้างอิงบนสแต็ก ตัวอย่างเช่น
บุคคล p = คนใหม่ ();
ที่นี่ P เป็นข้อมูลอ้างอิงและวัตถุบุคคลที่ผลิตโดยใหม่เป็นอินสแตนซ์
การอ้างอิงนี้ไม่ได้ระบุวิธีการค้นหาและเข้าถึงตำแหน่งเฉพาะของวัตถุในกอง มีวิธีการเข้าถึงหลักสองวิธี:
รับมือ. ชิ้นส่วนของหน่วยความจำจะถูกแบ่งออกเป็นจาวากองเป็นพูลที่จับซึ่งอ้างอิงที่อยู่ที่จับของวัตถุและที่จับมีข้อมูลอินสแตนซ์วัตถุและข้อมูลพิมพ์ ข้อได้เปรียบคือเมื่อวัตถุถูกย้ายคุณจะต้องเปลี่ยนที่อยู่ในที่จับและการอ้างอิงนั้นไม่จำเป็นต้องแก้ไข
ตัวชี้โดยตรง ที่อยู่วัตถุจะถูกเก็บไว้โดยตรงในการอ้างอิง ข้อได้เปรียบคือความเร็วนั้นเร็วขึ้นและเนื่องจากการอ้างอิงแสดงถึงที่อยู่ของวัตถุอินสแตนซ์โดยตรงการดำเนินการตำแหน่งตัวชี้จะถูกบันทึกไว้ นี่คือวิธีการใช้ฮอตสปอตของซัน
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com