金三银四面试题(一):JVM类加载与垃圾回收

面试过程中最经典的一题:

请你讲讲在JVM中类的加载过程以及垃圾回收?

加载过程

当Java虚拟机(JVM)启动时,它会通过类加载器(ClassLoader)加载Java类到内存中。类加载是Java程序运行的重要组成部分,它负责将字节码文件加载到内存,并将其转换为运行时的Java类。

  1. 加载(Loading): 通过类的完全限定名,查找此类字节码文件,利用字节码文件创建Class 对象.

  2. 链接(Linking) 分为三个阶段:验证(Verification)、准备(Preparation)、解析(Resolution)。

    • 验证阶段确保加载的类符合Java语言规范,不会危害JVM的安全。验证包括文件格式验证、元数据验证、字节码验证和符号引用验证
    • 在准备阶段,为类的静态变量分配内存空间,并将其初始化为默认值。这些静态变量会在方法区中分配内存空间,但不会为其赋予初始值,初始值在后面的初始化阶段进行赋值。
    • 解析阶段是将类、接口、字段和方法的符号引用解析为直接引用的过程。这个过程可能包括将常量池中的符号引用替换为直接引用、对类和接口的全限定名进行解析等。
  3. 初始化(Initialization):在初始化阶段,JVM会执行类构造器()方法,该方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的。JVM会保证类的初始化是线程安全的,即只会执行一次。在这个阶段,静态变量会被赋予初始值,静态代码块会被执行。

加载机制

双亲委派机制(Parent Delegation Model)是Java类加载器(ClassLoader)的一种工作机制。在Java中,类加载器按照一种树形结构层级来组织,每个类加载器都有一个父类加载器。当一个类加载器需要加载一个类时,它首先会委派给其父加载器去尝试加载,只有在父加载器无法加载该类的情况下,才会由子加载器尝试加载。这种加载方式称为双亲委派机制。

优点

  • 避免重复加载: 通过委派给父加载器,可以避免在不同的类加载器中重复加载同一个类,从而节省内存和系统资源。

  • 安全性: 通过双亲委派机制,系统类库通常由引导类加载器加载,而用户自定义的类通常由应用程序类加载器加载,这样可以有效地保护系统核心类不受用户篡改。

  • 层级管理: 可以通过双亲委派机制有效地管理类加载器的层级结构,保证类的加载顺序和一致性。

图解加载机制

分代回收

分代垃圾回收机制是一种优化垃圾回收效率的策略,它将内存分为不同的代,并根据对象的生命周期将对象分配到不同的代中,以实现更高效的内存回收。

分代垃圾回收

分代垃圾回收机制将堆内存划分为几个不同的代,通常是新生代(Young Generation)、老年代(Old Generation)和永久代(PermGen,JDK 7及以前版本)。其中,新生代用于存放刚刚被创建的对象,老年代用于存放生存时间较长的对象,永久代(在 JDK 8 中被元数据区(Metaspace)取代)用于存放类的元数据信息。

分代垃圾回收的主要思想是根据对象的生命周期来进行优化。通常情况下,大部分对象的生命周期都很短暂,它们很快就会变成垃圾。因此,分代垃圾回收机制将堆内存划分为一个较大的新生代和一个较小的老年代。新生代采用复制算法进行垃圾回收,而老年代采用标记-清除算法或标记-整理算法进行垃圾回收。

新生代垃圾回收

新生代采用了复制算法进行垃圾回收。新生代被划分为一个较大的 Eden 区和两个较小的 Survivor 区(通常称为 From 区和 To 区)。当新对象被创建时,它们被分配到 Eden 区。当 Eden 区满时,触发 Minor GC(新生代垃圾回收)。在 Minor GC 过程中,存活的对象将被复制到 To 区,然后清空 Eden 区和 From 区,并将 To 区与 From 区交换角色。这个过程称为清除(Clear)和复制(Copy)。在多次 Minor GC 后,仍然存活的对象会被晋升到老年代中。

老年代垃圾回收

老年代主要用于存放生命周期较长的对象。它采用了标记-清除算法或标记-整理算法进行垃圾回收。在老年代垃圾回收过程中,首先标记所有存活的对象,然后清除未标记的对象。在标记-清除算法中,清除后会产生内存碎片;而在标记-整理算法中,存活的对象会被整理到一端,从而减少内存碎片的产生。尽管Full GC 发生的次数不会有 Minor GC 那么频繁,但是做一次 Full GC 要比进行一次 Minor GC 的时间更长。(有的面试官还会问什么情况下会full gc?不仅仅要想到堆空间不足的情况,还有 System.gc() 这个函数)

上图仅仅是一个示意图, SO,S1的角色每轮会互换。

而且各个分区比例可以通过JVM参数进行调整。默认情况下, 新生代和老年代的比例为1:2。S0:S1:Eden = 1:1:8

