Trong Java, thu gom rác (công việc của destructor) được thực hiện tự động bằng Garbage Collection. Nhưng nếu có các đối tượng có tham chiếu đến chúng trong mã? Chúng không thể được giải phóng, tức là bộ nhớ của chúng không thể được dọn dẹp. Nếu tình huống này xảy ra lặp đi lặp lại và các đối tượng được tạo hoặc tham chiếu không được sử dụng, chúng trở nên vô dụng. Đây chính là rò rỉ bộ nhớ.
Nếu giới hạn bộ nhớ bị vượt quá, chương trình sẽ bị chấm dứt bằng cách ném lỗi, tức là OutOfMemoryError. Đây là lý do tại sao luôn được khuyến nghị xóa tất cả tham chiếu đến một đối tượng để Java Garbage Collector có thể tự động hủy nó.
Dưới đây là ví dụ minh họa cách trình biên dịch hết không gian khi cố gắng sử dụng quá nhiều bộ nhớ:
Ví dụ
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("Đây là dòng cuối cùng được in");
}
}
Kết quả
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)
Lớp Demo chứa hàm main nơi hai đối tượng Vector được tạo bằng cách gán cho chúng không gian quá lớn. Dòng in cuối cùng chỉ được viết để kiểm tra xem trình biên dịch có đến dòng đó không. Thực tế không, vì không gian bị chiếm bởi các Vector này quá lớn và không thể cấp phát nhiều bộ nhớ như vậy, dẫn đến lỗi.