JVM垃圾回收:自动内存管理
JVM垃圾回收:自动内存管理
概述
垃圾回收(GC)是JVM自动管理内存的机制,它负责回收不再使用的对象所占用的内存。理解垃圾回收的原理和算法,是进行性能调优的关键。
1. 对象存活判断
// 可达性分析算法
// GC Roots:
// 1. 虚拟机栈中引用的对象
// 2. 方法区中静态属性引用的对象
// 3. 方法区中常量引用的对象
// 4. 本地方法栈中JNI引用的对象
public class ReachabilityDemo {
private static Object gcRoot = new Object();
public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
Object obj3 = new Object();
obj1 = null;
obj2 = null;
}
}
2. 垃圾回收算法
// 1. 标记-清除算法:简单但产生碎片
// 2. 复制算法:无碎片,效率高,内存利用率低
// 3. 标记-整理算法:无碎片,效率较低
// 4. 分代收集算法:新生代用复制,老年代用标记-整理
public class GCAlgorithmDemo {
public static void main(String[] args) {
System.gc();
}
}
3. 垃圾收集器
// Serial:单线程,简单高效
// Parallel:多线程,吞吐量优先
// CMS:低停顿,并发标记清除
// G1:分Region,可预测停顿
// ZGC:超低停顿(<10ms)
4. GC日志分析
# GC日志参数
-Xlog:gc*:file=gc.log:time,uptime,level,tags
# 输出示例
# GC(0) Pause Young 50M->10M(256M) 5.000ms
# GC(0) Pause Full 256M->50M(256M) 50.000ms
5. 内存泄漏排查
import java.util.*;
public class MemoryLeakDemo {
private static Map<String, Object> cache = new HashMap<>();
public static void addToCache(String key, Object value) {
cache.put(key, value);
}
// 正确做法:使用WeakHashMap或定期清理
private static Map<String, Object> safeCache = new WeakHashMap<>();
}
最佳实践
- 选择合适的GC:根据应用特点选择
- 监控GC日志:分析GC频率和停顿时间
- 避免内存泄漏:及时释放不用的对象
- 合理设置堆大小:避免频繁Full GC
- 使用GC工具:jstat、jmap、jhat等
总结
垃圾回收是JVM自动内存管理的核心机制,理解对象存活判断、GC算法和垃圾收集器,是进行性能调优的关键。