【Java基础】垃圾回收器

前言

Java的垃圾回收器是JVM的一个重要组件,通过自动管理内存,负责回收不再被程序使用的对象所占用的内存空间,从而减轻程序员手动管理内存的负担,避免诸如内存泄漏和悬空指针等问题。
本文旨在探索Java的垃圾回收器基本原理,有哪些,具体有什么作用?

一、垃圾回收器的基本原理

  • 可达性分析算法:垃圾回收器使用可达性分析算法来确定哪些对象是 “垃圾”,可以被回收。该算法以 “GC Roots” 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。如果一个对象到 GC Roots 没有任何引用链相连,那么就认为这个对象是不可达的,即可以被回收。GC Roots 通常包括:
    • 虚拟机栈(栈帧中的本地变量表)中引用的对象。
    • 方法区中类静态属性引用的对象。
    • 方法区中常量引用的对象。
    • 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象。

二、垃圾回收器的种类

垃圾回收器有多个种类,下文主要介绍两种常用的回收器:CMS(Concurrent Mark Sweep)收集器、G1(Garbage - First)收集器

  • CMS(Concurrent Mark Sweep)收集器:以获取最短回收停顿时间为目标的收集器,在垃圾回收过程中尽量减少应用程序的停顿时间。采用 “标记 - 清除” 算法,分为初始标记、并发标记、重新标记、并发清除四个阶段。初始标记和重新标记阶段会暂停所有工作线程,但时间较短,并发标记和并发清除阶段可以与应用程序线程并发执行。然而,CMS 收集器会产生内存碎片,可能导致在分配大对象时由于无法找到连续内存空间而提前触发 Full GC。可以通过 -XX:+UseConcMarkSweepGC 参数启用。
  • G1(Garbage - First)收集器:面向服务端应用的垃圾收集器,能充分利用多 CPU、多核环境。它将堆内存划分为多个大小相等的独立区域(Region),在回收过程中,它优先回收垃圾最多的 Region(这也是 G1 名称的由来)。G1 收集器可以预测停顿时间,通过参数 -XX:MaxGCPauseMillis 可以指定最大停顿时间。它结合了 “标记 - 整理” 和 “标记 - 清除” 算法,避免了内存碎片问题。

三、垃圾回收的算法有哪些?

Java 中常见的垃圾回收算法包括标记 - 清除算法、标记 - 整理算法、复制算法和分代收集算法。
标记 - 清除算法:垃圾回收器从 GC Roots 开始遍历,标记所有可达对象。清除不可达对象的内存。
标记 - 整理算法:从 GC Roots 开始标记所有可达对象。将所有可达对象向内存空间的一端移动,然后直接清理掉边界以外的内存,使得回收后的内存空间是连续的。
复制算法:将内存空间划分为大小相等的两块,每次只使用其中一块。当这一块内存使用完后,触发垃圾回收,将存活的对象复制到另一块空闲内存中,然后将使用过的那一块内存一次性清理掉。
分代收集算法: 基于对象的存活周期不同将堆内存分为不同的代,如新生代、老年代。针对不同代的特点采用不同的垃圾回收算法。一般来说,新生代对象存活率低,采用复制算法;老年代对象存活率高,采用标记 - 清除算法或标记 - 整理算法。

四、新生代、老年代和Full GC之间的联系?

新生代存放新创建的对象,对象存活率低;老年代存放经过多次垃圾回收后仍然存活的对象;永久代(元空间)存放类信息、常量、静态变量等。
Full GC: 对整个堆(包括新生代、老年代和永久代 / 元空间)进行的垃圾回收,会导致应用程序长时间停顿,应尽量减少 Full GC 的发生频率。

posted @   Yundan  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示