【Java面试】二十一、JVM篇(中):垃圾回收相关

文章目录

  • 1、类加载器
    • 1.1 什么是类加载器
    • 1.2 什么是双亲委派机制
  • 2、类装载的执行过程(类的生命周期)
  • 3、对象什么时候可以被垃圾回收器处理
  • 4、JVM垃圾回收算法
    • 4.1 标记清除算法
    • 4.2 标记整理算法
    • 4.3 复制算法
  • 5、分代收集算法
    • 5.1 MinorGC、Mixed GC、Full GC的区别是什么
  • 6、JVM有哪些垃圾回收器
    • 6.1 G1垃圾回收器
  • 7、强软弱虚引用的区别

1、类加载器

1.1 什么是类加载器

JVM处理class字节码文件成为二进制文件,类加载的作用则是将class字节码文件加载到JVM中。有四种类加载器:

  • 启动类加载器:加载JDK下的jre/lib下的类,这个加载器由C++实现
  • 扩展类加载器:加载JDK下的jre/lib/ext下的类,如果把开发者自己写的class放这个目录,也会被扩展类加载器加载
  • 应用类加载器:加载开发者自己写的class
  • 自定义类加载器:自己去继承ClassLoader,自己实现
    在这里插入图片描述

1.2 什么是双亲委派机制

加载某一个类时,先委托上一级的加载器(父加载器)去进行加载,如果上一级加载器也有上级,则继续向上委托,若没被上级加载,则向下开始逐个找,直到加载成功,到最下面的加载器也没找到这个类,则抛异常ClassNotFountException。总之:

  • 自底向上查找是否已经被父加载器加载过,有则直接返回
  • 若没被加载,再自顶向下进行加载

在这里插入图片描述

该机制的作用:

  • 保证类加载的安全性:避免用户自定义一个java.lang.String恶意替换JDK的核心类库里的String类
  • 避免重复加载:避免同一个类被多次加载,提高效率

在这里插入图片描述

2、类装载的执行过程(类的生命周期)

  • 加载:查找和导入class 文件
  • 验证:保证加载类的准确性
  • 准备:为类变量分配内存并设置类变量初始值
  • 解析:把类中的符号引用转换为直接引用
  • 初始化:对类的静态变量,静态代码块执行初始化操作
  • 使用:new对象
  • 卸载:删掉方法区的InstanceKlass和堆的Class对象

在这里插入图片描述

加载:
  • 加载磁盘上的class字节码文件、动态代理生成的类
  • 通过全类名,获取类的二进制数据流
  • 解析类的二进制数据流,在方法区中,生成一个InstanceKlass对象(c++),保存了类的所有信息
  • 堆区生成一个和上面InstanceKlass对象类似的java.lang.Class对象,给Java代码操作

在这里插入图片描述

连接--验证:

验证文件格式(魔数)、class文件里的主版本号是否适配当前JVM、符号引用里是否有其他类的private变量

在这里插入图片描述

连接--准备:

为静态变量分配内存并设置初始值:

  • static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成,如下面的b变量
  • static + final 修饰基本类型,以及字符串常量,值已确定,赋值在准备阶段完成,如下面的c、d变量
  • static + final 修饰引用类型,赋值也在初始化阶段完成,如下面的obj变量

在这里插入图片描述

连接--解析:

将符号引用转为直接引用,比如方法中调用了其他方法,直接引用即使用内存地址直接指向方法。如#25转为内存地址。

初始化:

初始化阶段对类的静态变量初始化、静态代码块执行。

  • 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类
  • 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行
使用:
  • new关键字创建对象
  • 调用静态类成员信息,比如:静态字段、静态方法

【类的生命周期】

3、对象什么时候可以被垃圾回收器处理

如果一个对象没有任何引用指向它了,那这个对象就被定义为垃圾,可能被垃圾回收器回收。确定是否有引用指向它,有两种方式:

  • 引用计数法:维护个计数,被引用一次就+1,循环依赖时会有内存泄漏,一般不用
  • 可达性分析:普通对象A,经一个引用链可以到达GC Root对象,则A不可被回收,JVM持有GCRoot的List列表

在这里插入图片描述
A、B、C、D不可回收,X、Y可回收

4、JVM垃圾回收算法

标记清除算法、复制算法、标记整理算法、分代算法

4.1 标记清除算法

先根据可达性分析算法,标记垃圾对象,再对标记了可回收的对象进行GC

在这里插入图片描述

优点是标记和清除速度较快,缺点是回收后出现内存碎片化,不连贯,存个大对象或者数组(内存地址连续),就不行

4.2 标记整理算法

在这里插入图片描述

和标记清除算法相比,多了一步对象内存位置移动的步骤,解决了碎片化,但效率也低了一点

4.3 复制算法

内存一分为二,Form和To两块,先在From存对象,进行回收时,将存活的对象copy到To空间,再清掉From剩下的可回收对象,然后From和To角色互换,To成了新的From,清理后的From成了To

在这里插入图片描述

优点是无碎片化问题,效率较高,但空间利用率低,一半一半的存

5、分代收集算法

