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

ความแตกต่างระหว่างหน่วยความจำ Stack และ Heap ใน Java

JVM แบ่งพื้นที่หน่วยความจำออกเป็นสองส่วนหลักคือ Stack และ Heap โดย Stack ใช้สำหรับจัดเก็บลำดับการทำงานของเมธอดและตัวแปรประจำท้องถิ่น (local variables)

ลักษณะการจัดเก็บข้อมูล

Stack จัดเก็บข้อมูลแบบ LIFO (Last In First Out) ส่วน Heap ใช้การจัดสรรหน่วยความจำแบบไดนามิก (dynamic allocation) สำหรับการจัดสรรและปล่อยบล็อกหน่วยความจำ

อายุการใช้งานของหน่วยความจำ

  • หน่วยความจำใน Heap จะคงอยู่จนกว่าโปรแกรมจะสิ้นสุดการทำงาน หรือมีการปล่อยหน่วยความจำอย่างชัดเจน
  • หน่วยความจำใน Stack จะคงอยู่จนกว่าฟังก์ชันจะคืนค่า (function returns)

ตารางเปรียบเทียบรายละเอียด

ลำดับ หัวข้อ Stack Heap Memory
1 พื้นฐาน ใช้จัดเก็บรายการที่มีอายุสั้น เช่น ตัวแปรประจำท้องถิ่น ตัวแปรอ้างอิงของอ็อบเจ็กต์ จัดสรรเพื่อจัดเก็บอ็อบเจ็กต์และคลาสของ JRE
2 ลำดับการจัดเก็บ จองพื้นที่แบบ LIFO (Last In First Out) เสมอ การจัดสรรแบบไดนามิก ไม่มีรูปแบบคงที่สำหรับการจัดสรรและปล่อยบล็อกในหน่วยความจำ
3 ขนาด เพิ่มขนาด Stack ได้ด้วยพารามิเตอร์ JVM -Xss เพิ่มหรือลดขนาด Heap ได้ด้วยตัวเลือก JVM -Xms และ -Xmx
4 การมองเห็น (Visibility) ตัวแปรมองเห็นได้เฉพาะเธรดเจ้าของเท่านั้น มองเห็นได้จากทุกเธรด
5 ข้อยกเว้น (Exception) JVM จะโยน java.lang.StackOverflowError JVM จะโยน java.lang.OutOfMemoryError

สรุป

Stack เหมาะสำหรับการจัดเก็บข้อมูลชั่วคราวของเมธอด ในขณะที่ Heap ใช้สำหรับอ็อบเจ็กต์ที่ต้องการอายุการใช้งานนานกว่าหรือต้องเข้าถึงจากหลายเธรด การเข้าใจความแตกต่างนี้ช่วยให้นักพัฒนาสามารถจัดการหน่วยความจำได้อย่างมีประสิทธิภาพและหลีกเลี่ยงข้อผิดพลาดทั่วไป เช่น StackOverflowError และ OutOfMemoryError

JVM แบ่งพื้นที่หน่วยความจำออกเป็นสองส่วนหลักคือ Stack และ Heap โดย Stack ใช้สำหรับจัดเก็บลำดับการทำงานของเมธอดและตัวแปรประจำท้องถิ่น (local variables)

ลักษณะการจัดเก็บข้อมูล

Stack จัดเก็บข้อมูลแบบ LIFO (Last In First Out) ส่วน Heap ใช้การจัดสรรหน่วยความจำแบบไดนามิก (dynamic allocation) สำหรับการจัดสรรและปล่อยบล็อกหน่วยความจำ

อายุการใช้งานของหน่วยความจำ

  • หน่วยความจำใน Heap จะคงอยู่จนกว่าโปรแกรมจะสิ้นสุดการทำงาน หรือมีการปล่อยหน่วยความจำอย่างชัดเจน
  • หน่วยความจำใน Stack จะคงอยู่จนกว่าฟังก์ชันจะคืนค่า (function returns)

ตารางเปรียบเทียบรายละเอียด

ลำดับ หัวข้อ Stack Heap Memory
1 พื้นฐาน ใช้จัดเก็บรายการที่มีอายุสั้น เช่น ตัวแปรประจำท้องถิ่น ตัวแปรอ้างอิงของอ็อบเจ็กต์ จัดสรรเพื่อจัดเก็บอ็อบเจ็กต์และคลาสของ JRE
2 ลำดับการจัดเก็บ จองพื้นที่แบบ LIFO (Last In First Out) เสมอ การจัดสรรแบบไดนามิก ไม่มีรูปแบบคงที่สำหรับการจัดสรรและปล่อยบล็อกในหน่วยความจำ
3 ขนาด เพิ่มขนาด Stack ได้ด้วยพารามิเตอร์ JVM -Xss เพิ่มหรือลดขนาด Heap ได้ด้วยตัวเลือก JVM -Xms และ -Xmx
4 การมองเห็น (Visibility) ตัวแปรมองเห็นได้เฉพาะเธรดเจ้าของเท่านั้น มองเห็นได้จากทุกเธรด
5 ข้อยกเว้น (Exception) JVM จะโยน java.lang.StackOverflowError JVM จะโยน java.lang.OutOfMemoryError

สรุป

Stack เหมาะสำหรับการจัดเก็บข้อมูลชั่วคราวของเมธอด ในขณะที่ Heap ใช้สำหรับอ็อบเจ็กต์ที่ต้องการอายุการใช้งานนานกว่าหรือต้องเข้าถึงจากหลายเธรด การเข้าใจความแตกต่างนี้ช่วยให้นักพัฒนาสามารถจัดการหน่วยความจำได้อย่างมีประสิทธิภาพและหลีกเลี่ยงข้อผิดพลาดทั่วไป เช่น StackOverflowError และ OutOfMemoryError