JVM 垃圾回收

news/2025/4/1 3:32:36/

垃圾回收算法

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

标记-清除算法分为两个阶段。在标记阶段,垃圾收集器会标记所有活动对象;在清除阶段,垃圾收集器会清除所有未标记的对象。标记-清除算法存在的问题是会产生内存碎片,从而影响后续的内存分配。

复制算法(Copying)

复制算法将内存分为两个区域,每次只使用其中一个区域。当一个区域被占满时,垃圾收集器会将所有活动对象复制到另一个区域中,然后清除原区域的所有对象。这种算法可以有效地避免内存碎片的问题,但是需要消耗更多的内存空间。

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

标记-整理算法是在标记-清除算法的基础上进行改进的,它可以避免内存碎片的问题。在标记阶段,垃圾收集器会标记所有活动对象;在整理阶段,垃圾收集器会将所有活动对象移动到内存的一端,然后清除所有未标记的对象。

分代算法(Generational)

分代算法是一种优化算法,它根据对象的生命周期将内存分为不同的代。一般来说,新创建的对象往往比较短命,垃圾收集器会将这些对象放到年轻代中,而长生命周期的对象则会放到老年代中。在垃圾回收时,年轻代采用复制算法,老年代采用标记-整理算法或标记-清除算法。这种算法可以有效地提高垃圾回收的效率。

分区算法(Region-based)

分区算法将内存分为多个区域,每个区域都有自己的垃圾回收器。这种算法可以充分利用多核 CPU 的性能,提高垃圾回收的效率。

引用计数算法

通过为每个对象维护一个引用计数器,记录指向该对象的引用数。当引用计数器为 0 时,该对象可以被清理。
该算法无法处理循环引用的情况,如果对象之间存在相互引用,但没有外部引用指向它们中的任何一个时这些对象无法被销毁。

可达性分析

通过分析对象之间的引用关系,确定哪些对象可以被程序访问,哪些对象已经不再需要并可以被垃圾回收器回收。Java 中使用可达性分析算法来进行垃圾回收,以确保内存被充分利用,同时避免内存泄漏和空间浪费。
可达性分析的过程通常由垃圾回收器自动完成,其基本思路是从一组根对象(如线程栈、静态变量等)开始,递归遍历所有对象,并标记所有可达对象。未标记的对象则被认为是不可达对象,可以被垃圾回收器回收。

垃圾回收器

Serial 垃圾回收器

单线程的垃圾回收器(在多核 CPU 的环境中,如果使用 Serial 垃圾回收器,那么只能使用一个 CPU 核心来执行垃圾回收操作,其他 CPU 核心则处于空闲状态,无法充分利用 CPU 的性能)
使用标记-清除算法进行垃圾回收。
Serial 垃圾回收器适用于内存较小的环境或者只有单个 CPU 核心的环境。

Parallel 垃圾回收器

多线程的垃圾回收器
标记-清除算法进行垃圾回收
适用于多核 CPU 的环境,可以充分利用多核 CPU 的性能。

CMS 垃圾回收器

并发的垃圾回收器,它可以在应用程序运行的同时进行垃圾回收。
适用于对响应时间要求较高的应用程序
可能会产生内存碎片。(由于采用了标记-清除算法,CMS 垃圾回收器无法像复制算法或标记-整理算法那样将内存整理成连续的空间。因此,清除之后,内存中会留下很多不连续的小块空间,这些空间称为内存碎片。)

G1 垃圾回收器(JDK8)

基于分代的垃圾回收器
可以在多核 CPU 的环境下并发执行垃圾回收。
适用于大内存的应用程序
避免内存碎片的问题。

分区:G1 垃圾回收器将整个堆内存分成多个大小相等的区域(Region),每个区域都可以独立地进行垃圾回收操作。这样,在进行垃圾回收时,可以同时并发执行多个区域的垃圾回收操作,从而充分利用多核 CPU 的性能。

并发标记和整理:G1 垃圾回收器采用了一种称为“并发标记和整理(Concurrent Marking and Compacting)”的算法,可以在应用程序运行的同时,对垃圾进行标记和整理。该算法允许垃圾回收器在多个 CPU 核心上并发执行标记和整理操作,从而提高垃圾回收的效率。

