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