Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

การรวบรวมขยะ (GC) ใน JavaScript?


การรวบรวมขยะ (GC) เป็นรูปแบบหนึ่งของการจัดการหน่วยความจำอัตโนมัติ ตัวรวบรวมขยะหรือตัวรวบรวมเพียงพยายามเรียกคืนขยะหรือหน่วยความจำที่ถูกครอบครองโดยอ็อบเจ็กต์ที่ไม่ได้ใช้งานโดยโปรแกรมอีกต่อไป ปัญหาทั่วไปของการค้นหาโดยอัตโนมัติว่าหน่วยความจำบางส่วน "ไม่ต้องการอีกต่อไป" หรือไม่นั้นไม่สามารถตัดสินใจได้ ด้วยเหตุนี้ ผู้รวบรวมขยะจึงใช้ข้อจำกัดในการแก้ปัญหาทั่วไป

แนวคิดหลักที่อัลกอริทึมการรวบรวมขยะอาศัยคือแนวคิดของการอ้างอิง ภายในบริบทของการจัดการหน่วยความจำ มีการกล่าวถึงอ็อบเจ็กต์เพื่ออ้างอิงอ็อบเจ็กต์อื่นหากวัตถุเดิมสามารถเข้าถึงอ็อบเจกต์หลังได้ (ไม่ว่าจะโดยนัยหรือโดยชัดแจ้ง)

ตัวอย่าง

let a = []
function addToA() {
   let x = {name: "John"}
   a.push(x)
}
console.log(a[0])

ผลลัพธ์

{name: "John"}

โปรดทราบว่า x ไม่อยู่ในขอบเขตอีกต่อไปแต่ยังสามารถเข้าถึงได้โดยใช้ a. ซึ่งหมายความว่าจำเป็นต้องอยู่ในหน่วยความจำจนกว่าจะไม่มีการอ้างอิงอีกต่อไป ถ้าเราป๊อปมันจากอาร์เรย์ก็ไม่จำเป็นอีกต่อไปและสามารถเก็บขยะได้

เครื่องเก็บขยะทำงานโดยใช้อัลกอริธึมต่อไปนี้ -

1. การนับจำนวนขยะอ้างอิง − วัตถุเรียกว่า "ขยะ" หรือของสะสมได้ ถ้าไม่มีการอ้างอิงถึงวัตถุนั้น ใช้ในเบราว์เซอร์รุ่นเก่า แต่สิ่งนี้ทำให้เกิดปัญหากับวัตถุอ้างอิงแบบวงกลมเนื่องจากไม่สามารถรวบรวมได้ (มีการอ้างอิงถึงวัตถุเหล่านั้นจากวัตถุอื่นเสมอ)

2. อัลกอริธึมการทำเครื่องหมายและกวาด − อัลกอริธึมนี้ลดคำจำกัดความของ "วัตถุไม่จำเป็นอีกต่อไป" เป็น "วัตถุที่ไม่สามารถเข้าถึงได้" อัลกอริธึมนี้ถือว่าความรู้เกี่ยวกับชุดของอ็อบเจ็กต์ที่เรียกว่ารูท ใน JavaScript รูทคืออ็อบเจ็กต์ส่วนกลาง GC จะเริ่มต้นจากรากเหล่านี้เป็นระยะ ค้นหาวัตถุทั้งหมดที่อ้างอิงจากรากเหล่านี้แบบเรียกซ้ำ เริ่มจากราก GC จะค้นหาวัตถุที่เข้าถึงได้ทั้งหมดและรวบรวมวัตถุที่ไม่สามารถเข้าถึงได้ทั้งหมด

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ GC ใน javascript ได้ที่https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management