มีอัลกอริทึมการรวบรวมขยะทั่วไปสี่ประการใน JVM:
อัลกอริทึมการล้างเครื่องหมาย (มาร์ค-กวาด);
การคัดลอกอัลกอริทึม (การคัดลอก);
มาร์ค-กะทัดรัด;
คอลเลกชัน Generational;
มาแนะนำกันทีละคน:
1. อัลกอริทึมการล้างเครื่องหมาย (มาร์ค-กวาด)
นี่คืออัลกอริทึมการรวบรวมขยะขั้นพื้นฐานที่สุด อัลกอริทึมแบ่งออกเป็นสองขั้นตอน: "การทำเครื่องหมาย" และ "การล้าง": ก่อนอื่นวัตถุทั้งหมดที่ต้องรีไซเคิลจะถูกทำเครื่องหมายและวัตถุที่ทำเครื่องหมายทั้งหมดจะถูกรีไซเคิลอย่างสม่ำเสมอหลังจากการทำเครื่องหมายเสร็จสมบูรณ์ ข้อเสียหลักของมันคือสอง: หนึ่งคือปัญหาประสิทธิภาพและประสิทธิภาพของการทำเครื่องหมายและการทำความสะอาดไม่สูง อีกอย่างคือปัญหาด้านพื้นที่หลังจากล้างการทำเครื่องหมายจะมีการสร้างชิ้นส่วนหน่วยความจำที่ไม่ต่อเนื่องจำนวนมาก ชิ้นส่วนพื้นที่มีจำนวนมากเกินไปอาจทำให้พื้นที่ต่อเนื่องขนาดใหญ่ไม่เพียงพอเมื่อจัดสรรวัตถุขนาดใหญ่และการดำเนินการรวบรวมขยะอื่นจะต้องถูกกระตุ้นล่วงหน้า
ไดอะแกรมอัลกอริทึมของ Mark-Clear
2. อัลกอริทึมการคัดลอก (การคัดลอก)
เพื่อแก้ปัญหาประสิทธิภาพด้วยอัลกอริทึม "คัดลอก" มันจะแบ่งหน่วยความจำที่มีอยู่ออกเป็นสองบล็อกที่มีขนาดเท่ากัน ใช้ครั้งละหนึ่งชิ้นเท่านั้น เมื่อมีการใช้พื้นที่หนึ่งชิ้นให้คัดลอกวัตถุที่ยังคงแยกจากกันไปยังอีกชิ้นหนึ่งจากนั้นทำความสะอาดพื้นที่หน่วยความจำที่ใช้ใหม่ในครั้งเดียว สิ่งนี้ทำให้สามารถรีไซเคิลชิ้นใดชิ้นหนึ่งได้ทุกครั้งเพื่อให้การกระจายตัวของหน่วยความจำและสถานการณ์ที่ซับซ้อนอื่น ๆ ไม่จำเป็นต้องพิจารณาเมื่อจัดสรรหน่วยความจำ การใช้งานอย่างง่ายและการดำเนินงานที่มีประสิทธิภาพ แต่ค่าใช้จ่ายของอัลกอริทึมนี้คือการลดหน่วยความจำให้เหลือครึ่งหนึ่งของต้นฉบับซึ่งแพงเกินไปเล็กน้อย ในความเป็นจริง 98% ของวัตถุในรุ่นใหม่มีชีวิตและตายดังนั้นจึงไม่จำเป็นต้องแบ่งหน่วยความจำในอัตราส่วน 1: 1 แต่แบ่งหน่วยความจำออกเป็นพื้นที่อีเด็นที่ใหญ่ขึ้น เมื่อรีไซเคิลให้คัดลอกวัตถุที่ยังคงสกัดได้ในอีเด็นและผู้รอดชีวิตไปยัง Suivivor อีกครั้งในครั้งเดียวและในที่สุดก็ทำความสะอาดพื้นที่ของ Eden และผู้รอดชีวิตที่เพิ่งใช้ใหม่
สำเนาอัลกอริทึมไดอะแกรม
3. มาร์ค-กะทัดรัด
เมื่ออัตราการรอดชีวิตของวัตถุสูงอัลกอริทึมการจำลองและการรวบรวมจะต้องดำเนินการจำลองแบบมากขึ้นและประสิทธิภาพจะลดลง ที่สำคัญหากคุณไม่ต้องการเสียพื้นที่ 50% คุณต้องมีพื้นที่เพิ่มเติมเพื่อจัดสรรการรับประกันที่จะจัดการกับสถานการณ์ที่รุนแรงซึ่งวัตถุทั้งหมดในหน่วยความจำครึ่งโซนมีชีวิตอยู่ 100% ดังนั้นอัลกอริทึมนี้ไม่สามารถใช้โดยตรงในผู้สูงอายุ
ดังนั้นผู้คนจึงเสนออัลกอริทึม "เครื่องหมายขนาดกะทัดรัด" อีกครั้ง เนื่องจากวัตถุในผู้สูงอายุมีวัฏจักรการเอาชีวิตรอดที่ยาวนานบางคนจึงเสนออัลกอริทึม "Mark-compact" กระบวนการทำเครื่องหมายนั้นเหมือนกับ "การทำความสะอาดเครื่องหมาย" แต่ในขณะที่ล้างวัตถุที่ตายแล้ววัตถุที่รอดชีวิตจะถูกจัดเรียงซึ่งสามารถลดพื้นที่ที่แยกส่วนได้
ไดอะแกรมอัลกอริทึมการทำเครื่องหมาย
4. คอลเลกชัน Generational
ปัจจุบันการรวบรวมขยะสำหรับเครื่องเสมือนเชิงพาณิชย์ใช้อัลกอริทึม "Generational Collection" ไม่มีความคิดใหม่ในอัลกอริทึมนี้ แต่หน่วยความจำแบ่งออกเป็นหลายชิ้นตามวัฏจักรการเอาชีวิตรอดที่แตกต่างกันของวัตถุ โดยทั่วไปแล้วกอง Java จะถูกแบ่งออกเป็นรุ่นใหม่และรุ่นเก่าเพื่อให้สามารถใช้อัลกอริทึมการรวบรวมที่เหมาะสมที่สุดตามลักษณะของแต่ละรุ่น ในรุ่นใหม่ทุกครั้งที่มีการรวบรวมคอลเล็กชั่นขยะจะพบวัตถุจำนวนมากเสียชีวิตและมีเพียงจำนวนน้อยที่อยู่รอดได้ จากนั้นใช้อัลกอริทึมการคัดลอกและคอลเลกชันสามารถทำให้เสร็จสมบูรณ์ด้วยต้นทุนการคัดลอกจำนวนเล็กน้อย ในผู้สูงอายุเนื่องจากอัตราการรอดชีวิตของวัตถุสูงและวัฏจักรมีความยาวอัลกอริทึม "mark-tidy" หรือ "mark-clear" ใช้เพื่อรีไซเคิล
การแนะนำข้างต้นเกี่ยวกับอัลกอริทึมการรวบรวมขยะทั่วไปใน JVM เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น