JVM -垃圾回收器

本人在这篇文章中讲解了垃圾回收机制,这为前置知识

美团一面面经:Threadlocal(线程局部变量的原理)->内存泄漏问题->垃圾回收机制_threadlocal回收-CSDN博客

首先对前置知识漏洞做一个补充:java的引用类型

  1. 强引用:被仍一GC Roots对象【强引用】的对象,该对象都不会被垃圾回收

     

    User user=new User();

  2. 软引用:仅有软引用该对象时,在垃圾回收后,如果内存仍不足会再次触发垃圾回收
    User user=new User();
    SoftReference softReference =new SoftReference (user)

  3. 弱引用:仅有弱引用该对象时,垃圾回收无论内存是否充足都会回收弱引用对象,需要配合SoftReference(软引用)使用。此时就是ThreadLocal内存泄漏的原因
    User user=new User();
    WeakReference weakReference=new WeakReference(user)

  4. 虚引用:必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方法释放直接内存

JVM 有哪些垃圾回收器?

  1. 串行垃圾收集器
  2. 并行垃圾收集器
  3. CMS(并发)垃圾收集器
  4. G1垃圾收集器

串行垃圾收集器

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

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

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

一个线程进行垃圾回收其他线程阻塞

并行垃圾收集器

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

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

在进行垃圾回收的时候,所有线程都要进行暂停(STW),等待垃圾回收的完成

多个线程同时进行垃圾回收

CMS(并发)垃圾收集器

CMS是使用标记-清除算法的、仅仅针对老年代的垃圾回收器。

1.以最短回收停顿时间为目标的收集器、停顿时间短

2.进行垃圾回收时,应用任然能正常运行

 

1.初始化阶段,指挥标记与GCRoots之间关联的A。(找出GCRoots之间引用的节点)

2.并发标记的时候,会根据引用链路标记B、C、D(根据引用链路标记节点)

3.重新标记阶段,因为初始化阶段和并发标记阶段中其他线程都是可以运行的,所以就会存在漏标记的问题。在此期间,如果X被引用了,那么重新标记会标记X,如果D或者B没有被引用了也会取消对应的标记。(最后检查在此期间是否有其他线程引用了新节点或者取消了新节点的引用)

4.并发清理

G1垃圾回收器

1.应用于新生代和老年代,JDK9的默认回收器

2.划分多个区域,每个区域都可以充当eden区,survivor,old,humongous,其中humongous转为大对象准备

3.采用复制算法

4.并发失败会触发Full GC

5.分为三个阶段:新生代回收、并发标记、混合收集

1.年轻代垃圾回收

  1. 初始时,所有区域都处于空闲状态
  2. 创建了一些对象,跳出一些空闲区域作为伊甸园区存储这些对象
  3. 当伊甸园需要垃圾回收时,跳出一个空闲区域作为幸存区,用复制算法复制存活对象,需要暂停用户线程
  4. 随着时间流逝,伊甸园的内存又有不足
  5. 将伊甸园以及之前心存区中的存活对象,采用复制算法,复制到新的幸存区,其中较老对象晋升至老年代

2.年轻代垃圾回收+并发标记

当老年代占用内存超过阈值(默认45%)后触发并发标记,这是无需暂停用户线程

1.并发标记之后,会有重新标记阶段解决漏标问题,此时需要暂停用户线程

2.这些都完成后就知道了老年代有哪些存活对象,随后进入混合收集阶段。此时不会对所有老年代区域进行回收,而是根据暂停时间目标 优先回收价值高(存活对象少)的区域

混合垃圾回收

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

这次回收中:

1.eden区和s区的垃圾回收都将存活对象放入新的S区中

2.s区中到达阈值的存货对象和old区占用内存超过45%的经过GC后的存货对象放入新的O区中

复制完成,内存得到释放。进入下一轮的新生代回收、并发标记、混合收集

一个对象如果太大了会存入一个巨型对象中,一个区域装不下,会分配连续的区域进行存储

文章部分图片来自互联网收集

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

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

相关文章

open Euler22.03系统安装宝塔面板

环境:华为云open Euler22.03操作系统 配置:2核4G 1、安装宝塔面板。 登录弹性云服务器。 执行以下命令,下载并安装宝塔面板。 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &&…

STM32裸机和RTOS中的线程安全问题及STM32cubeMX中的线程安全策略

STM32线程安全问题 术语“线程” 和“多线程” 适用于裸机和基于RTOS的应用程序,线程安全问题并不只存在于基于RTOS的应用程序中;裸机应用程序中也存在这个问题,在裸机应用程序中,中断服务程序允许调用C库函数。线程安全问题可能…

Python实现水果忍者(开源)

