面试官问:如何手动触发垃圾回收?幸好昨天复习到了
在Java中,手动触发垃圾回收可以使用 System.gc()
方法。但需要注意,调用 System.gc()
并不能确保立即执行垃圾回收,因为具体的垃圾回收行为是由Java虚拟机决定的,而不受程序员直接控制。
public class GarbageCollectionExample {
public static void main(String[] args) {
// 创建一些对象
Object obj1 = new Object();
Object obj2 = new Object();
// 打印初始时内存情况
printMemoryStatus("Before Garbage Collection");
// 手动触发垃圾回收
System.gc();
// 打印触发垃圾回收后的内存情况
printMemoryStatus("After Garbage Collection");
// 其他业务逻辑
}
private static void printMemoryStatus(String message) {
Runtime runtime = Runtime.getRuntime();
long freeMemory = runtime.freeMemory();
long totalMemory = runtime.totalMemory();
long maxMemory = runtime.maxMemory();
System.out.println(message + ":");
System.out.println("Free Memory: " + freeMemory + " bytes");
System.out.println("Total Memory: " + totalMemory + " bytes");
System.out.println("Max Memory: " + maxMemory + " bytes");
System.out.println("------------------------");
}
}
在上面的代码中,通过 printMemoryStatus
方法打印了内存状态,包括空闲内存、总内存和最大内存。在手动触发垃圾回收之前和之后,都打印了内存状态。
运行一下上面的代码,会得到以下的结果:
Before Garbage Collection:
Free Memory: 6958680 bytes
Total Memory: 8336096 bytes
Max Memory: 12573056 bytes
------------------------
After Garbage Collection:
Free Memory: 7446808 bytes
Total Memory: 8336096 bytes
Max Memory: 12573056 bytes
------------------------
需要注意的是,垃圾回收的触发和执行是由Java虚拟机决定的,因此实际的结果可能会有所不同。在正常情况下,Java虚拟机会根据内存状况和程序运行状态自动执行垃圾回收,无需手动触发。手动调用 System.gc()
可能并不会立即执行垃圾回收。