การจัดสรรและการเปิดตัวหน่วยความจำใน Java และ C# ได้รับการจัดการโดยอัตโนมัติโดยเครื่องเสมือนจริง ก่อนหน้านี้ฉันได้แนะนำวิธีการรีไซเคิลวัตถุ GC ใน CLR ซึ่งเป็นกลยุทธ์การรีไซเคิลหน่วยความจำที่ใช้การสร้าง ในความเป็นจริงใน Java กลยุทธ์การรีไซเคิลวัตถุ JVM นั้นขึ้นอยู่กับแนวคิดของการแบ่งรุ่น จุดประสงค์ของสิ่งนี้คือเพื่อเพิ่มขยะ
ประสิทธิภาพของการรีไซเคิลช่วยหลีกเลี่ยงความล่าช้าในการตอบสนองของโปรแกรมที่เกิดจากการตรวจสอบวัตถุทั้งหมดในฮีปเพราะเมื่อ JVM ดำเนินการ GC มันจะหยุดคำว่านั่นคือสิ้นสุดการทำงานของเธรดอื่น ๆ และเรียกคืนการดำเนินการของเธรดอื่น ๆ หลังจากรีไซเคิลเสร็จสิ้น ความคิดที่อิงจากการแบ่งรุ่นคือ: JVM ต้องการเพียงส่วนเล็ก ๆ ของหน่วยความจำทุกครั้งที่เขาดำเนินการเก็บขยะ
มีการตรวจสอบการอ้างอิงวัตถุและวัตถุจำนวนน้อยนี้มีวงจรชีวิตที่สั้นกว่าซึ่งจะเพิ่มประสิทธิภาพการทำงานของการรวบรวมขยะ ด้านล่างเราจะแนะนำกลยุทธ์พื้นฐานของอัลกอริทึมการกู้คืนหน่วยความจำในการสร้างใน Java ในอนาคต:
1. แผนกการสร้างของหน่วยความจำกอง JVM
ในกลยุทธ์การกู้คืนหน่วยความจำที่อิงกับรุ่นมักจะแบ่งออกเป็น 3 รุ่นรุ่นรุ่นใหม่รุ่นเก่า (หรือรุ่นที่ดำรงตำแหน่ง) และรุ่นถาวร ในบรรดาคนรุ่นใหม่มีสามพื้นที่เล็ก ๆ : Eden, S0 และ S1 ดังที่แสดงในรูปด้านล่าง:
ในหมู่พวกเขาวัตถุใหม่จะได้รับมอบหมายให้สร้างอายุเสมอ เมื่อพื้นที่ของคนรุ่นใหม่เต็มไปจะต้องดำเนินการคอลเลกชันขยะนั่นคือการดำเนินการเล็กน้อย GC จะถูกดำเนินการเพื่อรีไซเคิลวัตถุที่ไม่ได้อ้างอิงอีกต่อไปและในเวลาเดียวกันจะเพิ่มอายุของวัตถุที่รอดชีวิต วัตถุที่รอดชีวิตในการสร้างอายุมีสนามระบุอายุ เมื่อพวกเขาไปถึงเกณฑ์ที่แน่นอนวัตถุที่ยังมีชีวิตรอดจะได้รับการเลื่อนตำแหน่งให้เป็นพื้นที่รุ่นเก่า
พื้นที่ของคนรุ่นเก่าใช้ในการจัดเก็บวัตถุที่รอดชีวิตมาได้เป็นเวลานานนั่นคือวัตถุที่มีวงจรชีวิตที่ยาวนาน เมื่อวัตถุที่รอดชีวิตในพื้นที่รุ่นเยาว์ถึงเกณฑ์อายุที่กำหนดมันจะได้รับการส่งเสริมโดยอัตโนมัติให้กับคนรุ่นเก่า เมื่อพื้นที่ของคนรุ่นเก่าเต็มไปด้วยวัตถุ Major GC จะถูกดำเนินการหนึ่งครั้ง เมื่อเทียบกับ GC เล็กน้อยจำนวนการดำเนินการของ Major GC นั้นน้อยกว่า GC เล็กน้อย ในเวลาเดียวกัน Major GC ดำเนินการนานกว่า GC เล็กน้อย เพราะมันเกี่ยวข้องกับการสแกนวัตถุมากขึ้น ความคิดทั่วไปนี้ยังขึ้นอยู่กับทางเลือกที่ดีกว่าในทางปฏิบัติว่าในทางปฏิบัติวัตถุที่จัดสรรใหม่มีวัฏจักรชีวิตที่สั้นกว่าและวัตถุผู้สูงอายุมีวงจรชีวิตที่ยาวนานขึ้น
ในเวลาเดียวกันเมื่อ Minor GC และ Major GC ดำเนินการรวบรวมขยะพวกเขาหยุดเหตุการณ์โลกนั่นคือยุติเธรดที่กำลังทำงานและกู้คืนเธรดทั้งหมดเมื่อดำเนินการ GC
สำหรับหน่วยความจำรุ่นถาวรส่วนใหญ่จะใช้ในการจัดเก็บข้อมูลที่เกี่ยวข้องของข้อมูลเมตาข้อมูลของคลาสและวิธีการ เมื่อคลาสไม่ได้ใช้งานอีกต่อไปมันจะถูกรีไซเคิล เมื่อดำเนินการ GC เต็มรูปแบบหน่วยความจำรุ่นถาวรจะถูกสแกนสำหรับการรวบรวมขยะ
2. กระบวนการประมวลผลของการรวบรวมขยะตามรุ่น
ครั้งแรกในตอนต้นวัตถุใหม่จะถูกกำหนดให้กับพื้นที่ Eden, S0 และ S1 ว่างเปล่า เมื่อช่องว่างในอีเด็นเต็มไปด้วย GC เล็กน้อย ตัวเก็บขยะจะย้ายวัตถุอ้างอิงไปยังพื้นที่ S0 และวัตถุที่ไม่ได้อ้างอิงจะถูกลบอีกต่อไป ในเวลาเดียวกันอายุของวัตถุที่รอดชีวิตคือ 1 หลังจากระบุ GC พื้นที่ Eden และ S1 จะว่างเปล่าดังแสดงในรูปด้านล่าง
ครั้งต่อไปที่ GC Minor GC ถูกดำเนินการเช่นเดียวกับขั้นตอนการดำเนินการก่อนหน้านี้ความแตกต่างเพียงอย่างเดียวคือวัตถุอ้างอิงนั่นคือวัตถุที่รอดชีวิตจะถูกย้ายไปยังพื้นที่ S1 และอายุของวัตถุที่รอดชีวิตในพื้นที่ S0 จะเพิ่มขึ้น 1 และกลายเป็น 2 ดังแสดงในรูปด้านล่าง
เมื่อมีการดำเนินการเล็กน้อย GC อีกครั้งวัตถุที่รอดชีวิตจะถูกย้ายไปยังพื้นที่ S0 และเพิ่ม 1 ถึงอายุของวัตถุที่รอดชีวิตดังแสดงในรูปด้านล่าง
เมื่อ GC ผู้เยาว์ถูกดำเนินการในที่สุดก็พบว่าวัตถุที่รอดชีวิตใน S1 ถึง 8 (สมมติว่าเกณฑ์ถูกตั้งค่าเป็น 8) และวัตถุจะได้รับการส่งเสริมให้เป็นหน่วยความจำวัยชราดังแสดงในรูปด้านล่าง
Z
เมื่อพื้นที่กองเก่าเต็มไปด้วยวัตถุ Major GC จะถูกดำเนินการหนึ่งครั้งซึ่งจะล้างวัตถุว่ากองเก่าไม่ได้อ้างอิงอีกต่อไปและในเวลาเดียวกันบีบอัดพื้นที่ ดังที่แสดงในรูปด้านล่าง
การสนทนาสั้น ๆ ข้างต้นเกี่ยวกับกลยุทธ์การรีไซเคิลขยะใน JVM เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น