回收算法

在面试经常问到的两个问题就是如何标记和如何清除

如何标记:

  1. 引用计数法(Reference Counting)是一种垃圾回收算法,其基本思想是为每个对象维护一个引用计数器,用于记录当前对象被引用的次数。当引用计数器减少到零时,说明该对象不再被任何其他对象引用,即成为垃圾对象,可以被回收。

当然这并不理想,因为会出现循环引用。所以引出第二个算法:

  1. 可达性分析(Reachability Analysis)是一种垃圾回收算法中常用的技术。它用于确定在堆内存中哪些对象是“可达”的,即哪些对象可以被程序的根节点(通常是全局变量、活动线程栈上的对象等)直接或间接引用到。基于可达性分析,垃圾收集器可以识别出不再被任何可达对象引用的对象,并将其标记为可回收的垃圾对象。

清除算法

  1. G1 算法

    JDK9之后默认的垃圾回收算法,特点保持高回收率的同时减少停顿.采用每次只清理一部分,而不是清理全部的增量式清理,以保证停顿时间不会过长

    其取消了年轻带与老年代的物理划分,但仍属于分代收集器,算法将堆分为若干个逻辑区域(region),一部分用作年轻带,一部分用作老年代,还有用来存储巨型对象的分区.和CMS相同,会遍历所有对象,标记引用情况,清除对象后会对区域进行复制移动,以整合碎片空间.

    年轻带回收:并行复制采用复制算法,并行收集,会 StopTheWorld.

    老年代回收:会对年轻带一并回收

    初始标记完成堆 root 对象的标记,会 StopTheWorld.并发标记 GC 线程和应用线程并发执行. 最终标记 完成三色标记周期,会 StopTheWorld.复制/清除会优先对可回收空间加大的区域进行回收。

  2. ZGC 算法

针对大堆内存设计,可以处理 TB 级别的堆,可以做到 10ms 以下
的回收停 顿时间.

特点:

  • 着色指针
  • 读屏障
  • 并发处理
  • 基于 region
  • 内存压缩(整理)

roots标记:标记 root 对象,会StopTheWorld.并发标记:利用读屏障与应用线程一起运行标记,可能会发生 StopTheWorld.清除会清理标记为不可用的对象. roots 重定位:是对存活的对象进行移动,以 腾出大块内存空间,减少碎片产生.重定位最开始会 StopTheWorld,取决于重定位集与对象总活动集的比例. 并发重定位与并发标记类似.

总结

JVM的类加载过程和垃圾回收是面试中几乎必问的问题,作为八股文中最经典的存在,大家一定要熟记,最好刻在DNA中。

在这里插入图片描述

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

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

相关文章

AI视频风格转换动漫风:Stable Diffusion+TemporalKit

话不多说,直接开干。 基本方法 首先通过 Temporal-Kit 这个插件提取视频中的关键帧图片,然后使用 Stable Diffusion WebUI 重绘关键帧图片,然后再使用 Temporal-Kit 处理转换后的关键帧图片,它会自动补充关键帧之间的图片&#…

Karmada 管理有状态应用 Xline 的早期探索与实践

