JVM虚拟机的垃圾回收器(面试题)

 1.什么是垃圾回收

        垃圾回收主要说的是java会自动把程序在运行过程中产生的一些没有用的对象给回收掉,这样可以避免内存的浪费。

        java主要是通过一个叫“根可达”的算法来识别这个对象是否可以被回收的,然后回收的算法也主要有三种:标记清除,拷贝,标记压缩。
        标记清除:在内存里面,找到可以回收的对象,然后直接删除,但是这样会导致内存碎片化。
        拷贝:就是在内存使用的时候,只使用一半的内存,比如说有一块内存,分成两半,分别是A,B。一开始B内存是没有使用的,然后在A内存里面找到有用的对象,直接拷贝到b内存里面去,完事之后,直接把A内存里面的数据给删掉。这样的效率比较高,但是浪费内存空间。
        标记压缩:在内存里面,先把没有用的对象给回收掉,然后重新把有用的对象进行排序,这样内存里面的对象是有序的。但是他的效率比较低。

2.GC算法

        1. 在这个三种回收算法的基础上,出现了十几种垃圾回收器。

        2. GC的演化过程:主要随着内存的不断增长,而陆续出现新的垃圾回收器。

        3. 在java1.8里面主要是分代算法,分代算法可以说是由拷贝算法演变而来,分代算法的jvm垃圾回收器有6个,分代算法里面有新生代和老年代,新生代有伊甸园区和幸存者区,其中幸存者区有两个区域,他们之间的默认比例是8比1比1

     
 
        4.首先新创建的对象会在伊甸园区,等这个区的容量满了之后,进行垃圾回收,会把存活的对象放到幸存者1区,然后直接清空伊甸园区,当第二次进行垃圾回收的时候,会把伊甸园区里面存活的对象跟幸存者1区的对象直接放到幸存者2区,并且同时清除伊甸园区跟幸存者1区,第三次垃圾回收的时候,会把伊甸园区里面存活的对象跟幸存者2区的对象直接放到1区,然后进行清空操作,在进行垃圾回收的时候会重复这个操作,然后满足一定条件的对象,会被转移到老年代里面

3.遇到的问题

        以上这个是最简单的垃圾回收的流程,但是有一个问题,那就是在早期回收垃圾的时候,业务线程是会暂停的,回收垃圾的线程在运行(进行垃圾回收),也就是说,在回收垃圾的过程中,很多线程都是暂停的,那这样的话,应用的响应时间就会变慢。

        举个例子:有用户在下单的时候,应用的运行内存满了,jvm进行垃圾回收,那用户下单时候就会被卡住,所以这个响应时间就会变慢(在系统里面,比较重要的两点,第一个是吞吐量,第二个是响应时间,一般我们在开发里面,进行的JVM调优一般都是调优响应时间)

        而且当内存比较大的时候,一个线程进行垃圾回收会比较慢(可以理解为你一个人收拾100平米的房子,会很吃力),所以后面就演变出了多线程来进行垃圾回收,但是这个多线程也不是越多越好,因为会涉及到cpu的上下文切换,还有就是当你的电脑是四核,那你设置5个线程,那这个时候的效果就不是很好,所以就出现的了CMS回收器

