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

อะไรคือความแตกต่างระหว่าง StackOverflowError และ OutOfMemoryError ใน Java?


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

StackOverflowError

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

ข้อผิดพลาด OutOfMemory

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