.NET Core - การเก็บขยะ
ในบทนี้เราจะพูดถึงแนวคิดของการรวบรวมขยะซึ่งเป็นหนึ่งในคุณสมบัติที่สำคัญที่สุดของแพลตฟอร์มรหัสที่มีการจัดการ. NET ตัวรวบรวมขยะ (GC) จัดการการจัดสรรและการปล่อยหน่วยความจำ ตัวเก็บขยะทำหน้าที่เป็นตัวจัดการหน่วยความจำอัตโนมัติ
คุณไม่จำเป็นต้องรู้วิธีจัดสรรและปล่อยหน่วยความจำหรือจัดการอายุการใช้งานของวัตถุที่ใช้หน่วยความจำนั้น
การจัดสรรจะเกิดขึ้นทุกครั้งที่คุณประกาศออบเจ็กต์ด้วยคีย์เวิร์ด“ ใหม่” หรือประเภทค่าอยู่ในกล่อง โดยทั่วไปการจัดสรรจะเร็วมาก
เมื่อมีหน่วยความจำไม่เพียงพอที่จะจัดสรรออบเจ็กต์ GC จะต้องรวบรวมและกำจัดหน่วยความจำขยะเพื่อให้หน่วยความจำพร้อมใช้งานสำหรับการจัดสรรใหม่
กระบวนการนี้เรียกว่า garbage collection.
ข้อดีของการเก็บขยะ
การเก็บขยะให้ประโยชน์ดังต่อไปนี้ -
คุณไม่จำเป็นต้องเพิ่มหน่วยความจำด้วยตนเองในขณะที่พัฒนาแอปพลิเคชันของคุณ
นอกจากนี้ยังจัดสรรวัตถุบนฮีปที่มีการจัดการอย่างมีประสิทธิภาพ
เมื่ออ็อบเจ็กต์ไม่ได้ใช้อีกต่อไปมันจะเรียกอ็อบเจ็กต์เหล่านั้นกลับคืนมาโดยการล้างหน่วยความจำและทำให้หน่วยความจำพร้อมใช้งานสำหรับการจัดสรรในอนาคต
อ็อบเจ็กต์ที่มีการจัดการจะได้รับเนื้อหาที่สะอาดโดยอัตโนมัติเพื่อเริ่มต้นดังนั้นผู้สร้างของพวกเขาจึงไม่จำเป็นต้องเริ่มต้นฟิลด์ข้อมูลทั้งหมด
นอกจากนี้ยังให้ความปลอดภัยของหน่วยความจำโดยตรวจสอบให้แน่ใจว่าวัตถุไม่สามารถใช้เนื้อหาของวัตถุอื่นได้
เงื่อนไขการเก็บขยะ
การรวบรวมขยะเกิดขึ้นเมื่อเงื่อนไขใดเงื่อนไขหนึ่งต่อไปนี้เป็นจริง
ระบบมีหน่วยความจำกายภาพต่ำ
หน่วยความจำที่ใช้โดยอ็อบเจ็กต์ที่จัดสรรบนฮีปที่มีการจัดการเกินขีด จำกัด ที่ยอมรับได้ เกณฑ์นี้ได้รับการปรับเปลี่ยนอย่างต่อเนื่องเมื่อกระบวนการทำงาน
GC.Collectเรียกวิธีการและในเกือบทุกกรณีคุณไม่จำเป็นต้องเรียกเมธอดนี้เนื่องจากตัวเก็บขยะทำงานอย่างต่อเนื่อง วิธีนี้ใช้สำหรับสถานการณ์และการทดสอบเฉพาะเป็นหลัก
รุ่น
.NET Garbage Collector มี 3 รุ่นและแต่ละรุ่นมีฮีปของตัวเองที่ใช้สำหรับจัดเก็บอ็อบเจ็กต์ที่จัดสรร มีหลักการพื้นฐานว่าวัตถุส่วนใหญ่มีอายุสั้นหรือมีอายุยืนยาว
รุ่นแรก (0)
ใน Generation 0 วัตถุจะถูกจัดสรรก่อน
ในรุ่นนี้วัตถุมักจะไม่อยู่ผ่านรุ่นแรกเนื่องจากไม่ได้ใช้งานอีกต่อไป (อยู่นอกขอบเขต) เมื่อมีการรวบรวมขยะครั้งต่อไป
Generation 0 รวบรวมได้อย่างรวดเร็วเนื่องจากฮีปที่เกี่ยวข้องมีขนาดเล็ก
รุ่นที่สอง (1)
ในเจเนอเรชั่นที่ 1 อ็อบเจกต์มีช่องว่างโอกาสที่สอง
ออบเจ็กต์ที่มีอายุสั้น แต่อยู่รอดจากคอลเลคชัน generation 0 (มักขึ้นอยู่กับช่วงเวลาที่บังเอิญ) ไปที่รุ่น 1
คอลเลกชันรุ่นที่ 1 ยังรวดเร็วเนื่องจากฮีปที่เกี่ยวข้องมีขนาดเล็ก
สองฮีปแรกยังคงมีขนาดเล็กเนื่องจากอ็อบเจ็กต์ถูกรวบรวมหรือเลื่อนระดับเป็นฮีปรุ่นถัดไป
รุ่นที่สาม (2)
ในเจเนอเรชั่นที่ 2 อ็อบเจกต์ขนาดยาวทั้งหมดยังคงมีชีวิตอยู่และฮีปของมันจะมีขนาดใหญ่มาก
วัตถุในยุคนี้สามารถดำรงอยู่ได้เป็นเวลานานและไม่มีฮีปรุ่นต่อไปที่จะส่งเสริมวัตถุอีกต่อไป
Garbage Collector มีฮีปเพิ่มเติมสำหรับวัตถุขนาดใหญ่ที่เรียกว่า Large Object Heap (LOH)
สงวนไว้สำหรับวัตถุที่มีขนาด 85,000 ไบต์ขึ้นไป
อ็อบเจ็กต์ขนาดใหญ่ไม่ได้ถูกจัดสรรให้กับฮีป generational แต่ถูกจัดสรรให้กับ LOH โดยตรง
คอลเลกชันรุ่นที่ 2 และ LOH อาจใช้เวลานานอย่างเห็นได้ชัดสำหรับโปรแกรมที่ทำงานเป็นเวลานานหรือทำงานกับข้อมูลจำนวนมาก
โปรแกรมเซิร์ฟเวอร์ขนาดใหญ่เป็นที่ทราบกันดีว่ามีฮีปใน 10 วินาทีของ GB
GC ใช้เทคนิคต่างๆเพื่อลดระยะเวลาที่บล็อกการทำงานของโปรแกรม
แนวทางหลักคือดำเนินการรวบรวมขยะให้มากที่สุดเท่าที่จะเป็นไปได้บนเธรดพื้นหลังในลักษณะที่ไม่รบกวนการทำงานของโปรแกรม
GC ยังเปิดเผยวิธีการบางอย่างสำหรับนักพัฒนาในการมีอิทธิพลต่อพฤติกรรมซึ่งอาจเป็นประโยชน์ในการปรับปรุงประสิทธิภาพ