当前位置: 首页 > news >正文

【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 线程调用虚引用相关方法。虚引用的一个应用场景是直接内存的释放问题。

【详细】

强引用:

在这里插入图片描述

软引用:

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

在这里插入图片描述

虚引用:

在这里插入图片描述

相关文章:

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

文章目录 1、类加载器1.1 什么是类加载器1.2 什么是双亲委派机制 2、类装载的执行过程(类的生命周期)3、对象什么时候可以被垃圾回收器处理4、JVM垃圾回收算法4.1 标记清除算法4.2 标记整理算法4.3 复制算法 5、分代收集算法5.1 MinorGC、Mixed GC、Full…...

深入理解预处理

1.预定义符号 C语言设置了⼀些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的。 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC__ //如果编译器遵循ANSI C&…...

DSP28335:定时器

1.定时器介绍 1.1 定时器工作原理 TMS320F28335的CPU Time有三个,分别为Timer0,Timer1,Timer2,其中Timer2是为操作系统DSP/BIOS保留的,当未移植操作系统时,可用来做普通的定时器。这三个定时器的中断信号分…...

系统架构理解

一、统一提前查好所有数据后续逻辑用到啥取啥,还是等用到对应数据的时候再查 1、用到啥查啥: 优势:减少依赖调用次数,减轻服务器压力;代码逻辑清晰,没有太多分支判断 劣势:无法避免串行调用&am…...

uni-app页面的跳转三种方式,功能作用有什么区别?

一、三种方式的作用 1、uni.reLaunch 作用是关闭所有页面,然后打开新的页面 类似于重新启动应用,打开的页面栈会被清空,只显示新打开的页面。使用uni.reLaunch方法可以实现整个应用的重定向 uni.reLaunch({url: /pages/login/login }) 2、…...

React 通信:深层传递(Props、Context、Children Jsx)

在之前的文章 探讨:围绕 props 阐述 React 通信 中总结了关于“父子”组件传值,但是当需要在组件树中深层传递参数以及需要在组件间复用相同的参数时,传递 props 就会变得很麻烦。 实际案例: 下述展示有两种状态:① 详…...

《Windows API每日一练》5.1 键盘基础

本节我们讲述关于键盘的一些基础知识。当我们按下一个键盘按键时,会产生一个键盘按键消息。这一点你能确定吗?假如是一个菜单快捷键消息,或者是一个子窗口控件消息呢?这就超出了本节讨论的范围,我们将在菜单和子窗口控…...

Class.forName()方法总结

Class.forName()方法总结 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!Class.forName()方法是Java反射机制中的一个重要方法,它用于动态加载类并返…...

Python | Leetcode Python题解之第168题Excel表列名称

题目: 题解: class Solution:def convertToTitle(self, columnNumber: int) -> str:ans list()while columnNumber > 0:columnNumber - 1ans.append(chr(columnNumber % 26 ord("A")))columnNumber // 26return "".join(an…...

【ARMv8/ARMv9 硬件加速系列 3.5.2 -- SVE 向量寄存器 有多少位数?】

文章目录 SVE 向量寄存器SVE 向量寄存器大小SVE 可伸缩性的好处SVE 寄存器长度示例SVE 向量寄存器 在 ARMv9 架构中,包括其 Scalable Vector Extension (SVE) 和 Scalable Vector Extension 2 (SVE2) 的增强,向量寄存器(通常称为 Z 寄存器)的大小设计为可伸缩的,以便在不…...

Vulkan入门系列2- 绘制三角形(未完待续)

概述: Vulkan的学习曲线是比较陡峭的,学习Vulkan刚开始像是在爬一个陡坡,等上了这个陡坡之后,后面学习曲线就相对比较平缓了。那么在Vulkan中绘制一个三角形,就相当于是在爬这样一个陡坡,因为绘制三角形需…...

企业UDP文件传输工具测速的方式(下)

在前一篇文章中,我们深入讨论了UDP传输的基本概念和镭速UDP文件传输工具如何使用命令行快速进行速度测试。现在,让我们进一步探索更为高级和灵活的方法,即通过整合镭速UDP的动态或静态库来实现网络速度的测量,以及如何利用这一过程…...

Artalk-CORS,跨域拦截问题

今天重新部署Artalk之后,遇到了CORS——跨域拦截的问题,卡了好一会记录一下。 起因 重新部署之后,浏览器一直提示CORS,之前在其他项目也遇到过类似的问题,原因就在于跨域问题。...

SSL证书怎样配置部署更安全?

在互联网上,SSL证书是用于加密网站与用户之间传输的数据的一种数字证书。它通过建立安全的连接,确保网站的身份和保护用户的隐私,是网站安全的重要组成部分。然而,要想让SSL证书发挥最大的作用,除了检查证书是否过期外…...

M1失效后,哪个是观察A股的关键新指标?

M1失效后,哪个是观察A股的关键新指标? 央地支出增速差(地方-中央支出增速的差值)或许是解释沪深300定价更有效的前瞻指标。该数值扩张,则有利于大盘指数,反之亦然,该指标从2017年至今对大盘指数…...

springboot集成积木报表,怎么将平台用户信息传递到积木报表

springboot集成积木报表后怎么将平台用户信息传递到积木报表 起因是因为需要研究在积木报表做数据筛选的时候需要拿到系统当前登录用户信息做筛选新的模块 起因是因为需要研究在积木报表做数据筛选的时候需要拿到系统当前登录用户信息做筛选 官网有详细介绍怎么集成进去的&…...

Spring Bean详解

Spring Bean作用域 默认情况下,所有的 Spring Bean 都是单例的,也就是说在整个 Spring 应用中, Bean 的实例只有一个 如果我们需要创建多个实例的对象,那么应该将 Bean 的 scope 属性定义为 prototype,如果 Spring 需…...

前端根据环境变量配置网页的title和favicon

前端根据环境变量配置网页的title和favicon 前言流程步骤一、设置environment文件二、在入口文件中配置三、删除index.html中的title和 icon link四、使用对应的打包命令进行部署 注意事项一、angular中,需要在angular.json添加favicon.ico额外的构建 前言 有些项目…...

服务器负载均衡

什么是服务器负载 1. 常见理解的平均负载 每次发现系统变慢时,我们通常做的第一件事,就是执行 top 或者 uptime 命令,来了解系统的负载情况。比如下列情况 [rootkube-node1 ~]# uptime09:44:37 up 74 days, 11:53, 1 user, load average:…...

如何设置Excel单元格下拉列表

如何设置Excel单元格下拉列表 在Excel中设置单元格下拉列表可以提高数据输入的准确性和效率。以下是创建下拉列表的步骤: 使用数据验证设置下拉列表: 1. 选择单元格: 选择你想要设置下拉列表的单元格或单元格区域。 2. 打开数据验证&…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

HTML 列表、表格、表单

1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...