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