JVM-垃圾收集算法

前言

在 Java 中,垃圾收集(Garbage Collection)是一种自动管理内存的机制,它负责在运行时识别和释放不再被程序使用的内存,从而避免内存泄漏和悬空引用问题。本篇文章将介绍三种常见的垃圾收集算法。

标记-清除(Mark-Sweep)算法

"标记-清除"(Mark-Sweep)算法是最早出现也是最基础的垃圾收集算法是,在1960年由Lisp之父

John McCarthy所提出。如它的名字一样,算法分为"标记"和"清除"两个阶段:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程。

具体收集过程如下:

优点:算法比较简单,实现起来比较容易

缺点:

  1. 执行效率不稳定,如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低;
  2. 内存空间的碎片化问题,标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

标记-复制算法

标记-复制算法常被简称为复制算法。为了解决标记-清除算法面对大量可回收对象时执行效率低

的问题,1969年Fenichel提出了一种称为"半区复制"(Semispace Copying)的垃圾收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

具体收集过程如下:

优点:

  1. 实现简单,运行高效
  2. 没有碎片化的问题

缺点:内存缩小为了以前的一半,空间浪费严重

标记-整理(Mark-Compact)算法

针对老年代对象的存亡特征,1974年Edward Lueders提出了另外一种有针对性的"标记-整理"(Mark-Compact)算法,其中的标记过程仍然与"标记-清除"算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内

存。因此收集过程如下:

标记-整理算法结合了标记-清除算法和复制算法的优点,这种算法可以减少内存碎片,但需要移动对象,可能会影响程序的执行性能。

相关推荐
ArturiaZ1 分钟前
【day27】
算法
一 乐4 分钟前
健身房预约|基于java+ vue健身房预约小程序系统(源码+数据库+文档)
java·vue.js·spring boot·小程序·论文·毕设·健身房预约小程序
望舒51318 分钟前
代码随想录day32,动态规划part1
java·算法·leetcode·动态规划
楠秋92020 分钟前
代码随想录算法训练营第三十二天| 509. 斐波那契数 、 70. 爬楼梯 、746. 使用最小花费爬楼梯
数据结构·算法·leetcode·动态规划
㓗冽21 分钟前
最大效益(二维数组)-基础题76th + 螺旋方阵(二维数组)-基础题77th + 方块转换(二维数组)-基础题78th
数据结构·算法
Ivanqhz24 分钟前
数据流分析的核心格(Lattice)系统
开发语言·javascript·后端·python·算法·蓝桥杯·rust
麻辣香蝈蝈26 分钟前
【入门】职场如何沟通以及开发一个功能
java
he___H27 分钟前
jvm41-47回
java·开发语言·jvm
琛説28 分钟前
⚡PitchPPT:将PPT导出为高清全图PPT,并控制PPT文件大小在固定MB/GB以内【解析算法原理 · 作者谈】
windows·python·算法·github·powerpoint
骑猪撞地球QAQ29 分钟前
Java在导出excel时中添加图片导出
java·开发语言·excel