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

หน่วยความจำรั่วใน Java


ใน 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 มีฟังก์ชันหลักที่สร้างวัตถุเวกเตอร์สองรายการโดยกำหนดพื้นที่ว่างให้ใหญ่เกินไป บรรทัดการพิมพ์สุดท้ายเขียนขึ้นเพื่อตรวจสอบว่าคอมไพเลอร์มาถึงบรรทัดนั้นหรือไม่ ในความเป็นจริง ไม่มี เนื่องจากพื้นที่ว่างโดยเวกเตอร์เหล่านี้มีขนาดใหญ่และไม่สามารถจัดสรรหน่วยความจำได้มาก จึงทำให้เกิดข้อผิดพลาด