4.CMS回收器跟三色算法

        CMS回收器(并发垃圾回收):举个例子,早期的垃圾回收器是业务线程执行,要回收垃圾的时候,垃圾回收线程执行,业务线程暂停。那这个CMS就是垃圾回收线程一起参与你的业务,如果产生垃圾,也不用你的线程暂停,直接就把垃圾回收掉。

        但是CMS垃圾回收器有一个问题,那就是回收线程在标记了某一个对象是否为垃圾之后,由于cpu的上下文切换导致了回收线程暂停了,那么回收线程重新运行之后,如何判断标记的对象的状态是否改变。因为有可能不是垃圾的对象,在回收线程暂停的过程中,变成了垃圾,那么为了解决这个问题,就有了三色标记算法。

        三色标记算法:三色表示的是对象的三个状态属性有白,黑,灰三种颜色(白色表示:还没有被垃圾回收器扫描的对象,黑色表示:对象本身和对象的成员变量都已经被扫描了,灰色表示:对象本身已经被扫描,但是成员变量还没扫描完),这个算法主要是用来标记活动跟要回收的对象,可以让jvm不发生或者在remark阶段发生一次stw,在清除的时候,是清除白色标记的对象。

        在CMS跟G1回收器里面,都用到了这个三色标记法,但是使用三色标记法会有一个漏标的问题,CMS跟G1的处理方法都不一样。

        CMS是通过写屏障的方法,就是当已经标记了黑色的对象,当他有某个成员变量指向了白色标记对象引用的时候,把这个黑色标记变成灰色标记,但这样还是有一个并发标记,产生漏标的问题,这个算得上是一个比较隐蔽的bug,但是造成问题也是比较严重的。

        举个例子:在回收线程标记A对象的时候,A对象指向B对象,B对象指向C对象,其中A对象还有两个成员变量A1,A2,在回收线程扫描完了A对象的A1,还没来得及扫描A2的时候,回收线程暂停了,然后在业务层面,B对象指向了null,然后A1指向了D对象,那这个时候,通过写屏障,会把A对象的标记变成灰色,然后回收线程继续运行,开始扫描完A2,完事之后会把A标记成了黑色,那这个时候,D对象就没办法被标记,所以D对象会被清除,为了解决这个问题,CMS在最后的remark阶段,必须从头扫描一遍,那这个时候就会产生stw

        G1使用了SATB来解决这个漏标的问题,就是灰色标记的对象指向白色标记的对象,当这个指向的关系消失的时候,进行一个快照,把白色标记的对象放到GC的堆栈里面,然后在堆栈里面查询,如果有对象引用了这个白色标记的对象,那就把这个白色标记的对象标记成灰色

        还有就是在java里面有四种引用类型,强引用:在代码里面直接new出来的对象属于一个强引用,如果一个对象具有强引用,JVM就没有办法对它进行回收,当内存空间不够的时候就会报OOM错误,软引用:如果一个对象只具备软引用,那么当内存空间不够的时候,JVM就会把这个对象进行回收,弱引用:如果一个对象只具备了弱引用,那么被jvm的gc线程检测到了,这个对象就会被回收

        建议:在jdk1.8以后,把CMS升级为G1回收器 ,G1解决了CMS的stw问题

5.推荐视频

2.自动化回收_哔哩哔哩_bilibili
强烈推荐看下这个视频,会对底层原理理解得更加透彻

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 教程 02:Python 编程环境的搭建与 IDE 的选择

目录 一、搭建 Python 环境 1.1 Python 官网 1.2 下载 Python 1.2.1 选择版本 1.2.2 选择平台 1.2.3 下载安装文件(Windows & macOS) 1.3 安装环境 1.3.1 Windows 平台 1.3.2 macOS 平台 1.3.3 Linux 平台 1.4 验证安装是否成功 二、选择…

Flink自定义Source模拟数据流

maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

瓢虫目标检测数据集VOC格式400张

瓢虫&#xff0c;一种小巧玲珑、色彩鲜艳的昆虫&#xff0c;因其独特的形态和生态习性而受到广泛欢迎。 瓢虫的体型小巧&#xff0c;一般为圆球形&#xff0c;体色鲜艳&#xff0c;有红、黄、黑等多种颜色。它们通常有一个坚硬的外壳&#xff0c;可以保护自己不受天敌的侵害。…

12月笔记

#pragma once 防止多次引用头文件&#xff0c;保证同一个&#xff08;物理意义上&#xff09;文件被多次包含&#xff0c;内容相同的两个文件同样会被包含。 头文件.h与无.h的文件&#xff1a; iostream是C的头文件&#xff0c;iostream.h是C的头文件&#xff0c;即标准的C头文…

前端--基础 常用标签 - 超链接标签 ( 内部链接,空链接,下载链接,网页元素连接)

链接分类 &#xff1a; 外部链接 内部链接 空链接 下载链接 网页元素链接 内部链接 &#xff1a; 即 网站内部页面之间的相互链接&#xff0c;直接点击 链接内部页面名称即可 所谓内部链接&#xff0c;就是在同一个网站里面&#xff0c;有许多链接&#xff0c;当你在 a…

机器学习笔记 - 用于语义图像分割的空洞卷积DeepLabv3

