Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

Garbage Collection (GC) ใน JavaScript คืออะไร?

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

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

ตัวอย่าง

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

ผลลัพธ์

{name: "John"}

สังเกตว่า x ไม่อยู่ใน scope แล้วแต่ยังเข้าถึงได้ผ่าน a หมายความว่าต้องคงอยู่ในหน่วยความจำจนกว่าจะไม่มี reference อีก ถ้า pop ออกจาก array จะไม่จำเป็นแล้วและจะถูก garbage collected

Garbage collectors ทำงานด้วยอัลกอริทึมเหล่านี้

1. Reference-counting garbage collection - ออบเจ็กต์เป็น "garbage" (เก็บได้) หากมีศูนย์ reference ชี้ไป มันถูกใช้ในเบราว์เซอร์เก่า แต่ก่อปัญหากับ circular referencing objects เพราะไม่สามารถเก็บได้ (มี reference จากอีกตัวอยู่เสมอ)

2. Mark-and-sweep algorithm - อัลกอริทึมนี้ลดนิยาม "ออบเจ็กต์ไม่จำเป็นแล้ว" เป็น "ออบเจ็กต์เข้าถึงไม่ได้" สมมติรู้จักชุดออบเจ็กต์ที่เรียกว่า roots ใน JS root คือ global object เป็นระยะ GC เริ่มจาก roots หาออบเจ็กต์ที่ถูกอ้างอิงจาก roots แบบ recursive จาก roots GC จะหาออบเจ็กต์ที่เข้าถึงได้ทั้งหมดและเก็บออบเจ็กต์ที่เข้าถึงไม่ได้

อ่านเพิ่มเติมเกี่ยวกับ GC ใน JavaScript ได้ที่ MDN Memory Management