JVM--垃圾回收机制

垃圾回收机制(Garbage Collection,简称GC)是Java虚拟机(JVM)中的一项关键技术,它自动管理程序运行时产生的内存分配与释放,从而减轻了程序员手动管理内存的负担,并减少了由于错误的内存管理而导致的问题。GC的核心任务是在不影响应用程序正常运作的前提下,识别并回收不再使用的对象所占用的内存空间。

垃圾回收的重要性

在Java编程环境中,几乎所有的对象实例都存放在堆内存中,而这些对象的生命周期往往是不确定的。随着程序的持续运行,如果不对不再需要的对象进行清理,那么堆内存将会逐渐被耗尽,最终导致内存溢出错误(OutOfMemoryError)。因此,有效的垃圾回收不仅能够防止内存泄漏,还能确保系统资源得到合理利用,进而提升应用的整体性能。

判断对象是否为垃圾

为了确定哪些对象可以被视为"垃圾",即那些不再被引用或无法访问的对象,JVM采用了两种主要的方法:

  • 引用计数算法:每个对象都有一个计数器来记录指向它的引用数量。每当有一个新的引用指向该对象时,计数器加一;当某个引用失效时,计数器减一。一旦计数器归零,则表明此对象已无任何外部引用,可作为垃圾处理。然而,这种方法存在一个严重的缺陷------无法解决对象之间的循环引用问题。

  • 可达性分析法(Reachability Analysis):这是目前主流商用语言中最常用的判断方法。通过从一组称为GC Roots的对象出发,沿着引用链向下搜索所有直接或间接可达的对象。如果某个对象到GC Roots间没有任何引用路径,则认为它是不可达的,也就是所谓的"垃圾"。GC Roots通常包括但不限于:

    • 虚拟机栈中的局部变量表;
    • 方法区中的静态属性;
    • 方法区中的常量;
    • 本地方法栈中的JNI引用。

垃圾回收算法

根据不同的应用场景和技术要求,JVM实现了多种垃圾回收算法,每种算法都有其特点和适用范围:

  • 标记-清除(Mark-Sweep)算法:分为两个阶段,首先是标记所有存活的对象,然后遍历整个堆,回收未标记的对象。但这种算法容易产生内存碎片,影响后续的大块内存分配效率。

  • 复制(Copying)算法:将内存划分为两部分,每次只使用其中一部分。当这部分满了之后,把存活的对象复制到另一部分,然后清空当前部分。虽然没有内存碎片的问题,但是需要双倍的内存空间。

  • 标记-整理(Mark-Compact)算法:结合了前两种算法的优点,先标记所有存活的对象,再将它们移动到堆的一端,最后清理掉剩余的空间。这种方式既可以避免内存碎片,也不需要额外的内存开销。

  • 分代收集(Generational Collection)算法:基于对象的存活时间特性,将堆内存分为年轻代(Young Generation)、老年代(Old Generation)以及永久代(Permanent Generation,在JDK 8及以后版本中由元空间替代)。年轻代的对象存活期短且频繁发生GC,适合采用快速的复制算法;而老年代的对象存活期长,更适合用标记-清除或标记-整理算法。

JVM中的垃圾收集器

针对上述算法,JVM提供了多种垃圾收集器供用户选择,以满足不同类型的业务需求。例如:

  • Serial收集器:单线程工作,适用于小型应用或客户端环境。

  • ParNew收集器:多线程并行执行,适合与CMS收集器配合使用,减少停顿时间。

  • Parallel Scavenge/Parallel Old收集器:专注于高吞吐量的应用场景。

  • CMS(Concurrent Mark Sweep)收集器:旨在最小化停顿时间,适合对响应速度敏感的应用。

  • G1(Garbage-First)收集器:分区收集器,优先处理垃圾最多的区域,适用于大内存、多处理器服务器环境。

  • ZGC(Z Garbage Collector)收集器:极低延迟的垃圾收集器,支持超大堆内存。

相关推荐
流星52112213 小时前
GC 如何判断对象该回收?从可达性分析到回收时机的关键逻辑
java·jvm·笔记·学习·算法
JanelSirry13 小时前
我的应用 Full GC 频繁,怎么优化?
jvm
JH307313 小时前
jvm,tomcat,spring的bean容器,三者的关系
jvm·spring·tomcat
DKPT17 小时前
JVM直接内存和堆内存比例如何设置?
java·jvm·笔记·学习·spring
siriuuus17 小时前
JVM 垃圾收集器相关知识总结
java·jvm
小满、20 小时前
什么是栈?深入理解 JVM 中的栈结构
java·jvm·1024程序员节
百花~1 天前
JVM(Java虚拟机)~
java·开发语言·jvm
每天进步一点点dlb1 天前
JVM中的垃圾回收算法和垃圾回收器
jvm·算法
漫漫不慢.2 天前
蓝桥杯-16955 岁月流转
java·jvm·蓝桥杯
boy快快长大2 天前
【JVM】线上JVM堆内存报警,占用超90%
jvm