一、整体介绍: 1.1 前言: 游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动,优化并增加了一些功能。作为自己Python阶段学习的结束作品,文章最后有源码链接。 1.2 Python主要知识: (1&#xf…

Python爬虫——爬取某网站的视频

爬取视频 本次爬取,还是运用的是requests方法 首先进入此网站中,选取你想要爬取的视频,进入视频播放页面,按F12,将网络中的名称栏向上拉找到第一个并点击,可以在标头中,找到后续我们想要的一些…

qt-15综合实例(电子时钟)-多态重写鼠标单击和移动事件

综合实例-电子时钟 知识点digiclock.hdigiclock.cppmain.cpp运行图 知识点 setWindowOpacity(0.5);//设置窗体透明度 QTimer* Timer new QTimer(this);//新建一个定时器 connect(Timer,SIGNAL(timeout()),this,SLOT(ShowTime())); Timer->start(1000);//启动定时器 digic…

稚晖君发布5款全能人形机器人,开源创新,全能应用

8月18日,智元机器人举行“智元远征 商用启航” 2024年度新品发布会,智元联合创始人彭志辉主持并发布了“远征”与“灵犀”两大系列共五款商用人形机器人新品——远征A2、远征A2-W、远征A2-Max、灵犀X1及灵犀X1-W,并展示了在机器人动力、感知、…

猫头虎分享:练习提示词Prompt有什么好方法?提高Prompt水平和质量

猫头虎是谁? 大家好,我是 猫头虎,别名猫头虎博主,擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评测图文、产品使用体验图文、产品优点推广文稿、…

深扒大模型微调密码 - 从入门到技术小白都能看懂的神操作

朋友们,你们有没有听说过"大模型"和"微调"这两个概念呢?别着急,我们今天就来好好聊一聊! 想象一下,你有一个非常勤奋的小助理,它会尽最大努力帮你完成各种任务。不过有时候,它的知识储备和能力肯定有限,所以你得适时给它一些专门的…

树莓派5 笔记25:第一次启动与配置树莓派5_8G

今日继续学习树莓派5 8G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下: 今日购得了树莓派5_8G版本,性能是同运…

springboot航班进出港管理系统--论文源码调试讲解

第2章 开发环境与技术 本章节对开发航班进出港管理系统管理系统需要搭建的开发环境,还有航班进出港管理系统管理系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&#xff…

SQL每日一练-0815

今日SQL题难度:🌟☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个产品类别在每个月的总销售额和总销量。找出每个月销售额最高的产品类别,显示类别名称、销售月份、总销售额和总销量。 2、表和虚拟数据 现有两个表:Products 和…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…

[机器学习]--KNN算法(K邻近算法)

KNN (K-Nearest Neihbor,KNN)K近邻是机器学习算法中理论最简单,最好理解的算法,是一个 非常适合入门的算法,拥有如下特性: 思想极度简单,应用数学知识少(近乎为零),对于很多不擅长数学的小伙伴十分友好虽然算法简单,但效果也不错 KNN算法原理 上图是每一个点都是一个肿瘤病例…

Sakana.ai 迈向完全自动化的开放式科学发现

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

从零开始搭建k8s集群详细步骤

声明:本文仅作为个人记录学习k8s过程的笔记。 节点规划: 两台节点为阿里云ECS云服务器,操作系统为centos7.9,master为2v4GB,node为2v2GB,硬盘空间均为40GB。(节点基础配置不低于2V2GB) 主机名节点ip角色部…

Docker最佳实践进阶(一):Dockerfile介绍使用

大家好,上一个系列我们使用docker安装了一系列的基础服务,但在实际开发过程中这样一个个的安装以及繁杂命令不仅仅浪费时间,更是容易遗忘,下面我们进行Docker的进阶教程,帮助我们更快速的部署和演示项目。 一、什么是…

力扣面试经典算法150题:找出字符串中第一个匹配项的下标

找出字符串中第一个匹配项的下标 今天的题目是力扣面试经典150题中的数组的简单题: 找出字符串中第一个匹配项的下标 题目链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/?envTypestudy-plan-v2&envIdto…

docker compose部署rabbitmq集群,并使用haproxy负载均衡

一、创建rabbitmq的data目录 mkdir data mkdir data/rabbit1 mkdir data/rabbit2 mkdir data/rabbit3 二、创建.erlang.cookie文件(集群cookie用) echo "secretcookie" > .erlang.cookie 三、创建haproxy.cfg配置文件 global log stdout fo…

深度学习基础—正则化

正则化:解决模型过拟合的手段,本质就是减小模型参数取值,从而使模型更简单。常用范数如下: 使用最多的是L2范数正则项,因此加入正则项的损失函数变为: 使用梯度下降法的权重调整公式: 推导后得到…

项目实战:Qt+Opencv相机标定工具v1.3.0(支持打开摄像头、视频文件和网络地址,支持标定过程查看、删除和动态评价误差率,支持追加标定等等)

若该文为原创文章,转载请注明出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/141334834 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、Op…