【GC 垃圾回收算法和回收器】

作者:ofLJli
链接:https://juejin.cn/post/7003213289425633287?searchId=20240709085629749958B21D886D4E67D4
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


概述

在JVM中主要的结构为:虚拟机栈、堆、方法区。其中虚拟机栈的栈帧在编译器就已经确定大小的,随着方法的结束或线程的技术,虚拟机栈的内存也随着回收。而Java堆和方法区这两个区域则有很显著的不确定性,这部分内存的分配和回收都是动态的,GC所关注的真是这部分内存该如何管理。

本篇文章就以下三方面GC所要完成的三件事:

  • 什么时候回收?(触发GC的条件)
  • 垃圾回收算法
  • 垃圾回收器

什么时候回收

根据两个分代假说:绝大多数的对象都是朝生夕死熬过越多次的GC回收的对象就越难回收。把堆进行了分代:新生代(Eden、From、To)、老年代,在GC时也进行了分代回收。

image.png

Minor GC: 回收新生代的无使用对象,新生代的对象的特性是大多数是朝生夕死的。触发时机有:

  • Eden区空间不足,触发Minor GC 由于Eden空间大小有限,所以Minor GC触发的更加频繁,这就需要收集算法速度快、效率高,一般使用标记-复制算法对这一区域进行回收(后面讲)。

Major GC:回收老年代的无使用对象。一般使用标记-清除算法标记-整理算法进行回收。

Full GC: 回收堆和方法区的无使用对象。Full GC回收范围比较大,执行的时间较长可能会造成卡顿,所以要尽量减少Full GC的次数。触发时机大致有:

  • 老年代的空间不足 由新生代对象的进入老年代、大对象直接进入老年代等,如果在老年代的最大连续空间上无法存放这些对象时,就会进行一次Full GC回收。

  • 方法区的空间不足 方法区主要存储类型信息和常量池,也有空间不足的风险,会进行Full GC回收

  • System.gc()被显示调用会Full GC回收

三种垃圾收集算法:

1. 标记-清除算法

原理:用可达性分析算法将不可用的对象进行标记,然后对无用的对象进行清除。 缺点:在对象很多的情况下,标记的效率低。清除对象之后会产生内存碎片,内存不连续。 作用:在老年代回收中一些收集器会使用此算法

2. 标记-复制算法

原理:将内存空间一分为二,一半用于对象的存放,一半空闲。如果存放对象的区域满了,使用可达性分析算法把存活的对象移动标记出来,然后复制到另一个空的区域,同时把之前的区域全部清空变成空的连续空间。 缺点:如果存活对象很多,要产品大量的内存复制开辟。内存空间只能用一半优点浪费资源。 作用:在新生代朝生夕死的对象中一般用此回收算法。但新生代中对复制算法进行了优化,但这种算法加入了分配担保机制防止存活对象过多分配不了的情况。使用了一种Appel式的回收算法:

image.png

3. 标记-整理算法

原理:标记的过程跟标记-清除算法一样,然后整理存活的对象往一端移动,然后存活边界之外的对象全部清除。 缺点:移动对象有一定的风险。对象太多效率不高 作用:主要作用在老年代。

image.png

垃圾回收器

GC使用的垃圾收集器进行回收,随着不断的发展,垃圾收集器也越来越多,这里列举常规的垃圾收集器并进行分为三类:单线程收集器、多线程收集器、并发收集器。

单线程收集器

单线程的收集器的组合有:Serial/Serial Old收集器。它们不仅仅用一个收集线程去完成收集操作,而且在收集线程工作的时候,用户线程必须停止等待,直到收集完成为止。如图是Serial/Serial Old收集器示意图:

image.png 如果客户端的内存资源受限,处理器核心数较少或单核处理器来说,其简单高效的可以使收集器最快的工作完。

多线程并行收集器

多线程的收集器有:ParNew、Parallel Scavenge、Parallel Old,其中Parallel Scavenge/Parallel Old为组合收集器。这些多线程收集器仅仅是增加了垃圾收集线程,用户线程依然是停止等待垃圾收集的。

