【JVM】JVM垃圾收集器

文章目录

  • 什么是JVM垃圾收集器
  • 四种垃圾收集器(按类型分)
    • 1.串行垃圾收集器(效率低)
    • 2.并行垃圾收集器(JDK8默认使用此垃圾回收器)
    • 3.CMS(并发)垃圾收集器(只针对老年代垃圾回收的)
    • 4.G1垃圾回收器(在JDK9之后默认使用G1)
      • 第一阶段----->Young Collection(年轻代垃圾回收)
      • Young Collection + Concurrent Mark (年轻代垃圾回收+并发标记)
      • 第三阶段----->Mixed Collection (混合垃圾回收,新老都参与)
    • G1和CMS区别

什么是JVM垃圾收集器

垃圾收集器是负责执行垃圾回收的组件,它们用于管理Java程序运行时的内存分配和释放。垃圾收集器的主要任务是自动回收不再使用的内存对象,并将内存空间重新回收以供程序继续使用。

四种垃圾收集器(按类型分)

1.串行垃圾收集器(效率低)

Serial和Serial Old串行垃圾收集器,是指使用单线程进行垃圾回收,堆内存较小,适合个人电脑

  • Serial 作用于新生代,采用复制算法
  • Serial Old 作用于老年代,采用标记-整理算法

垃圾回收时,只有一个线程在工作,并且java应用中的所有线程都要暂停(STW),等待垃圾回收的完成。

在这里插入图片描述

2.并行垃圾收集器(JDK8默认使用此垃圾回收器)

Parallel New和Parallel Old是一个并行垃圾回收器,JDK8默认使用此垃圾回收器

  • Parallel New作用于新生代,采用复制算法
  • Parallel Old作用于老年代,采用标记-整理算法

垃圾回收时,多个线程在工作,并且java应用中的所有线程都要暂停(STW),等待垃圾回收的完成。(通过并行执行垃圾回收以提高性能)

相比较与串行垃圾收集器,并行垃圾收集器无非就是多开写线程来做垃圾回收,其实同样也要暂停所有正在执行的线程,只不过在多个线程并行回收效率比串行高

在这里插入图片描述

3.CMS(并发)垃圾收集器(只针对老年代垃圾回收的)

CMS全称 Concurrent Mark Sweep,是一款并发的、使用标记-清除算法的垃圾回收器,该回收器是针对老年代垃圾回收的,是一款以获取最短回收停顿时间为目标的收集器,停顿时间短用户体验就好

最大特点是在进行垃圾回收时,应用仍然能正常运行。
在这里插入图片描述

4.G1垃圾回收器(在JDK9之后默认使用G1)

G1垃圾收集器的设计目标是在可控的停顿时间实现高吞吐量的垃圾回收。

在这里插入图片描述
在这里插入图片描述

  • 应用于新生代老年代
  • 划分成多个区域每个区域都可以充当 eden,survivor,old, humongous,其中 humongous 专为大对象准备
  • 采用标记整理算法

因为基本上G1主要针对大型堆内存进行垃圾回收,而复制算法在大型堆内存上的应用存在一些挑战和限制。(必须考虑内存空间使用率)

  • 响应时间与吞吐量兼顾

  • 分成三个阶段:新生代回收、并发标记、混合收集(在不同的条件下被触发)
    在这里插入图片描述

  • 如果并发失败(即回收速度赶不上创建新对象速度),会触发 Full GC(尽量避免)

如果对象内存分配速度过快,mixed gc来不及回收,导致老年代被填满,就会触发一次full gc,G1的full gc算法就是单线程执行的serial old gc,会导致异常长时间的暂停时间,需要进行不断的调优,尽可能的避免full gc.

第一阶段----->Young Collection(年轻代垃圾回收)

  • 初始时,所有区域都处于空闲状态

在这里插入图片描述

  • 创建了一些对象,挑出一些空闲区域作为eden区存储这些对象
    在这里插入图片描述
  • 当伊甸园需要垃圾回收时,挑出一个空闲区域作为幸存区(s),用复制算法复制存活对象需要暂停用户线程
    在这里插入图片描述
  • 随着时间流逝,eden区的内存又有不足 将eden区以及之前幸存区中的存活对象,采用复制算法,复制到新的幸存区,其中较老对象晋升至老年代(o)

