.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 ยังเปิดเผยวิธีการบางอย่างสำหรับนักพัฒนาในการมีอิทธิพลต่อพฤติกรรมซึ่งอาจเป็นประโยชน์ในการปรับปรุงประสิทธิภาพ