ป้ายกำกับ: ตัวชี้

Heap Memory คืออะไรHeap Memory คืออะไร

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 MemoryHeap Memory
การจองพื้นที่อัตโนมัติ ( ตาม Scope ของฟังก์ชัน )ไดนามิก ( ตามคำสั่งในโปรแกรม )
ความเร็วเร็วมากช้ากว่า ( ต้องอ้างอิงผ่าน Pointer )
ขนาดพื้นที่จำกัดและเล็กกว่าใหญ่มาก ( ตาม RAM ที่เหลือในระบบ )
สิ่งที่มักจะเก็บValue Types ( int, float, bool ), PointersReference Types ( Objects, Arrays, Strings )

อ่านเพิ่มเติม