JVM学习笔记002:垃圾回收
发布日期:2021-04-30 21:04:21 浏览次数:110 分类:精选文章

本文共 2470 字,大约阅读时间需要 8 分钟。

垃圾回收

垃圾回收是Java虚拟机(JVM)管理内存的重要机制,用于回收不再被引用(即不再有强引用)的对象占用的内存空间。垃圾回收机制的核心目标是确保JVM内存的高效利用,同时避免内存泄漏和内存碎片问题。

1. 如何判断对象可以回收

引用计数法

引用计数法是Java语言中的基础垃圾回收机制,用于跟踪对象被引用的次数。当一个对象的引用计数为0时,表示没有任何强引用存在,它就可以被回收。

优点:实现简单,能够快速判断对象是否可以回收。缺点:在存在循环引用的情况下,引用计数法无法有效回收循环中的对象,因为每个对象的引用计数都会被保持为1。

可达性分析算法

可达性分析算法是JVM中使用的高级垃圾回收机制,基于GC Roots(根对象)进行对象可达性分析。GC Roots包括以下几种:

  • 虚拟机栈(Stack)中的本地变量表中的对象引用。
  • 方法区(Method Area)中的类静态属性引用。
  • 方法区中的常量引用。
  • 本地方法栈(Native Method Stack)中的JNI引用。

垃圾回收器通过从GC Roots开始,沿着引用链逐步遍历,判断对象是否可以到达。无法到达的对象即为可以回收的对象。

2. 垃圾回收算法

垃圾回收算法根据不同的场景和需求,JVM会选择不同的算法来进行垃圾回收。常见的垃圾回收算法包括标记-清除、标记-整理、复制算法和分代收集(Mark-Sweep, Mark-Compact, Copy, 分代收集)。

标记-清除

标记-清除算法是最基本的垃圾回收算法。其核心步骤是:

  • 标记:标记所有可以回收的对象。
  • 清除:清除标记对象的内存。
  • 优点:实现简单,内存回收速度快。缺点:容易产生大量的内存碎片,尤其是在对象较多的情况下,可能导致内存无法高效分配。

    标记-整理

    标记-整理算法是标记-清除算法的改进版。其核心步骤是:

  • 标记:标记所有可以回收的对象。
  • 整理:将存活对象整理到连续的内存空间中,清理内存碎片。
  • 优点:避免了内存碎片问题。缺点:整理过程需要移动内存块,效率较低。

    复制算法

    复制算法将内存分为两个相等的区域(FROM和TO)。垃圾回收器将存活对象从FROM区域复制到TO区域,释放FROM区域的内存。完成后,将TO区域与FROM区域交换,使得TO区域成为新的FROM区域。

    优点:避免了内存碎片问题。缺点:需要双倍的内存空间,且在垃圾回收过程中会暂停用户线程(Stop The World)。

    分代收集

    分代收集(也称为标记-整理算法)是JVM中使用的高效垃圾回收算法。其核心思想是根据对象的生命周期对堆内存进行分代管理。新生代(Eden)用于新对象的分配,幸存区(Survivor)用于存活对象的临时存放,老年代(Tenured)用于存活对象的长期存放。

    垃圾回收过程:

  • Minor GC:新生代垃圾回收。当新生代内存不足时,垃圾回收器会触发Minor GC。此时,垃圾回收器会将新生代中的存活对象复制到幸存区,并交换新生代和幸存区的内存空间。
  • Major GC:老年代垃圾回收。当老年代内存不足时,垃圾回收器会触发Major GC。此时,垃圾回收器会清理老年代的存活对象,并将存活对象复制到幸存区。
  • 3. 垃圾回收器

    JVM中提供了多种垃圾回收器,主要包括以下几种:

    并行收集器(Parallel Collector)

    并行收集器是多线程垃圾回收器,其核心特点是:

    • 多线程:垃圾回收线程与用户线程并行执行。
    • 停止用户线程:垃圾回收过程中,用户线程会被暂停(Stop The World)。

    序列收集器(Serial Collector)

    序列收集器是最基本的垃圾回收器,适用于单线程环境。其核心特点是:

    • 单线程:垃圾回收器运行在单个线程上。
    • 停止用户线程:垃圾回收过程中,用户线程会被暂停(Stop The World)。

    CMS(Concurrent Mark Sweep)

    CMS是一种老年代垃圾回收器,其核心特点是:

    • 并发执行:垃圾回收器与用户线程可以并行执行。
    • 低延迟:CMS的目标是最短化垃圾回收的停顿时间。

    G1(Garbage First)

    G1垃圾回收器是JDK9以后默认的垃圾回收器,其核心特点是:

    • 分代收集:G1垃圾回收器采用分代收集算法。
    • 并行执行:G1垃圾回收器可以并行执行垃圾回收操作。
    • 动态调整:G1垃圾回收器可以根据系统运行状况动态调整垃圾回收策略。

    4. 垃圾回收调优

    垃圾回收调优是优化JVM性能的重要环节,主要包括以下几个方面:

    新生代调优

    • 新生代内存设置:新生代内存应根据应用场景合理设置,避免频繁触发Minor GC。
    • 分代策略:合理设置晋升阈值,避免长时间存活的对象占用新生代内存。

    幸存区调优

    • 幸存区容量:幸存区的容量应根据应用需求合理设置,确保存活对象不会占用过多内存。
    • 晋升策略:设置合理的晋升阈值,确保长时间存活的对象尽快晋升到老年代。

    老年代调优

    • 老年代内存设置:老年代内存应根据应用需求合理设置,避免频繁触发Major GC。
    • 分代策略:采用动态分代策略,根据系统运行状况调整老年代内存管理。

    5. 垃圾回收性能优化

    垃圾回收性能优化需要从以下几个方面入手:

    内存管理

    • 合理分配内存:新生代、幸存区和老年代的内存比例应根据应用需求合理设置。
    • 内存碎片管理:定期执行垃圾回收,避免内存碎片过多。

    锁竞争

    • 合理使用锁:减少锁竞争,避免因锁竞争而导致的内存泄漏。
    • 解锁优化:确保锁解操作高效,避免因解锁问题导致的内存泄漏。

    GC算法选择

    • 根据应用需求选择合适的垃圾回收算法:
      • CMS:适用于需要低延迟的场景。
      • G1:适用于需要高吞吐量的场景。

    内存泄漏检测

    • 定期检查内存泄漏:通过内存监控工具,定期检查内存占用情况,及时发现内存泄漏问题。
    • 使用弱引用和引用队列:对于不重要的对象,可以使用弱引用和引用队列进行内存管理。

    垃圾回收是JVM管理内存的核心机制,其优化需要从多个方面入手,结合具体的应用场景和JVM性能监控工具,才能实现最佳的垃圾回收效果。

    上一篇:隐藏状态栏和操作栏
    下一篇:Spring Cloud Gateway 入门实战

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2026年05月25日 06时36分17秒