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