JavaScript
Memory Management
Garbage Collection
เห็นภาพว่า Garbage Collection จะช่วยเก็บ object ที่ไม่มีใครอ้างถึงแล้ว และจะยังไม่แตะข้อมูลที่ยังมี reference ชี้อยู่
Garbage Collection คือคนเก็บของที่ไม่มีใครใช้แล้ว
หลังจากบท `heap-memory` เรารู้แล้วว่า object อยู่ใน Heap คำถามต่อมาคือ ถ้าเราเลิกใช้ object ก้อนหนึ่งแล้ว มันหายไปอย่างไร `Garbage Collection` หรือ GC คือระบบที่ช่วยดูให้เองว่า object ไหนไม่มีใครใช้อีกแล้ว และค่อยเก็บคืนพื้นที่ให้ภายหลัง เราไม่ต้องมานั่งลบ memory เองทีละก้อน
ให้จำภาพง่าย ๆ ว่า GC จะยังไม่แตะของที่ยังมีคนชี้อยู่ แต่จะค่อยมาเก็บของที่ไม่มีใครใช้อีกแล้ว
- GC ทำงานอัตโนมัติ เราจึงไม่ต้องจัดการ memory เองทุกครั้ง
- GC สนใจเฉพาะข้อมูลก้อนที่ไม่มีใครอ้างถึงแล้ว
- ถ้ายังมีตัวแปรหรือ reference ชี้ไปหา object ก้อนนั้น ข้อมูลก็ยังอยู่
- บทนี้เน้นให้เห็นภาพรวมก่อน ยังไม่ต้องลงลึกว่าภายใน engine เก็บอย่างไร
ถ้ายังมีตัวแปรชี้อยู่ ข้อมูลก็ยังอยู่
เวลาตัวแปรยังใช้ reference ชี้ไปหา object ก้อนเดิม GC จะมองว่าของชิ้นนั้นยังมีคนใช้อยู่ จึงยังไม่เก็บ ให้คิดง่าย ๆ ว่าชื่อตัวแปรเป็นเหมือนป้ายบอกทางไปหาของ ถ้ายังมีป้ายอยู่ GC ก็ยังไม่เอาของชิ้นนั้นออก
ตราบใดที่ตัวแปร `user` ยังชี้ไปหา object ก้อนเดิม GC ก็ยังไม่เก็บก้อนนี้
let user = { name: "Mali" };
console.log(user.name); // "Mali"
user.name = "Fah";
console.log(user.name); // "Fah"ถ้ายังมี reference ชี้อยู่ object ก้อนนั้นก็ยังอยู่ต่อ
- สร้าง object ไว้ใน Heap
- ให้ตัวแปร `user` ถือ reference ไปหาก้อนนั้น
- ตราบใดที่เรายังใช้ `user` ไปถึง object ได้ GC จะมองว่ายังมีคนใช้อยู่
- ดังนั้นข้อมูลก้อนนี้ยังไม่ถูกเก็บ
พอไม่มีใครชี้แล้ว GC ค่อยมาเก็บคืน
เมื่อเราเลิกอ้างถึง object ก้อนหนึ่งแล้ว เช่น เปลี่ยนตัวแปรให้ไม่ชี้มันอีก หรือปล่อยให้ตัวแปรหมดหน้าที่ไป GC จะมองว่าตอนนี้ไม่มีใครใช้ของก้อนนั้นแล้ว จุดสำคัญคือไม่ได้แปลว่ามันหายทันทีในวินาทีนั้น แต่หมายความว่ามันพร้อมถูกเก็บเมื่อ GC ทำงานรอบถัดไป
การตั้งค่าเป็น `null` หรือปล่อยให้ตัวแปรหมดหน้าที่ ล้วนทำให้ object เดิมไม่มีใครใช้อีก
let user = { name: "Mali" };
user = null;
// ตอนนี้ตัวแปร user ไม่ได้ชี้ไปหา object ก้อนเดิมแล้ว
// object ก้อนนั้นจึงพร้อมถูก GC เก็บในภายหลัง
function createTemp() {
let note = { text: "hello" };
console.log(note.text);
}
createTemp();
// เมื่อ function จบ ตัวแปร note ก็หมดหน้าที่
// object ที่ note เคยชี้อยู่จึงพร้อมถูกเก็บเช่นกันพอไม่มีใครชี้แล้ว object ก้อนเดิมก็พร้อมถูกเก็บคืน
- ถ้ายังเรียก object ก้อนเดิมผ่านตัวแปรใดตัวแปรหนึ่งได้ GC จะยังไม่เก็บ
- พอไม่มีตัวแปรหรือ reference ไหนชี้แล้ว object ก้อนนั้นก็พร้อมถูกเก็บ
- การพร้อมถูกเก็บ ไม่ได้แปลว่าหายทันทีในบรรทัดนั้น
- สิ่งที่ควรจำคือ GC จะเก็บของที่ไม่มีใครอ้างถึงแล้ว ไม่ใช่ของที่ยังมีคนใช้อยู่
จำแค่นี้พอ และอย่าเก็บ reference ค้างไว้
- GC คือระบบที่ช่วยเก็บ object ที่ไม่มีใครใช้อีกแล้ว
- ถ้ายังมีตัวแปรหรือ `reference` ชี้อยู่ ข้อมูลนั้นก็ยังอยู่
- เมื่อไม่มีใครชี้แล้ว object ก้อนนั้นจึงพร้อมถูกเก็บในภายหลัง
- ถ้าเผลอเก็บ reference ค้างไว้ ข้อมูลก้อนเดิมก็ยังไม่หาย
คำเตือนสั้น ๆ สำหรับการเขียนโค้ดจริงคือ อย่าเก็บตัวแปรหรือ reference ที่ไม่ใช้แล้วไว้โดยไม่จำเป็น เพราะ GC จะยังมองว่าของก้อนนั้นมีคนใช้อยู่ ถ้าจำ 4 ข้อนี้ได้ คุณก็เข้าใจภาพรวมของ `Garbage Collection` พอสำหรับการอ่านโค้ดและต่อยอดบทถัดไปแล้ว