Khi không còn tham chiếu nào đến một đối tượng, đối tượng đó được hoàn thiện (finalized) và khi Garbage Collection chạy, các đối tượng đã hoàn thiện sẽ được thu gom – điều này diễn ra tự động bởi JVM. Chúng ta có thể gọi GC trực tiếp nhưng không đảm bảo GC sẽ chạy ngay lập tức.
Có hai cách gọi Garbage Collection tường minh:
- System.gc()
- Runtime.gc()
Phương thức java.lang.Runtime.freeMemory() trả về lượng bộ nhớ trống trong JVM. Việc gọi gc() có thể làm tăng giá trị trả về của freeMemory.
Ví dụ minh họa
public class GarbageCollectionTest {
public static void main(String args[]) {
System.out.println(Runtime.getRuntime().freeMemory());
for (int i = 0; i <= 100000; i++) {
Double d = new Double(300);
}
System.out.println(Runtime.getRuntime().freeMemory());
System.gc();
System.out.println(Runtime.getRuntime().freeMemory());
}
}
Kết quả đầu ra
15648632 13273472 15970072
Giải thích: Bộ nhớ trống ban đầu ~15.6MB. Sau khi tạo 100.000 đối tượng Double, bộ nhớ giảm xuống ~13.3MB. Sau khi gọi System.gc(), bộ nhớ trống tăng lên ~15.9MB (đối tượng Double không còn được tham chiếu đã được thu gom).
Lưu ý quan trọng: Việc gọi System.gc() hoặc Runtime.gc() chỉ là gợi ý cho JVM. JVM có thể bỏ qua yêu cầu này. Không nên phụ thuộc vào việc gọi GC tường minh trong ứng dụng production.