← 返回首页

JVM垃圾回收:自动内存管理

📂 java ⏱ 1 min 173 words

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<>();
}

最佳实践

  1. 选择合适的GC:根据应用特点选择
  2. 监控GC日志:分析GC频率和停顿时间
  3. 避免内存泄漏:及时释放不用的对象
  4. 合理设置堆大小:避免频繁Full GC
  5. 使用GC工具:jstat、jmap、jhat等

总结

垃圾回收是JVM自动内存管理的核心机制,理解对象存活判断、GC算法和垃圾收集器,是进行性能调优的关键。