XX:MaxTenuringThreshold(默认15),计算出一个恰当的任期阈值,凡是超过任期阈值的对象都会被晋升到老年代。
或者幸存区里有大对象,也会直接晋升到老年代(毕竟大对象,复制来复制去影响整体效率)

在这里插入图片描述

Young Collection + Concurrent Mark (年轻代垃圾回收+并发标记)

老年代占用内存超过阈值(默认是45%)后,触发并发标记这时无需暂停用户线程
在这里插入图片描述
并发标记之后,会有重新标记阶段解决漏标问题此时需要暂停用户线程。
这些都完成后就知道了老年代有哪些存活对象,随后进入混合收集阶段。此时不会对所有老年代区域进行回收,而是根据停顿时间目标优先回收价值高(存活对象少)的区域(这也是 Gabage First 名称的由来)。

注意,这个阶段只是做标记,根据重新标记停顿时间来判断哪些老年代里面或的对象少,下一阶段优先对这些回收价值高的老年代来回收
在这里插入图片描述

第三阶段----->Mixed Collection (混合垃圾回收,新老都参与)

混合收集阶段中,参与复制的有 eden、survivor、old

在这里插入图片描述
复制完成,内存得到释放。进入下一轮的新生代回收、并发标记、混合收集

G1和CMS区别

在这里插入图片描述

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

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

相关文章

设计模式之七:适配器模式与外观模式

面向对象适配器将一个接口转换成另一个接口,以符合客户的期望。 // 用火鸡来冒充一下鸭子class Duck { public:virtual void quack() 0;virtual void fly() 0; };class Turkey { public:virtual void gobble() 0;virtual void fly() 0; };class TurkeyAdapter :…

Linux 1.2.13 -- IP分片重组源码分析

Linux 1.2.13 -- IP分片重组源码分析 引言为什么需要分片传输层是否存在分段操作IP分片重组源码分析ip_createip_findip_frag_createip_doneip_glueip_freeip_expireip_defragip_rcv 总结 本文源码解析参考: 深入理解TCP/IP协议的实现之ip分片重组 – 基于linux1.2.13 计网理论…

树莓派RP2040 用Arduino IDE安装和编译

目录 1 Arduino IDE 1.1 IDE下载 1.2 安装 arduino mbed os rp2040 boards 2 编程-烧录固件 2.1 打开点灯示例程序 2.2 选择Raspberry Pi Pico开发板 2.3 编译程序 2.4 烧录程序 2.4.1 Raspberry Pi Pico开发板首次烧录提示失败 2.4.2 解决首次下载失败问题 2.4.2.1…

无涯教程-Perl - recv函数

描述 This function receives a message on SOCKET attempting to read LENGTH bytes, placing the data read into variable SCALAR.The FLAGS argument takes the same values as the recvfrom( ) system function, on which the function is based. When communicating wit…

论文浅尝 | 面向多步推理任务专业化较小语言模型

笔记整理:张沈昱,东南大学硕士,研究方向为自然语言处理 链接:https://github.com/FranxYao/FlanT5-CoT-Specialization 动机 本文的动机是探索如何在多步推理任务中通过大型语言模型提升较小的语言模型的性能。作者认为&#xff0…

云开发超多功能工具箱组合微信小程序源码/附带流量主

介绍: 这是一款云开发超多功能工具箱组合微信小程序源码附带流量主功能,小程序内包含了40余个功能,堪称全能工具箱了,大致功能如下: 证件照制作 | 垃圾分类查询 | 个性签名制作 二维码生成丨文字九宫格 | 手持弹幕丨…

使用GraphQL在Postman中进行API测试

GraphQL 是一种用于API的开源数据查询和操作语言,用于API的查询语言和运行时。它使客户端能够精确地指定其数据需求,并获得预测性地结果。GraphQL旨在提高API的效率、灵活性和可靠性。 Postman 是一款用于API开发的强大工具,它支持REST和Gra…