image.png

parNew收集器:其实就是Serial的多线程版本,目前能与Serial收集器和CMS收集器合作。

Parallel Scavenge收集器:一般配合Parallel Old收集器使用。相比于parNew收集器,它更加注重是吞吐量的控制,吞吐量就是用户线程执行的时间占总CPU运行的时间,吞吐量当然是越大越好。

多线程一般用服务端,因为多线程的执行,有时间片轮转的消费时间,如果对于单处理器来说无疑处理效率更慢。但对于资源很好,不用与用户交互的分析运算的服务端却可以增加执行效率。

并发收集器

并发收集器有:CMS收集器,是一款以系统停顿的时间尽量较短,用户体验较好为目标的收集器。它的收集线程可以与用户线程并发执行。CMS有三次的标记(初始标记、并发标记、重新标记)和一次清理(并发清理),在三次的标记中有两次标记需要较短用户线程停止,一次较长的与用户线程并发的标记,和与用户线程并发的清除。

image.png

初始标记:标记GC Roots关联的第一个对象,时间很短 并发标记:和用户线程并发执行GC Roots的引用链(可达性分析算法),时间较长 重新标记:重新查找在并发标记阶段,用户线程运行生成的新的引用链。时间比初始标记长一点。 并发清除:用标记-清除算法把无用对象进行清除。

三大缺点:一:CPU敏感,并发对核心数少的处理器对用户线程的运行可能会造成影响。二:浮动垃圾:在并发清理阶段产生的垃圾只能等下一次GC回收。三:内存碎片,标记-清理法会产品大量的不连续的内存空间。

小结

本文从那些内存需要回收什么时候回收如何回收作为执行分别写出了两个对象存活判断算法、Class区回收的条件、回收的分代机制与收集时机、三个收集算法和常用的垃圾收集器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样优化 PostgreSQL 中对 XML 数据的存储和查询?

文章目录 一、数据类型选择二、索引优化三、查询优化四、分区策略五、存储参数调整六、示例代码与解释七、性能测试与监控八、数据清理与压缩九、注意事项 在 PostgreSQL 中处理 XML 数据时,为了实现高效的存储和查询,需要采取一系列的优化策略。以下将详…

【Linux进阶】文件系统3——目录树,挂载

前言 在Windows 系统重新安装之前,你可能会事先考虑,到底系统盘C盘要有多大容量?而数据盘D盘又要给多大容量等,然后实际安装的时候,你会发现其实C盘之前会有个100MB的分区被独立出来,所以实际上你就会有三个…

探索横河AQ6370E系列光谱仪隐藏功能!---高级标记功能!

横河AQ6370E系列光谱仪的这款光谱仪的传统功能中,其实还隐藏了一个特别实用的功能——高级标记功能!前所未有的方式解析数据与测量信号,不仅带来了全新的测试体验,还提升了测量速度,那么这个功能怎么找到呢&#xff0c…

ALG:MODTRAN查找表参数详解(学习笔记4)

一、Modtran安装及环境配置 https://blog.csdn.net/qq_41358707/article/details/134721973 二、ALG配置更新 添加大气RTM。Settings,进入首选项界面,单击RTM选项卡以更新RTM的配置: 从窗口右上角的select RTM弹出菜单中选择一个大气RTM&a…

