เมื่อเรารันโปรแกรม Java ระบบปฏิบัติการจะจัดสรรหน่วยความจำบางส่วนให้ JVM JVM แบ่งหน่วยความจำนี้ออกเป็นสองส่วน ส่วนหนึ่งคือหน่วยความจำ Stack และอีกส่วนคือหน่วยความจำ Heap Stack ใช้สำหรับการทำงานของเมธอด และ Heap ใช้เก็บออบเจ็กต์ เมื่อ Stack เต็ม JVM จะโยน java.lang.StackOverflowError และเมื่อ Heap เต็ม JVM จะโยน java.lang.OutOfMemoryError
StackOverflowError
- Stack ใช้สำหรับการทำงานของเมธอด สำหรับการเรียกเมธอดแต่ละครั้ง จะมีบล็อกหนึ่งถูกสร้างในหน่วยความจำ Stack
- ข้อมูลที่เกี่ยวข้องกับเมธอด เช่น พารามิเตอร์ ตัวแปรท้องถิ่น หรือการอ้างอิงถึงออบเจ็กต์ จะถูกเก็บในบล็อกนี้
- เมื่อเมธอดเสร็จสิ้นการทำงาน บล็อกนี้จะถูกลบออกจาก Stack พร้อมกับข้อมูลที่เก็บอยู่ในมัน
- ทุกครั้งที่เราเรียกเมธอด มันต้องเสร็จสิ้นการทำงานและออกจากหน่วยความจำ Stack
- หากเมธอดค้างอยู่ใน Stack แล้ว Stack จะเต็มและ JVM จะโยน
java.lang.StackOverflowError
OutOfMemoryError
- ออบเจ็กต์ที่เราสร้างใน Java จะถูกเก็บในหน่วยความจำ Heap เมื่อออบเจ็กต์ไม่จำเป็นอีกต่อไป ต้องถูกลบออกจากหน่วยความจำ
- Garbage Collector จะลบออบเจ็กต์ที่ไม่ต้องการออกจากหน่วยความจำ Heap
- หากออบเจ็กต์ของเรายังมีการอ้างอิงที่ยังมีชีวิต Garbage Collector จะไม่ลบมัน มันลบเฉพาะออบเจ็กต์ที่ไม่มีการอ้างอิงที่ยังมีชีวิต
- ทุกครั้งที่เราเรียกเมธอด มันต้องเสร็จสิ้นการทำงานและออกจากหน่วยความจำ Stack
- หากไม่มีพื้นที่เหลือสำหรับออบเจ็กต์ใหม่ในหน่วยความจำ Heap แล้ว JVM จะโยน
java.lang.OutOfMemoryError