LVS简介及LVS-DR搭建

目录 一. LVS简介: 1.简介 2. LVS工作模式: 3. LVS调度算法: 4. LVS-DR集群介绍: 二.LVS-DR搭建 1.RS配置 1)两台RS,需要下载好httpd软件并准备好配置文件 2)添加虚拟IP(vip&…

Python爬虫——requests_cookie登陆古诗文网

寻找登陆需要的参数 __VIEWSTATE:aiMG0UXAfCzak10C7436ZC/RXoZbM2lDlX1iU/4wjjdUNsW8QUs6W2/3M6XIKagQZrC7ooD8Upj8uCnpQMXjDAp6fS/NM2nGhnKO0KOSXfT3jGHhJAOBouMI3QnlpJCQKPXfVDJPYwh169MGLFC6trY __VIEWSTATEGENERATOR: C93BE1AE from: http://so.gushiwen.cn/user/collect.…

linux 命令--查看网络端口命令

使用 netstat 检查端口 netstat 是一个命令行工具,可以提供有关网络连接的信息。 netstat - atulnp会显示所有端口和所有对应的程序,用grep管道可以过滤出想要的字段 -a :all,表示列出所有的连接,服务监听&#xff…

Android JNI开发从0到1,java调C,C调Java,保姆级教程详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 第一步首先配置Android studio的NDK开发环境,首先在Android studio中下载NDK…

ASIC芯片设计全流程项目实战课重磅上线 ,支持 65nm制程流片 !

全流程项目实战课学什么? 此次推出【 ASIC芯片设计全流程项目实战课】,基于IPA图像处理加速器,以企业级真实ASIC项目为案例,学员可参与全流程项目实践,以及65nm真实流片! 众所周知,放眼整个IC硕…

【Linux】【驱动】驱动框架以及挂载驱动

【Linux】【驱动】驱动框架以及挂载驱动 绪论1.配置开发环境2. 编写驱动文件3. 编译Makefile文件4.编译5. 挂载驱动注意:有些开发板打开了或者禁止了printk信息,导致你看到的实验现象可能不一样,此时已经将文件移动到了开发板中,开发板查看文…

WebRTC音视频通话-新增或修改SDP中的码率Bitrate限制

WebRTC音视频通话-新增或修改SDP中的码率Bitrate限制参数 之前搭建ossrs服务,可以查看:https://blog.csdn.net/gloryFlow/article/details/132257196 之前实现iOS端调用ossrs音视频通话,可以查看:https://blog.csdn.net/gloryFlo…

连接不上手机,adb devices为空:

首先说明一下,我是已经安装了android studio,也配置了环境变量,但是还是连接不上手机 解决方案: 1.打开开发者模式 https://product.pconline.com.cn/itbk/sjtx/sjwt/1424/14246015.html 2.开启usb调试 https://baiyunju.cc/10770 最后成功…

什么是CSS的box-sizing属性?它有哪些取值,各有什么不同?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS的box-sizing属性⭐ 取值⭐ 不同之处⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web…

关于Vue构建低代码平台的思考

一、前言 在项目实战开发中,尤其是大平台系统的搭建,针对不同业务场景,需要为用户多次编写用于录入、修改、展示操作的相应表单页面。一旦表单需求过多,对于开发人员来说,算是一种重复开发,甚至是繁杂的工作…

【C++起飞之路】初级—— auto、范围for循环、宏函数和内联函数

auto、范围for、内联函数、宏函数和nullptr 一、auto — 类型推导的魔法(C 11)1、auto 是什么?2、工作原理3、优势4、限制和注意事项 二、范围for (C11)1、基本语法2、优势3、工作原理4、注意事项5、C11: 范围 for 循环的扩展: 三…

软件测试基础篇——LAMP环境搭建

LAMP 1、Linux系统的其他命令 find命令:在目录下查找文件 ​ 格式一:find 路径 参数 文件名 ​ 路径:如果没有指定路径,默认是在当前目录下 ​ 参数:-name 根据文件名来查找,区分大小写; -…

适配器模式(C++)

定义 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 应用场景 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象 ”放在新的环境中应用,但是新环境要求…