一、什么是DeepLabv3&#xff1f; DeepLabv3 是用于语义分割任务的深度神经网络 (DNN) 架构。虽然不是比较新的网络模型&#xff0c;但是也是分割模型里的杰出代表之一&#xff0c;所以还是值得深入了解。 它使用Atrous&#xff08;Dilated&#xff09;卷积来控制感受野和特征图…

房贷计算器,妥妥的数学计算

根据给出的公式&#xff0c;编写房贷计算器。妥妥的数学计算&#xff0c;把数学公式“翻译”成代码就好。 (笔记模板由python脚本于2024年01月06日 18:08:55创建&#xff0c;本篇笔记适合初具基本编程能力的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;http…

服务器GPU温度过高挂掉排查记录

服务器GPU挂掉 跑深度学习的代码的时候发现中断了。通过命令查看&#xff1a; nvidia-smi显示 Unable to determine the device handle for GPU 0000:01:00.0: Unknown Error。感觉很莫名其妙。通过重启大法之后&#xff0c;又能用一段时间。 shutdown -r now但是过了一个小…

遗传算法(GA)、模拟退火算法(SAA)、蚁群算法(ACO)、粒子群算法(PSO)优缺点汇总

遗传算法 优点&#xff1a; 与问题领域无关且快速随机的搜索能力&#xff0c;不会陷入局部最优解&#xff1b;搜索从群体出发&#xff0c;具有潜在的并行性&#xff0c;提高运行速度&#xff0c;鲁棒性高&#xff1b;搜索使用评价函数启发&#xff0c;过程简单&#xff1b;使…

基于Java实现全功能电子商城

&#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩项目推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 基于SpringBoot的旅游网站 基于SpringBoot的MusiQ音乐网站 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及…

小游戏实战丨基于PyGame的俄罗斯方块小游戏

文章目录 写在前面PyGame五子棋注意事项系列文章写在后面 写在前面 本期内容&#xff1a;基于pygame的俄罗斯方块小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700182 实验环境 python3.11及以上pycharmtkinter PyGame Pygame是一个非常…

Java设计模式-模板方法模式

目录 一、豆浆制作问题 二、模板方法模式基本介绍 三、原理类图 四、模板方法模式解决豆浆制作问题 五、模板方法模式的钩子方法 六、模板方法模式在Spring框架应用的源码分析 七、注意事项和细节 一、豆浆制作问题 编写制作豆浆的程序&#xff0c;说明如下 : 1) 制作…

案例098:基于微信小程序的电子购物系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

【大数据进阶第三阶段之Datax学习笔记】使用阿里云开源离线同步工具DataX 实现数据同步

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax快速入门 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax类图 【大数据进阶第三阶段之Datax学习笔记】使用…

RH850P1X芯片学习笔记-A/D Converter (ADCF)

文章目录 Features of RH850/P1x-C ADCFNumber of UnitsRegister Base AddressClock SupplyInterrupts and DMAHardware ResetExternal Input/Output SignalsVirtual Channel OverviewFunctional OverviewBlock DiagramPhysical Channels, Virtual Channels and Scan Groups Re…

SPRING BOOT发送邮件验证码(Gmail邮箱)

SPRING BOOT邮件发送验证码 一、Gmail邮箱配置 1、进入Gmail(https://mail.google.com) 2、打开谷歌右上角设置 3、启用POP/IMP 4、启用两步验证(https://myaccount.google.com/security) 5、建立应用程式密码 6、复制保存应用程式密码 二、代码 1、引入依赖 <d…

【LMM 012】TinyGPT-V:24G显存训练,8G显存推理的高效多模态大模型

论文标题&#xff1a;TinyGPT-V: Efficient Multimodal Large Language Model via Small Backbones 论文作者&#xff1a;Zhengqing Yuan, Zhaoxu Li, Lichao Sun 作者单位&#xff1a;Anhui Polytechnic University, Nanyang Technological University, Lehigh University 论文…

Window端口占用处理

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

C#编程-实现函数重载

考虑一个示例&#xff1a;您必须编写一个程序来实现计算器的功能。计算器执行各种运算&#xff0c;例如数字的加、减及乘等。可以对任何类型的数据执行这些运算。这是否意味着您必须定义单独的函数名&#xff08;如addInteger、addFloat和addDoublie&#xff09;对每种此类数字…

VMware VCP+VCAP持续通过

稳定通过&#xff0c;安全可靠