背景与动机 目前随着云原生技术和云市场的不断成熟,越来越多的 IT 厂商开始投入到跨云多集群的怀抱当中。以下是 flexera 在 2023 年中关于云原生市场对多云多集群管理的接受程度的调查报告(http://info.flexera.com) 从 flexera 的报告中可…

优化选址问题 | 基于灰狼算法求解基站选址问题含Matlab源码

目录 问题代码问题 灰狼优化算法(Grey Wolf Optimizer, GWO)是一种基于自然界中灰狼群体狩猎行为的优化算法。这种算法通过模拟灰狼的社会等级和狩猎行为来寻找问题的最优解。 基站选址问题通常是一个多目标优化问题,涉及到覆盖范围、信号质量、成本等多个因素。使用灰狼算…

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,记录犯经验主义错误不断自己打脸过程

前言: 从小白开始 海康威视的摄像头接触过,包括前面也都开发了调用sdk开发拍照和视频预览,以及通过事件警报获取数据的。接触到的像头都是12v或者24v电源,或者是POE供电的,先入为主了觉得都是这样,结果打脸了。 一、设备选型: 最开…

glibc内存管理ptmalloc - largebin

前言 上节《glibc内存管理ptmalloc》我们讲了fastbin/unsortedbin/smallbin, 有意避开了largebin, 因为largebin稍微复杂一点点,需要单独一节讲解。 largebin的特点 chunk size 大于等于1024字节largebin共有63个链表largebin每个链表中的chunk size不固定largeb…

阿里云2核4G云服务器165元一年,ECS u1优惠价格199元一年

阿里云2核4G服务器租用优惠价格,轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月,活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图: 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

MySQL数据库 - 存储引擎

一. mysql 存储引擎的相关知识 1.1 存储引擎的概念 MySQL中的数据用各种不下同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。存储引擎是My…

天水麻辣烫火爆出圈,秦安能否接得住这“泼天富贵”?

文章目录 泼天富贵来袭莲花社火助力秦安花椒 秦安介绍基本概况秦安地形秦安气候秦安乡镇 秦安旅游李元芳故居兴国寺女娲庙秦安文庙泰山庙人民街古建商业一条街大地湾遗址三国街亭古战场遗址女娲洞 泼天富贵来袭 一碗麻辣烫带火一座城。甘肃天水麻辣烫在社交媒体平台火爆出圈&a…

算法系列--动态规划--回文子串系列

💕"我们好像在池塘的水底,从一个月亮走向另一个月亮。。"💕 作者:Mylvzi 文章主要内容:算法系列–动态规划–回文子串系列 今天为大家带来的是算法系列--动态规划--回文子串系列(1),本文重点掌握如何快速判…

Linux相关命令(2)

1、W :主要是查看当前登录的用户 在上面这个截图里面呢, 第一列 user ,代表登录的用户, 第二列, tty 代表用户登录的终端号,因为在 linux 中并不是只有一个终端的, pts/2 代表是图形界面的第…

伦敦银操作建议中所蕴含的支撑阻力位技术

在伦敦银操作建议或者报告中,尤其是有关伦敦银操作技术分析的建议中,我们总是能看到一个名词:支撑阻力位。其实支撑阻力位有两个意思,一个是支撑位,一个是阻力位,我们习惯将它们合起来称呼,实际…

uniapp安装axios

先npm安装 npm i axios然后在项目里面建一个utils文件,再建一个index.js 以下是index.js代码: import axios from axios; const service axios.create({baseURL: //xxxx.xxxxx.com///你的请求接口域名, timeout: 6000, // request timeoutcrossDomai…

设计数据库之外部模式:数据库的应用

Chapter5:设计数据库之外部模式:数据库的应用 笔记来源:《漫画数据库》—科学出版社 设计数据库的步骤: 概念模式 概念模式(conceptual schema)是指将现实世界模型化的阶段进而,是确定数据库理论结构的阶段。 概念模…

【 yolo红外微小无人机-直升机-飞机-飞鸟目标检测】

yolo无人机-直升机-飞机-飞鸟目标检测 1. 小型旋翼无人机目标检测2. yolo红外微小无人机-直升机-飞机-飞鸟目标检测3. yolo细分类型飞机-鸟类-无人机检测4. yolo红外大尺度无人机检测 1. 小型旋翼无人机目标检测 类别 nc: 1 names: [‘drone’] 数据集和模型 VOC无人机UAV数据…

小目标检测常见解决策略总结

1. 引言 尽管目标检测算法取得了长足的发展,例如 Faster RCNN、YOLO、SSD、RetinaNet、EfficientDet 等。通常,这些模型是在 COCO数据集上训练的。它是一个包含各种对象类别和标注的大规模数据集,因此在训练对象检测器方面很受欢迎。然而&am…

FEX-Emu在Debian/Ubuntu系统使用

FEX-Emu在Debian/Ubuntu系统使用 1. Debootstrap子系统安装(可选)2. Debian/Ubuntu依赖包安装3. 获取FEX-Emu源码并编译4. 根文件系统RootFS安装5. 基于 FEX-Emu 运行应用 1. Debootstrap子系统安装(可选) sudo apt-get install …

蓝桥杯第二天刷真题

public class Main {public static void main(String [] args) { //存大数方法String s"202320232023"; // 定义一个字符串&#xff0c;它将被转换为结束循环的数值long end Long.parseLong(s);long sum 0;long primarynumber 1;for(int i 1; i<end; i) {long …

基于甘特图的资源调度优化策略

资源在项目管理中是一个永恒的话题。无论人力、物力还是财力资源,总是捉襟见肘,都希望用最少的资源完成最大的工作。这就要求我们在资源调度方面果断精准,做到最优化。而甘特图作为项目时间规划的重要工具,恰恰能为资源调度提供绝佳帮助。 甘特图能反映出任务之间的制约关系,有…

liunx CentOS7 搭建lnmp环境 php nginx mysql

安装一些刚需软件&#xff1a;不懂请自行查询 安装一些需要的软件命令 yum install wget vim net-tools bash* lrzsz tree nmapnc lsof telnet -y 刷新命令 source /usr/share/bash-completion/bash_completion echo source /usr/share/bash-completion/bash_completion &…

0-1背包

问题描述 现有4个物品&#xff0c;小偷背包总容量为8&#xff0c;怎么可以偷得价值最多的物品&#xff1f; 物品编号&#xff1a;1 2 3 4 物品重量&#xff1a;2 3 4 5 物品价值&#xff1a;3 4 5 8 输入 …