ZGC(Z Garbage Collector)垃圾回收器 (JDK 15)

低延迟:ZGC 垃圾回收器可以实现几乎无停顿的垃圾回收,最长的垃圾回收时间不超过几毫秒。这对于对实时性要求较高的应用程序非常重要。

高吞吐量:尽管 ZGC 垃圾回收器的主要目标是低延迟,但它也具有较高的吞吐量,可以处理大量的垃圾数据。

可扩展性:ZGC 垃圾回收器可以处理非常大的堆内存,支持多个 CPU 核心并行执行垃圾回收操作。

分代收集:ZGC 垃圾回收器采用分代收集策略,可以根据对象的生命周期将堆内存分为不同的代,对于不同代采用不同的垃圾回收策略。

内存压缩:ZGC 垃圾回收器可以在垃圾回收过程中对内存进行压缩,从而减少内存的碎片化。

内存碎片

内存碎片会影响后续的内存分配。当应用程序需要分配一块大的连续内存时,由于内存中存在很多小的不连续空间,无法满足分配要求导致内存分配失败。

CMS 垃圾回收器采用 空闲列表(Free List) 机制来维护内存碎片。
空闲列表是一种链表结构,用于记录内存中空闲的小块空间。当应用程序需要分配内存时,CMS 垃圾回收器会遍历空闲列表,找到一块足够大的空间来分配给应用程序。虽然空闲列表可以缓解内存碎片的问题,但是它也会带来额外的开销和复杂性


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

相关文章

【YOLOX】《YOLOX:Exceeding YOLO Series in 2021》

arXiv-2021 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics 6 Conclusion(own) 1 Background and Motivation 2 Related Work 3 Advantages / Contributions 4 Meth…

【BASH】回顾与知识点梳理(二十)

【BASH】回顾与知识点梳理 二十 二十. 十六至十九章知识点总结及练习20.1 总结20.2 练习 该系列目录 --> 【BASH】回顾与知识点梳理(目录) 二十. 十六至十九章知识点总结及练习 20.1 总结 shell script 是利用 shell 的功能所写的一个『程序 (prog…

年之年的选择,组装版

组件&#xff1a;<!--* Author: liuyu liuyuxizhengtech.com* Date: 2023-02-01 16:57:27* LastEditors: wangping wangpingxizhengtech.com* LastEditTime: 2023-06-30 17:25:14* Description: 时间选择年 - 年 --> <template><div class"year-range-pick…

列队 Queue 接口概述

在Java中&#xff0c;Queue&#xff08;队列&#xff09;是一种基本的数据结构&#xff0c;用于按照先进先出&#xff08;FIFO&#xff09;的顺序存储元素。Java提供了多种实现Queue接口的类&#xff0c;以下是几种常见的实现方式&#xff1a; LinkedList&#xff1a;LinkedLis…

【算法训练营】队列 合集(1)

&#x1f4cd;前言 本篇将学习queue的OJ题并学习queue的基础知识。 &#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&a…

有答案:10个网络工程师面试常见问题

目录 1、交换机转发数据包的原理&#xff1f; 2. 数据包如果经过二层交换机转发后&#xff0c;那这个数据包的源MAC会变化吗&#xff1f;如果经过三层交换机理由转发&#xff0c;那源MAC会变成什么呢&#xff1f; 3. 如何查看PC的ARP表&#xff0c;如何清除ARP表&#xff0c…

机器人CPP编程基础-01第一个程序Hello World

很多课程先讲C/C或者一些其他编程课&#xff0c;称之为基础课程。然后到本科高年级进行机器人专业课学习&#xff0c;这样时间损失非常大&#xff0c;效率非常低。 C/单片机/嵌入式/ROS等这些编程基础可以合并到一门课中进行实现&#xff0c;这些素材已经迭代三轮以上&#xf…

代码随想录—力扣算法题:59螺旋矩阵II.Java版(示例代码与导图详解)

版本说明 当前版本号[20230810]。 版本修改说明20230810初版 目录 文章目录 版本说明目录59.螺旋矩阵II思路左闭右开方法左闭右闭方法两种方法的区别总结 59.螺旋矩阵II 力扣题目链接 更多内容可点击此处跳转到代码随想录&#xff0c;看原版文件 给定一个正整数 n&#xf…