【GC算法详细】
JDK8时,堆被分成两份,默认新生代 : 老年代 = 1:2

在这里插入图片描述

对占堆三分之一的新生代,又分为三块:

  • 伊甸园区Eden,新生的对象都分配到这里
  • 两块幸存者区survivor(分成from和to)
  • Eden区:from区:to区= 8:1:1

分代回收的步骤:

  • 新创建的对象,都会先分配到 eden 区
  • 当伊甸园内存不足,标记伊甸园与 from(现阶段没有对象)的存活对象
  • 将存活对象采用复制算法复制到 to 中,复制完毕后,伊甸园和from 内存都得到释放

在这里插入图片描述

  • 经过一段时间后伊甸园的内存又出现不足,标记 eden 区域 to 区存活的对象,将存活的对象复制到 from 区

在这里插入图片描述

  • 继续伊甸园区 + S0 + S1之间玩复制算法,直到有对象经过了15次GC(GC年龄默认15),晋升到老年代,不再from和to之间频繁的复制

在这里插入图片描述

  • 对象过大或者幸存者区空间不足,可能出现对象提前晋升到老年代

5.1 MinorGC、Mixed GC、Full GC的区别是什么

STW,stop the world,暂停所有用户线程,等待垃圾回收完成再处理用户请求,STW要尽量短

  • MinorGC(Young GC):发生在新生代的垃圾回收,暂停时间短(STW),这也是分代的最明显的一个好处了
  • Mixed GC: 新生代 +老年代部分区域的垃圾回收,G1 收集器特有
  • Full GC:新生代 + 老年代完整垃圾回收,暂停时间长(STW),应尽力避免

6、JVM有哪些垃圾回收器

  • 串行垃圾收集器:Serial GC、Serial Old ,只有一个线程处理垃圾回收,期间用户线程阻塞(STW)

在这里插入图片描述

  • GC并行垃圾收集器:Parallel Old GC、ParNewGC,多个线程处理垃圾回收,期间用户线程阻塞(STW)

在这里插入图片描述

  • CMS(并发)垃圾收集器:CMS GC,作用在老年代

在这里插入图片描述

  • G1垃圾收集器:作用在新生代和老年代

6.1 G1垃圾回收器

  • 应用于新生代和老年代,在JDK9之后默认使用G1

  • 堆被划分成多个区域Region,每个区域都可以充当eden,survivor,old,humongous,其中 humongous 专为大对象准备

  • 采用复制算法

  • 响应时间与吞吐量兼顾

  • 分成三个阶段:新生代回收、并发标记、混合回收MixedGC。多次Young GC回收后,当堆的使用率达到阈值,触发混合回收MixedGC,用复制算法回收一轮所有年轻代、部分老年代、大对象区

  • 因为清理是复制算法,如果清理时发现没有空Region去存放转移的对象(没地儿复制了),则转为单线程执行标记-整理算法进行Full GC,此时会导致用户线程的暂停

【GC回收器】

7、强软弱虚引用的区别

  • 强引用:默认,只要有 GCRoots能找到它,就不会被回收,哪怕OOM
  • 软引用:需要配合 SoftReference 使用,当垃圾多次回收,内存依然不够的时候会回收软引用对象
    弱引用:需要配合 WeakReference 使用,只要进行了垃圾回收,就会把弱引用对象回收
    虚引用:和其他几种引用不一样,它不影响对象的回收规则,形同虚设。必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法。虚引用的一个应用场景是直接内存的释放问题。

【详细】

强引用:

在这里插入图片描述

软引用:

在这里插入图片描述
弱引用:

在这里插入图片描述

虚引用:

在这里插入图片描述

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

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

相关文章

大数据的发展,带动电子商务产业链,促进了社会的进步【电商数据采集API接口推动电商项目的源动力】

最近几年计算机技术在诸多领域得到了有效的应用,同时在多方面深刻影响着我国经济水平的发展。除此之外,人民群众的日常生活水平也受大数据技术的影响。 在这其中电子商务领域也在大数据技术的支持下,得到了明显的进步。虽然电子商务领域的发…

网页钓鱼-克隆修改--劫持口令下载后门

免责声明:本文仅做技术交流与学习... 目录 1-右键另存为 2-goblin项目(不推荐) 修改goblin.yaml文件 运行exe ​编辑 3-Setoolkit (kali自带) 网页克隆---> 1-右键另存为 --不行就再定位元素进行修改. 2-goblin项目(不推荐) GitHub - xiecat/goblin: 一款适用于红蓝…

云原生安全联防联抗策略玩转微隔离

前言 随着信息技术的发展、互联网的快速普及,越来越多的信息被存储在云端,企业面临的安全问题也日益突出。在《网络安全法》、《数据安全法》等多部法律法规要求下,各行业用户纷纷设立安全部门。不管安全部门里是“一人当关”还是“三三两两…

PCB AVI品质报告采集工具

AVI设备,品质报告. 可以通过: 过滤文件名指定文件名 排除多余的日志;运行日志为增量日志,可采用增量模式;品质报告可设置采集后删除; 下载: Gitee下载 最新版本 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自…

