Heap Memory คือ พื้นที่หน่วยความจำ ( RAM ) ส่วนหนึ่งที่ระบบปฏิบัติการเตรียมไว้ให้โปรแกรมใช้สำหรับ จองหน่วยความจำแบบไดนามิก ( Dynamic Memory Allocation ) ในระหว่างที่โปรแกรมกำลังทำงาน ( Runtime ) เพื่อให้เห็นภาพรวมง่ายขึ้น มักจะนำไปเปรียบเทียบกับ Stack Memory ครับ
ลักษณะเด่นของ Heap Memory
- ขนาดและอายุขัยไม่ตายตัว: พื้นที่ใน Heap จะถูกจองก็ต่อเมื่อโปรแกรมสั่งรันไทม์เท่านั้น ( เช่น การใช้คำสั่ง
newเพื่อสร้าง Object ) และข้อมูลจะอยู่ไปเรื่อย ๆ จนกว่าจะถูกสั่งลบหรือจัดการทิ้ง ไม่ได้หายไปทันทีเมื่อจบฟังก์ชัน ( ต่างจาก Stack ที่ตัวแปรจะหายไปเมื่อจบ Scope ) - ใช้เก็บข้อมูลขนาดใหญ่หรือซับซ้อน: พวก Object, Array, String หรือโครงสร้างข้อมูลที่มีขนาดไม่แน่นอนตอนคอมไพล์ ( Reference Types ) จะถูกโยนมาเก็บไว้ที่นี่
- การเข้าถึงข้อมูลช้ากว่า: การอ่านเขียนข้อมูลบน Heap ต้องทำผ่าน Pointer ( ตัวชี้ ) ที่เก็บที่อยู่ ( Address ) ของข้อมูลนั้นอีกที ทำให้กระบวนการทำงานช้ากว่า Stack
- เสี่ยงต่อ Memory Leak: หากโปรแกรมจองพื้นที่ไว้แล้วไม่ยอมคืนระบบ ( ในกรณีที่จัดการหน่วยความจำเอง ) จะทำให้ RAM เต็มและโปรแกรมค้างได้
การจัดการ Heap ในภาษาโปรแกรมต่าง ๆ
วิธีการที่แต่ละภาษาใช้จัดการขยะ (ข้อมูลที่ไม่ได้ใช้แล้ว) บน Heap จะแตกต่างกันไปครับ
- จัดการผ่าน Garbage Collector ( GC ): ในภาษาอย่าง C# หรือ Java ข้อมูลที่เป็น Class หรือ Reference Type จะถูกนำไปเก็บไว้ใน Heap ทั้งหมด เมื่อเราเลิกใช้งานตัวแปรนั้นแล้ว ระบบจะมี Garbage Collector คอยวิ่งตรวจจับและตามล้างพื้นที่ Heap ให้โดยอัตโนมัติ
- จัดการด้วยตัวเอง ( Manual Management ): ในภาษาอย่าง C หรือ C++ โปรแกรมเมอร์ต้องใช้คำสั่งจอง (
malloc) และคืนพื้นที่ (free) ด้วยตัวเองทั้งหมด ถ้าลืมคืนก็เกิด Memory Leak ทันที - จัดการผ่านระบบ Ownership: ภาษาอย่าง Rust จะใช้แนวคิด Ownership และ Borrowing มาคุมการใช้งานตัวแปร โดยระบบจะรู้ได้เองตอนคอมไพล์ว่าจังหวะไหนควรคืนพื้นที่ Heap ทันทีเมื่อตัวแปรหลุดจาก Scope ทำให้จัดการ Heap ได้อย่างปลอดภัยโดยไม่ต้องพึ่งพาระบบ GC ให้หน่วงเครื่อง
สรุปความต่าง Heap vs Stack แบบรวบรัด
| คุณสมบัติ | Stack Memory | Heap Memory |
| การจองพื้นที่ | อัตโนมัติ ( ตาม Scope ของฟังก์ชัน ) | ไดนามิก ( ตามคำสั่งในโปรแกรม ) |
| ความเร็ว | เร็วมาก | ช้ากว่า ( ต้องอ้างอิงผ่าน Pointer ) |
| ขนาดพื้นที่ | จำกัดและเล็กกว่า | ใหญ่มาก ( ตาม RAM ที่เหลือในระบบ ) |
| สิ่งที่มักจะเก็บ | Value Types ( int, float, bool ), Pointers | Reference Types ( Objects, Arrays, Strings ) |
อ่านเพิ่มเติม