【数据结构】TreeMap及TreeSet

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 一、概念 TreeMap和TreeSet都是Java中基于红黑树(Red-Black tree)实现的有序集合类。它们分别实现了SortedMap和SortedSet接口,因此提供了按照键(对…

更深入了解汽车与航空电子等安全关键型应用的IP核考量因素

作者:Philipp Jacobsohn,SmartDV高级应用工程师 中国已经连续十多年成为全球第一大汽车产销国,智能化也成为了汽车行业发展的一个重要方向,同时越来越多的制造商正在考虑进入无人机和飞行汽车等低空设备,而所有的这些…

ExcelVBA运用Excel的【条件格式】(三)

ExcelVBA运用Excel的【条件格式】(三)前面知识点回顾1. 访问 FormatConditions 集合 Range.FormatConditions2. 添加条件格式 FormatConditions.Add 方法语法表达式。添加 (类型、 运算符、 Expression1、 Expression2)其中 TextOperator:***&am…

“创新电商营销:‘精选返现‘模式引领购物新风尚“

在电子商务领域的蓬勃发展中,创新营销模式层出不穷,其中“精选返现”模式凭借其创新的互动机制与激励机制,赢得了广大消费者的青睐。该模式通过优化价格策略、融入社交互动及构建梯度回馈体系,有效激发了消费者的购买动力&#xf…

企业应对策略:全面防御.DevicData-P-xxxxxx勒索病毒

引言 在数字化时代,网络安全已成为不可忽视的重要议题。随着互联网的普及,各种网络威胁层出不穷,其中勒索病毒以其独特的攻击方式和巨大的破坏性,给个人用户和企业带来了严重的经济损失和数据安全风险。在众多勒索病毒中&#xff…

昇思25天学习打卡营第11天|基于MindSpore的GPT2文本摘要

数据集 准备nlpcc2017摘要数据,内容为新闻正文及其摘要,总计50000个样本。 数据需要预处理,如下 原始数据格式: article: [CLS] article_context [SEP] summary: [CLS] summary_context [SEP] 预处理后的数据格式: […

Redis安装部署与使用,多实例

一、redis基础 1.1 关系型数据库和NoSQL数据库 数据库主要分为两大类:关系型数据库与 NoSQL 数据库。 关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据。主流的 MySQL、Oracle、MS SQ…

Python爬虫教程第2篇-reqeusts是最好用的网络请求工具

简介 爬虫第一步就是网络请求,一个好用的网络请求库会非常重要。而requests库就是非常好用的一个http库,pyhon中虽然也有内置的urllib库用于网络请求,但是urllib使用起来比较的麻烦,而且缺少很多实用的高级功能,所以这…

Syncthing一款开源去中心化和点对点文件同步工具

Syncthing:一款开源的文件同步工具,去中心化和点对点加密传输,支持多平台,允许用户在多个设备之间安全、灵活地同步和共享文件,无需依赖第三方云服务,特别适合高安全性和自主控制的文件同步场景。 &#x…

使用MySQLInstaller配置MySQL

操作步骤 1.配置High Availability 默认选项Standalone MySQL Server classic MySQL Replication 2.配置Type and Networking ◆端口默认启用TCP/P网络 ◆端口默认为3306 3.配置Account and Roles 设置root账户的密码、添加其他管理员 4.配置Windows Service ◆配置MySQL Serv…

Java线程池及面试题

1.线程池介绍 顾名思义,线程池就是管理一系列线程的资源池,其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息,例如已完成任务的数量。 总结一下使用线程池的好处: 降低资源消耗。通过重复利用已创建的…

xcode项目添加README.md文件并进行编辑

想要给xcode项目添加README.md文件其实还是比较简单的,但是对于不熟悉xcode这个工具的人来讲,还是有些陌生,下面简单给大家讲一下流程。 选择“文件”>“新建”>“文件”,在其他(滚动到工作表底部)下…

Java基础-组件及事件处理(中)

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 BorderLayout布局管理器 说明: 示例: FlowLayout布局管理器 说明: …

【Qt5】入门Qt开发教程,一篇文章就够了(详解含qt源码)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件(二)

文章目录 开发思路发射点添加子弹组件构建子弹处理缩放效果闪光效果 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击(一) 开发思路 整体开发还是基于组件的思维。相比于工厂模式或者状态机,可能有些老套,但是更容易理解和编…

STM32/GD32驱动步进电机芯片TM2160

文章目录 官方概要简单介绍整体架构流程 官方概要 TMC2160是一款带SPI接口的大功率步进电机驱动IC。它具有业界最先进的步进电机驱动器,具有简单的步进/方向接口。采用外部晶体管,可实现高动态、高转矩驱动。基于TRINAMICs先进的spreadCycle和stealthCh…