题目
Java垃圾回收机制基础
信息
- 类型:问答
- 难度:⭐
考点
垃圾回收概念,对象可达性判定,System.gc()的作用
快速回答
Java垃圾回收(GC)是自动内存管理机制,主要考察点包括:
- 核心概念:自动回收不再使用的对象内存
- 对象回收条件:当对象不可达(无活动引用指向)时会被标记回收
- 手动触发:通过
System.gc()建议JVM执行GC(但不保证立即执行)
1. 原理说明
Java垃圾回收通过可达性分析算法判断对象是否存活:从GC Roots(如栈帧局部变量、静态变量等)出发,无法到达的对象即为垃圾。主要步骤:
- 标记:遍历所有对象,标记不可达对象
- 清理:回收被标记对象的内存空间
2. 代码示例
public class GCDemo {
public static void main(String[] args) {
// 创建对象并立即失去引用(成为垃圾)
new Object();
// 建议JVM执行垃圾回收(非强制)
System.gc();
System.out.println("GC建议已发送");
}
// 重写finalize方法(仅作演示,实际不推荐)
@Override
protected void finalize() throws Throwable {
System.out.println("对象被回收");
}
}注意:finalize()方法在Java 9后已被废弃,此处仅用于演示。
3. 最佳实践
- 避免使用
System.gc():JVM的自动GC已足够高效,手动调用可能引发性能问题 - 及时解除引用:将不再使用的对象引用设为
null(仅对特定场景如大对象有帮助) - 优先选择局部变量:局部变量随方法结束自动销毁,利于GC
4. 常见错误
- 误认为
System.gc()会立即执行GC(实际只是建议) - 过度依赖
finalize()方法执行资源清理(可能导致内存泄漏) - 错误理解引用存在性:
Object obj = new Object(); obj = null; // 此时原对象成为垃圾
5. 扩展知识
- GC分代:堆内存分为新生代(Young)和老年代(Old),不同区域使用不同回收算法
- GC Roots类型:虚拟机栈引用、方法区静态引用、本地方法栈引用等
- 垃圾回收器:Serial、Parallel、CMS、G1等(初级只需知道存在多种实现)