1. ภาพรวม
Java Virtual Machine จะแบ่งหน่วยความจำที่จัดการออกเป็นพื้นที่ข้อมูลที่แตกต่างกันหลายแห่งในกระบวนการดำเนินการโปรแกรม Java หน่วยความจำที่จัดการโดยเครื่องเสมือน Java จะรวมพื้นที่ข้อมูลรันไทม์ต่อไปนี้ดังแสดงในรูปด้านล่าง:
มีการอธิบายต่อไปนี้ในทุกพื้นที่
ประการที่สองพื้นที่ข้อมูล <br /> ตัวนับโปรแกรม <br /> ตัวนับโปรแกรมสามารถถือได้ว่าเป็นตัวบ่งชี้หมายเลขบรรทัดของรหัสไบต์ที่ดำเนินการโดยเธรดปัจจุบัน ในรูปแบบแนวคิดของเครื่องเสมือนจริงการทำงานของรหัสล่ามคือการเลือกคำแนะนำรหัสไบต์ที่ต้องดำเนินการโดยการเปลี่ยนค่าของตัวนับโปรแกรม การกู้คืนเธรดและฟังก์ชั่นพื้นฐานอื่น ๆ จะต้องต้องพึ่งพาเคาน์เตอร์นี้เพื่อให้เสร็จสมบูรณ์
ในหลายเธรดเพื่อให้เธรดกลับไปที่ตำแหน่งการดำเนินการที่ถูกต้องแต่ละเธรดจะต้องมีโปรแกรมเมตรอิสระ
เมื่อเธรดถูกดำเนินการเป็นวิธี Java ตัวนับนี้จะบันทึกที่อยู่ของคำสั่งรหัสไบต์เสมือนจริงที่กำลังดำเนินการ
พื้นที่หน่วยความจำนี้เป็นพื้นที่เดียวที่ไม่ได้ระบุ outofMemoryError ใด ๆ
สแต็กเครื่องเสมือน Java
สแต็กเครื่องเสมือน Java ยังเป็นส่วนตัวและวงจรชีวิตของมันก็เหมือนกับเธรด สแต็กเครื่องเสมือนอธิบายโมเดลหน่วยความจำที่ดำเนินการโดยวิธี Java: แต่ละวิธีจะสร้างเฟรมสแต็กเพื่อจัดเก็บตารางตัวแปรท้องถิ่นทำงานสแต็กรายการที่เชื่อมโยงแบบไดนามิกข้อมูลการส่งออกวิธีการ ฯลฯ จากกระบวนการโทรจนกว่าจะมีการเรียกกระบวนการเสร็จสิ้นมันจะสอดคล้องกับกระบวนการป้อนสแต็กในสแต็กเครื่องเสมือนไปยังสแต็ก
ในตารางตัวแปรท้องถิ่นชนิดข้อมูลพื้นฐานที่หลากหลาย (บูลีน, ไบต์, ถ่าน, สั้น, ลอย, ยาว, สอง), การอ้างอิงวัตถุและประเภท returnaddress ถูกเก็บไว้ในคอมไพเลอร์
หากคุณไม่สามารถสมัครหน่วยความจำที่เพียงพอในระหว่างการขยายได้ข้อยกเว้น outofMemoryError จะถูกโยนทิ้ง
สแต็กวิธีการในท้องถิ่น <br /> สแต็กในท้องถิ่นนั้นคล้ายคลึงกับเครื่องเสมือนจริง . เครื่องเสมือนบางเครื่องรวมสแต็กวิธีการในท้องถิ่นโดยตรงและสแต็กเครื่องเสมือนเป็นหนึ่งเดียว
จะโยน stackoverflowerror และความผิดปกติของ outofmemoryeRror
กองชวา
Java Pile เป็นพื้นที่หน่วยความจำที่ใช้ร่วมกันโดยเธรดทั้งหมด
กอง Java เป็นพื้นที่หลักของการจัดการนักสะสมขยะ เนื่องจากนักสะสมถูกใช้โดยทั่วไปสำหรับการแบ่งอัลกอริทึมการรีไซเคิลกอง Java จึงสามารถแบ่งย่อยได้ว่า: รุ่นใหม่และยุคเก่า จากมุมมองของการแจกแจงหน่วยความจำเธรด -กอง Java ที่แชร์อาจแบ่งหลายเธรดบัฟเฟอร์แบบกระจายแบบเอกชน (TLAB)
กอง Java สามารถอยู่ในพื้นที่หน่วยความจำที่ไม่ต่อเนื่องทางกายภาพตราบใดที่มันยังคงดำเนินต่อไปอย่างต่อเนื่อง ในแง่ของการใช้งานไม่เพียง แต่สามารถบรรลุขนาดหรือส่วนขยายที่แน่นอน
หากไม่มีการจัดสรรอินสแตนซ์ของหน่วยความจำในกองและกองไม่สามารถเสร็จสิ้นได้ OutofMemoryError จะถูกโยนออกไป
พื้นที่วิธีการ
พื้นที่วิธีการเป็นพื้นที่หน่วยความจำที่ใช้ร่วมกันโดยเธรดต่างๆ
พฤติกรรมการรวบรวมขยะค่อนข้างไม่ค่อยปรากฏในพื้นที่นี้ แต่มันไม่ได้มีอยู่อย่างถาวรในพื้นที่วิธีการของข้อมูลที่เข้ามา
เมื่อพื้นที่วิธีการไม่สามารถตอบสนองความต้องการของการแจกแจงหน่วยความจำ outofMemoryError จะถูกโยนออกไป
ใช้สระว่ายน้ำคงที่:
มันเป็นส่วนหนึ่งของพื้นที่วิธีการซึ่งใช้ในการจัดเก็บประเภทต่าง ๆ และการอ้างอิงสัญลักษณ์ที่เกิดจากระยะเวลาการรวบรวม
หน่วยความจำโดยตรง
หน่วยความจำโดยตรงไม่ได้เป็นส่วนหนึ่งของพื้นที่ข้อมูลเมื่อเครื่องเสมือนกำลังทำงานอยู่
การจัดสรรหน่วยความจำโดยตรงจะไม่ถูก จำกัด ด้วยขนาดของกอง Java แต่มันจะถูก จำกัด ด้วยขนาดของหน่วยความจำและทั้งหมดอาจส่งข้อยกเว้น OutofMemoryRerror
ประการที่สามการสร้างเค้าโครงและกระบวนการเข้าถึงวัตถุ
การสร้างวัตถุ
การสร้างวัตถุมักจะต้องใช้คำหลักใหม่ หากกระบวนการโหลดคลาสที่สอดคล้องกันถูกดำเนินการ
หลังจากโหลดชั้นเรียนแล้วเครื่องเสมือนจะจัดสรรหน่วยความจำสำหรับนักเรียนใหม่ ภารกิจในการจัดสรรพื้นที่สำหรับวัตถุนั้นเทียบเท่ากับการแบ่งหน่วยความจำที่กำหนดโดยขนาดจากกอง Java มีสองวิธีในการจัดสรร: หนึ่งเรียกว่าการชนของตัวชี้ อีกชื่อหนึ่งคือรายการที่ว่างเปล่า: หากหน่วยความจำในกอง Java ไม่ปกติเครื่องเสมือนจะต้องรักษารายการหนึ่งรายการซึ่งจะบันทึกบล็อกหน่วยความจำที่มีอยู่ อินสแตนซ์วัตถุ วิธีการแจกจ่ายใดที่ถูกกำหนดโดยการควบคุมกอง Java และไม่ว่าจะเป็นกอง Java หรือไม่นั้นจะถูกกำหนดโดยว่าตัวเก็บขยะนั้นใช้กับการบีบอัดและฟังก์ชั่นขององค์กรหรือไม่ ปัญหาอื่นที่ต้องพิจารณาคือปัญหาความปลอดภัยของเธรดเมื่อวัตถุสร้างขึ้น ของหน่วยความจำ (tlab) ในกอง Java
หลังจากการแจกแจงหน่วยความจำเสร็จสมบูรณ์เครื่องเสมือนจำเป็นต้องเริ่มต้นพื้นที่หน่วยความจำแบบกระจายเป็นค่าศูนย์ ขั้นตอนนี้ทำให้มั่นใจได้ว่าฟิลด์อินสแตนซ์ของวัตถุสามารถใช้โดยตรงในรหัส Java โดยไม่มีค่าเริ่มต้น
ถัดไปเครื่องเสมือนจำเป็นต้องตั้งค่าการตั้งค่าที่จำเป็นเช่นคลาสของวัตถุนี้เป็นอินสแตนซ์ของคลาสวิธีการค้นหาข้อมูลข้อมูลเมตาของคลาส ฯลฯ ข้อมูลนี้จะถูกเก็บไว้ในหัววัตถุของวัตถุ
หลังจากงานด้านบนเสร็จสิ้นวัตถุใหม่ได้ถูกสร้างขึ้นจากมุมมองของเครื่องเสมือน อย่างไรก็ตามจากมุมมองของโปรแกรม Java วิธีการเริ่มต้นยังจำเป็นต้องเริ่มต้นวัตถุตามความต้องการของโปรแกรมเมอร์
เค้าโครงหน่วยความจำของวัตถุ
ในเครื่องเสมือนฮอตสปอตเค้าโครงของวัตถุในหน่วยความจำสามารถแบ่งออกเป็นสามส่วน: หัววัตถุข้อมูลอินสแตนซ์และการจัดตำแหน่ง
หัววัตถุมีสองส่วน: ส่วนแรกใช้ในการจัดเก็บข้อมูลของวัตถุเองเช่นรหัสแฮชอายุ GC อายุและล็อคที่จัดขึ้นโดยเธรด เจ้าหน้าที่เรียกว่า "Mark Word" ส่วนที่สองคือตัวชี้ประเภทนั่นคือตัวชี้ของวัตถุไปยังข้อมูลเมตาคลาสและเครื่องเสมือนจะกำหนดคลาสของวัตถุนี้โดยตัวชี้นี้
ข้อมูลอินสแตนซ์เป็นข้อมูลที่มีประสิทธิภาพที่เก็บไว้ในวัตถุและยังเป็นเนื้อหาฟิลด์ที่หลากหลายที่กำหนดไว้ในรหัสโปรแกรม
การจัดแนวไม่จำเป็นต้องมีอยู่เพียงแค่มีบทบาทของตัวละครอาชีพ ฮอตพ็อต VM ต้องการให้ที่อยู่เริ่มต้นของวัตถุต้องเป็นจำนวนเต็มจำนวนเต็ม 8 ไบต์ การจัดตำแหน่ง
ตำแหน่งการเข้าถึงวัตถุ
โปรแกรม Java ดำเนินการวัตถุเฉพาะบนสแต็กผ่านข้อมูลอ้างอิงบนสแต็ก วิธีการเข้าถึงหลักคือสองประเภท: ด้ามจับและตัวชี้โดยตรง:
พนักงาน: กอง Java จะวาดชิ้นส่วนของหน่วยความจำเป็นพูลที่จับ ดังแสดงในรูป:
ตัวชี้โดยตรง: เค้าโครงของวัตถุกอง Java ควรพิจารณาวิธีการวางข้อมูลที่เกี่ยวข้องของข้อมูลประเภทของประเภทการเข้าถึงและที่อยู่วัตถุจะถูกเก็บไว้ในการอ้างอิง ดังแสดงในรูป:
สองวิธีมีข้อดีของตัวเอง ค่าใช้จ่ายเวลาสำหรับการวางตำแหน่งตัวชี้
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้