面试笔记——垃圾回收

news2024/11/23 2:08:16

对象被垃圾回收的时机

垃圾回收主要面向的是堆中的对象。简单一句就是:如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收。
如果要定位什么是垃圾,有两种方式来确定,第一个是引用计数法,第二个是可达性分析算法

引用计数法: 一个对象被引用了一次,在当前的对象头上递增一次引用次数,如果这个对象的引用次数为0,代表这个对象可回收,如图:
在这里插入图片描述
但是,当对象间出现了循环引用的话,引用计数就会失效,如图——当运行完红色框中的代码时,a,b的引用值为2:
在这里插入图片描述
当将a,b设置为null后,栈中的变量a,b不再引用堆中的两个内存,此时对象a,b的引用数量为1(因为对象之间存在循环引用):
在这里插入图片描述
此时,堆中的对象a,b不会再被使用,但由于引用数量不为0,也不会被回收,从而引发内存泄漏。

可达性分析算法
可达性分析算法是指扫描堆中的对象,看是否能够沿着 GC Root 对象 为起点的引用链找到该对象,找不到,表示可以回收。
如图,X,Y这两个节点是可回收的(它们没有和GC Root相关联):
在这里插入图片描述
现在的虚拟机采用的都是通过可达性分析算法来确定哪些内容是垃圾。
可以作为GC Root的对象:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象

JVM垃圾回收算法

垃圾回收算法:

  • 标记清除算法
  • 复制算法
  • 标记整理算法

标记清除算法
标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除。

  1. 根据可达性分析算法得出的垃圾进行标记
  2. 对这些标记为可回收的内容进行垃圾回收

如图:
在这里插入图片描述
优点:标记和清除速度较快
缺点:碎片化较为严重,内存不连贯的

标记整理算法 标记清除算法一样,将存活对象都向内存另一端移动,然后清理边界以外的垃圾,无碎片,对象需要移动,效率低。
在这里插入图片描述
解决了标记清除算法的碎片化的问题,同时,标记压缩算法多了一步,对象移动内存位置的步骤,其效率也有有一定的影响。

复制算法 将原有的内存空间一分为二,每次只用其中的一块,正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收;无碎片,内存使用率低。
在这里插入图片描述
优点:

  • 在垃圾对象多的情况下,效率较高
  • 清理后,内存无碎片

缺点:分配的2块内存空间,在同一个时刻,只能使用一半,内存使用率较低。

JVM的分代回收

在java8时,堆被分为了两份:新生代和老年代【1:2】,如图:
在这里插入图片描述

对于新生代,内部又被分为了三个区域:

  • 伊甸园区Eden,新生的对象都分配到这里
  • 幸存者区survivor(分成from和to, from和to是相对状态)
  • Eden区,from区,to区【8:1:1】

分代回收算法-工作机制:

  1. 新创建的对象,都会先分配到eden区
  2. 当伊甸园内存不足,标记伊甸园与 from(现阶段没有)的存活对象
  3. 将存活对象采用复制算法复制到to中,复制完毕后,伊甸园和 from 内存都得到释放
  4. 经过一段时间后伊甸园的内存又出现不足,标记eden区域to区存活的对象,将其复制到from区
  5. 当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会提前晋升)

如图,假设在Eden区被划分完后的状态如下图所示:
在这里插入图片描述
此时,伊甸园内存不足,标记伊甸园和from区的存活对象(对象A);将存活对象采用复制算法复制到 to 中,复制完毕后,伊甸园和 from 内存都得到释放,同时from和to发生交换,如下图:
在这里插入图片描述
如果,伊甸园再次内存不足:
在这里插入图片描述
重复操作2,3后,此时的内存状态为(复制到to之后,from和to发生交换):
在这里插入图片描述
随后,再次发生内存不足:
在这里插入图片描述
当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会导致提前晋升):
在这里插入图片描述

ps:在看上面的过程的时候,可能对from和to的相关操作有些疑惑(一会儿的是to一会儿又是from的),其实他们只是一个名字而已,实际就是两块内存,我们可以认为,在进行扫描时,内存中带有数据的为from,即将把数据复制到对应的内存为to。

MinorGC、 Mixed GC 、 FullGC的区别:

  • MinorGC【young GC】发生在新生代的垃圾回收,暂停时间短(STW)
  • Mixed GC 新生代 + 老年代部分区域的垃圾回收,G1 收集器特有
  • FullGC: 新生代 + 老年代完整垃圾回收(新生代和老年代内存严重不足时),暂停时间长(STW),应尽力避免

STW(Stop-The-World):暂停所有应用程序线程,等待垃圾回收的完成。

JVM的垃圾回收器

在jvm中,实现了多种垃圾收集器,包括:

  • 串行垃圾收集器
  • 并行垃圾收集器
  • CMS(并发)垃圾收集器
  • G1垃圾收集器

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

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

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

在这里插入图片描述

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

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