lammps聚合物建模组合技巧

大家好,我是小马老师。 本文介绍聚合物结构的组合问题。 在lammps模拟中,聚合物模拟应该算是比较复杂的一种模拟,不仅建模复杂、势参数较多,而且在模拟过程中也会经常出现各种意想不到的错误。 本文主要解决聚合物建模过程中常遇到的一个问题:多成分的组合。 比如下面的结…

【仿真建模-anylogic】Port原理解析

Author:赵志乾 Date:2024-06-14 Declaration:All Right Reserved!!! 1. 类图 2. 原理解析 2.1 核心函数: Port作为各类型端口的基类,其核心方法如下 : 函数功能Port(A…

Linux磁盘格式化与重新分区

1.df -BG查看磁盘挂载情况 2.fdisk -l查看磁盘详细信息 3.sudo mkfs.ext4 /path 格式化磁盘 4.挂载格式化后磁盘 挂载成功

初见DP

线性DP 例题1 1143. 最长公共子序列 (LCS) 子序列不连续 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#x…

opencv 视频处理

概述 OpenCV 的视频模块是其核心组成部分之一,主要负责视频文件的读取、处理、分析以及视频流的捕获和输出。这一模块使得开发者能够轻松地处理来自摄像头、文件或其他视频源的视频数据,进行实时或离线的图像处理和计算机视觉任务。以下是 OpenCV 视频模…

Pentest Muse:一款专为网络安全人员设计的AI助手

关于Pentest Muse Pentest Muse是一款专为网络安全研究人员和渗透测试人员设计和开发的人工智能AI助手,该工具可以帮助渗透测试人员进行头脑风暴、编写Payload、分析代码或执行网络侦查任务。除此之外,Pentest Muse甚至还能够执行命令行代码并以迭代方式…

Excel 找出最大值及其相邻的 N 个成员

某列都是数值: A1132213464215496973482396101113712491342144015151631171718114719182030212222423252419251326272738283029163012312332333233419351436463723383739384028 请找出最大值及其相邻的 10 个成员,注意越界检查,实际符合条件…

JAVA云HIS医院管理系统源码:可医保对接的云HIS运维平台源码 SaaS模式

JAVA云HIS医院管理系统源码:可医保对接的云HIS运维平台源码 SaaS模式 云HIS系统运用云计算、大数据、物联网等新兴信息技术,为医疗机构提供全面的医疗信息管理服务。该系统支持医保功能,通过与医保系统的对接,实现了医疗费用的自…

Boost 网络库

asio 网络编程的基本流程创建 socket绑定acceptor连接指定的端点服务器接受连接 网络编程的基本流程 服务端 1)socket----创建socket对象。 2)bind----绑定本机ipport。 3)listen----监听来电,若在监听到来电,则建…

Vue 3的组合式API:你真的需要它吗?

Vue 3的组合式API:你真的需要它吗? 随着Vue 3的发布,我们迎来了一个新的API——组合式API(Composition API)。这个API为开发者提供了更灵活、更可复用的代码编写方式。然而,传统的选项式API(Opt…

分布式操作系统入门:可的哥(Codigger)引领新潮流

早期,大型机系统盛行,随后个人计算机如Windows、Mac OS等操作系统普及。随着技术发展和计算需求增长,单机系统的局限显现,推动了分布式操作系统的崛起。操作系统演进显露出从单机到多机、从集中到分散的趋势。传统单机系统在处理大…

OPenCV实现把人形轮廓画在实时视频画面中

操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 1.功能描述 当你从摄像头读取实时视频时,如果想在视频的画面中画一个方框,或者是画一个圆,是很简单的事情,可是…

Python爬虫技术:动态JavaScript加载音频的解析

在当今的互联网世界中,JavaScript已成为构建丰富交互体验不可或缺的技术。然而,对于网络爬虫开发者来说,JavaScript动态生成的内容却带来了不小的挑战。音频内容的动态加载尤其如此,因为它们往往涉及到复杂的用户交互和异步数据加…

【python】Sklearn—Cluster

参考学习来自 10种聚类算法的完整python操作示例 文章目录 聚类数据集亲和力传播——AffinityPropagation聚合聚类——AgglomerationClusteringBIRCH——Birch(✔)DBSCAN——DBSCANK均值——KMeansMini-Batch K-均值——MiniBatchKMeans均值漂移聚类——…

【C#】字符串处理器

实现: 统计字符串中单词的数量。查找字符串中最长的单词,并显示其长度。将字符串中的所有单词首字母大写。将字符串中的所有单词反转。 要求: 使用面向对象的方式实现,包括至少一个类(例如 StringProcessor&#xf…

视频智能分析平台智能边缘分析一体机视频监控业务平台区域人数不足检测算法

智能边缘分析一体机区域人数不足检测算法是一种集成了先进图像处理、目标检测、跟踪和计数等功能的算法,专门用于实时监测和统计指定区域内的人数,并在人数不足时发出警报。以下是对该算法的详细介绍: 一、算法概述 智能边缘分析一体机区域…