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

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

เมื่อเรารันโปรแกรม 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