垃圾回收时,多个线程在工作,并且java应用中的所有线程都要暂停(STW),等待垃圾回收的完成。
在这里插入图片描述

CMS(并发)垃圾收集器
CMS全称 Concurrent Mark Sweep,是一款并发的、使用标记-清除算法的垃圾回收器,该回收器是针对老年代垃圾回收的,是一款以获取最短回收停顿时间为目标的收集器,停顿时间短,用户体验就好。其最大特点是在进行垃圾回收时,应用仍然能正常运行。
在这里插入图片描述
初始标记——标记跟GC Root直接关联的对象;
并发标记——追踪引用链,探索与初始标记后的对象相关联的对象;
重新标记——由于在并发标记阶段,其它线程是可以继续执行的,所以可能出现新的引用或减少了引用,所以需要重新标记。

举例:
在这里插入图片描述
在上图中,各个标记阶段的标记对象为:

  • 初始阶段:对象A
  • 并发标记:对象B,C,D
    若在并发阶段A指向的对象X:
    在这里插入图片描述
    因此,重新标记阶段:对象C。
G1垃圾回收器
  • 应用于新生代和老年代,在JDK9之后默认使用G1
  • 划分成多个区域,每个区域都可以充当 eden,survivor,old, humongous,其中 humongous 专为大对象准备
  • 采用复制算法
  • 响应时间与吞吐量兼顾
  • 分成三个阶段:新生代回收、并发标记、混合收集
  • 如果并发失败(即回收速度赶不上创建新对象速度),会触发 Full GC

G1的三个阶段:
在这里插入图片描述
Young Collection(年轻代垃圾回收)

  • 初始时,所有区域都处于空闲状态
    在这里插入图片描述

  • 创建了一些对象,挑出一些空闲区域作为伊甸园区存储这些对象
    在这里插入图片描述

  • 当伊甸园需要垃圾回收时,挑出一个空闲区域作为幸存区,用复制算法复制存活对象,需要暂停用户线程
    在这里插入图片描述
    在这里插入图片描述

  • 随着时间流逝,伊甸园的内存又有不足
    在这里插入图片描述

  • 将伊甸园以及之前幸存区中的存活对象,采用复制算法,复制到新的幸存区,其中较老对象晋升至老年代
    在这里插入图片描述
    在这里插入图片描述

并发的标记阶段

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

混合收集

  • 混合收集阶段中,参与复制的有 eden、survivor、old
    在这里插入图片描述
  • 复制完成,内存得到释放。进入下一轮的新生代回收、并发标记、混合收集
    在这里插入图片描述

针对一个很大的对象,此时会将该对象存储到humongous中,如果一个区域装不下,会分配一个连续的区域来存储巨型对象:
在这里插入图片描述

强引用、软引用、弱引用、虚引用的区别

强引用:只有所有 GC Roots 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收。
在这里插入图片描述

软引用:仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次触发垃圾回收。在这里插入图片描述
弱引用:仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象。
在这里插入图片描述
dd
虚引用:必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存。
在这里插入图片描述

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

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

相关文章

做题速度太慢了,面不上

没办法,之前练了一个月的sql。两个月不写,现在差不多忘干净了。工作空窗期,或者休息期不能太久,不然学再多的内容都可能会忘完的。 sql题,腾讯四道sql题,限时45分钟完成。我只做了一道,还没做完…

自动控制原理MATLAB:控制系统模型构建

在MATLAB中,常用的系统建模方法有传递函数模型、零极点模型以及状态空间模型等。 1系统传递函数模型描述: 命令格式: systf(num,den,Ts); 其中,num、den为分子多项式降幂排列的系数向量,Ts表示采样时间,缺省时描述…

ppp和ppp mp理论实验

ppp简介 PPP(点对点协议)为在点对点连接上传输多协议数据包提供了一个标准方法,是数据链路层封装协议的一种方法,支持同步和异步两种传输方式。(除了PPP还有HDLC等,不过HDLC只支持同步方式) P…

语音识别之衡量声音之间的距离-理解DTW

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

2024年学浪课程提取工具blog

2024年,如果你还在为提取学浪课程而烦恼,快来了解我们全新推出的学浪课程提取工具!这是一款高效实用的工具,能一键提取并保存课程视频、音频和文档,让学习变得更加轻松愉快!从此告别繁琐的下载和整理过程&a…

Tensor Cores 解密:解锁深度学习新篇章

Tensor Cores 使用介绍 概要介绍 TensorCore是英伟达GPU自Volta架构起支持的特性,允许CUDA开发者利用混合精度来显著提升吞吐量,且不影响精度。TensorCore在Tensorflow、PyTorch、MXNet和Caffe2等深度学习框架中得到广泛支持,用于深度学习训…

VBA在Excel中注册登录界面的应用

Excel工作表也可以做一个小程序,登录注册后可以访问或修改。为了简便,没有做复杂的控件,能说明问题就行。可以根据需要添加更多的判断条件,控制注册和访问人数。本次操作对注册没有任何限制,只要注册后就可以根据注册的账号和密码进行访问和修改。注册登录界面截图: 操作…

