ใน Java การรวบรวมขยะ (งานของตัวทำลาย) จะทำโดยอัตโนมัติโดยใช้การรวบรวมขยะ แต่ถ้ามีอ็อบเจกต์ที่อ้างอิงถึงพวกมันในโค้ดล่ะ? ไม่สามารถยกเลิกการจัดสรรได้ นั่นคือไม่สามารถล้างหน่วยความจำได้ หากสถานการณ์ดังกล่าวเกิดขึ้นครั้งแล้วครั้งเล่า และวัตถุที่สร้างขึ้นหรืออ้างอิงไม่ได้ใช้งานเลย สิ่งเหล่านี้จะไร้ประโยชน์ นี่คือสิ่งที่เรียกว่าหน่วยความจำรั่ว
หากเกินขีดจำกัดของหน่วยความจำ โปรแกรมจะถูกยกเลิกโดยแสดงข้อผิดพลาด เช่น 'OutOfMemoryError' นี่คือเหตุผลที่แนะนำให้ลบการอ้างอิงทั้งหมดไปยังอ็อบเจ็กต์เพื่อให้ Java Garbage collector สามารถทำลายได้โดยอัตโนมัติ
ด้านล่างนี้เป็นตัวอย่างที่แสดงให้เห็นว่าคอมไพเลอร์ไม่มีเนื้อที่ว่างเมื่อพยายามใช้หน่วยความจำมากเกินไป -
ตัวอย่าง
import java.util.Vector; public class Demo{ public static void main(String[] args){ Vector my_v1 = new Vector(314567); Vector my_v2 = new Vector(784324678); System.out.println("This is the last line to be printed"); } }
ผลลัพธ์
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.base/java.util.Vector.<init>(Vector.java:142) at java.base/java.util.Vector.<init>(Vector.java:155) at Demo.main(Demo.java:7)
คลาสชื่อ Demo มีฟังก์ชันหลักที่สร้างวัตถุเวกเตอร์สองรายการโดยกำหนดพื้นที่ว่างให้ใหญ่เกินไป บรรทัดการพิมพ์สุดท้ายเขียนขึ้นเพื่อตรวจสอบว่าคอมไพเลอร์มาถึงบรรทัดนั้นหรือไม่ ในความเป็นจริง ไม่มี เนื่องจากพื้นที่ว่างโดยเวกเตอร์เหล่านี้มีขนาดใหญ่และไม่สามารถจัดสรรหน่วยความจำได้มาก จึงทำให้เกิดข้อผิดพลาด