JVM--垃圾回收机制

news/2024/12/18 23:52:05/

垃圾回收机制(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)收集器:极低延迟的垃圾收集器,支持超大堆内存。


http://www.ppmy.cn/news/1556235.html

相关文章

JS进阶-面向对象-搭建网站-HTML与JS交互

JS进阶 文章目录 JS进阶大纲作用域和闭包作用域块级作用域语句作用域全局作用域 闭包调用闭包的方法全局变量返回值 面向对象实例化构造函数添加对象的成员prototypeproto和prototype理解原型和实例 对象原型的误解原型链this指向浏览器环境Node JS环境 JS逆向常见方法call和ap…

.NET 技术系列 | 通过CreatePipe函数创建管道

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

【前端面试】list转树、拍平, 指标,

这个题目涉及的是将一组具有父子关系的扁平数据转换为树形结构,通常称为“树形结构的构建”问题。类似的题目包括: 1. 组织架构转换 给定一个公司的员工列表,每个员工有 id 和 managerId,其中 managerId 表示该员工的上级。任务…

MSSQL AlwaysOn 可用性组(Availability Group)中的所有副本均不健康排查步骤和解决方法

当遇到 MSSQL AlwaysOn 可用性组(Availability Group)中的所有副本均不健康的情况时(MSSQL AG 副本名称: All replicas unhealthy),这通常意味着可用性组无法正常工作,数据同步和故障转移功能可能受到影响。以下是一些可能的原因及相应的排查步骤和解决方法: 1. 检查副本…

数据版本管理和迁移工具Flyway用法最简说明

简介 数据库迁移及版本控制工具, 用于维护不同环境下数据库的一致性 使用 引入依赖 implementation(“org.flywaydb:flyway-core:7.1.1”) 配置 spring:flyway:enabled: truelocations: classpath:sqlbaseline-on-migrate: trueclean-disabled: trueenabled: true # 开启Fl…

Java——网络编程(下)

(UDP通讯的实现) 1 UDP通信介绍 (面向无链接的一个传输协议——>不会创建连接——>效率高) (发送数据要经行封包操作——>使用DatagramPacket类——>底层是UDP) (DatagramPacket——>数据封包——>发送数据和接收数据都要去包装对象!&#xf…

Cisco Packet Tarcer配置计网实验笔记

文章目录 概要整体架构流程网络设备互连基础拓扑图拓扑说明配置步骤 RIP/OSPF混合路由拓扑图拓扑说明配置步骤 BGP协议拓扑图拓扑说明配置步骤 ACL访问控制拓扑图拓扑说明配置步骤 HSRP冗余网关拓扑图拓扑说明配置步骤 小结 概要 一些环境配置笔记 整体架构流程 网络设备互连…

力扣-图论-10【算法学习day.60】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…