Anatomical-Aware Point-Voxel Network for Couinaud Segmentation in Liver CT

文章目录 Anatomical-Aware Point-Voxel Network for Couinaud Segmentation in Liver CT摘要方法实验结果 Anatomical-Aware Point-Voxel Network for Couinaud Segmentation in Liver CT 摘要 在 CT 成像中,将肝脏准确分割为解剖片段对于手术规划和病变监测至关…

web前端学习笔记7-iconfont使用

7. iconfont的使用流程 字体图标使用较多的是阿里巴巴iconfont图标库,它是阿里巴巴体验团队推出的图标库和图标管理平台,提供了大量免费和可定制的矢量图标,以满足网页设计、平面设计、UI设计、应用程序开发和其他创意项目的需求。 官方网站:https://www.iconfont.cn/ 使用…

【Git管理工具】使用Docker+浪浪云服务器部署GitLab服务器

一、什么是GitLab 1.1.GitLab简介 GitLab 是一个开源的 DevOps 平台,它基于 Git 版本控制系统提供了从项目规划、源代码管理到持续集成、持续部署、监控和安全的完整生命周期管理。GitLab 是一个为开发者提供协作工作的工具,它使得团队能够高效地在同一…

海洋行业工业气体检测传感器的重要性

海洋行业是一个广阔而复杂的领域,涉及多个分支和应用,包括浮式生产、储存和卸载(FPSO)装置、渡轮和潜艇等。这些船舶和设施在执行任务时,都可能遇到各种潜在的气体危害。因此,对于海洋行业来说,…

Redis系列之key过期策略介绍

为什么要有过期策略&#xff1f; Redis是一个内存型的数据库&#xff0c;数据是放在内存里的&#xff0c;但是内存也是有大小的&#xff0c;所以&#xff0c;需要配置redis占用的最大内存&#xff0c;主要通过maxmemory配置 maxmomory <bytes> # redis占用的最大内存官…

python中一些莫名其妙的异常

目录 一、字符串中空格\xa0二、文件写入为空问题三、Counter对NAN空值的统计问题 一、字符串中空格\xa0 对于文本中的一些空格&#xff0c;原始状态时显示为普通“空格”&#xff08;其实是latin1编码字符&#xff09;&#xff0c;但是经过split()操作后&#xff0c;这些latin…

如何用道氏理论进行炒现货白银的技术分析?

要炒现货白银&#xff0c;就要对白银价格进行技术分析。进行炒白银的技术分析&#xff0c;目的是让投资者通过对白银价格图表的分析&#xff0c;判断白银市场趋势&#xff0c;进而寻找入场交易的机会。 道氏理论不光是一种技术分析的理论&#xff0c;它还被称为技术分析的鼻祖。…

【XR806开发板试用】阻塞式串口发送与接收教程

本文基于wsl2搭建的ubuntu18.04 vscode编辑器 很奇怪啊&#xff0c;找了半天居然没人发串口的教程&#xff0c;于是只能自己试一试了&#xff0c;在此发一个阻塞式的串口发送与接收的教程。并且&#xff0c;感谢.ACE彭洪权大佬在我配置环境遇到几十个报错的时候帮我远程搭建环…

H3C Private VLAN实验

Private VLAN 实验1 实验需求 按照图示配置 IP 地址 在 SW1 上配置 Private VLAN&#xff0c;Primary VLAN 为 Vlan30&#xff0c;Secondary VLAN 为 Vlan10 和 Vlan20 SW2 通过 Vlan100 下行连接 SW1&#xff0c;要求 PC3 和 PC4 都能以 Vlan100 访问 PC5 在 SW1 上配置 …

给网站网页PHP页面设置密码访问代码

将MkEncrypt.php文件上传至你网站根目录下或者同级目录下。 MkEncrypt.php里面添加代码&#xff0c;再将调用代码添加到你需要加密的页进行调用 MkEncrypt(‘123456’);括号里面123456修改成你需要设置的密码。 密码正确才能进去页面&#xff0c;进入后会存下cookies值&…

java接受入参是xml格式参数demo

java接受入参是xml格式参数demo 依赖demo1. xml入参定义2.接口定义3. postman请求4. 结果 注解说明 依赖 pom依赖 jackson-dataformat-xml <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</…

RCLAMP0854P.TCT ESD抑制器 静电和浪涌保护 应用领域

RCLAMP0854P.TCT 是一款电路保护器件&#xff0c;属于Transient Voltage Suppressor (TVS) 系列产品。它是一种低电容TVS阵列&#xff0c;具有 RailClamp 标志性技术&#xff0c;旨在为电子设备提供高效防护&#xff0c;免受高电压瞬变和静电放电&#xff08;ESD&#xff09;的…

uni-app 超详细教程( 附送250套精选项目源码)

一&#xff0c;uniapp 介绍 &#xff1a; 官方网页 uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/…