金三银四面试题(一):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中。

在这里插入图片描述

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

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

相关文章

WhatsApp被封如何解封?附账号防封技巧

相信各位小伙伴已经发现,WhatsApp新一轮风控已经启动,不少小伙伴已经受到封号潮的冲击。无论是老号还是新号都难以幸免。为了防止WhatsApp客户数据和聊天信息的丢失,针对封号的防封攻略请收藏! 一、WhatsApp被封的8个原因 1、被过…

搭建企业微信知识库,这些注意事项你必须知道

| 企业微信知识库是什么? 简单来说,企业微信知识库就是一个集中存储、管理和分享企业内部信息的置于企业微信中的系统。你可以把它想象成一个超级大的“资料库”,里面装满了公司的各种知识、文档、流程、经验等等。这个“资料库”不仅方便员工…

篮球论坛系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文(设计)学生选题参考合集推荐收藏(包含Springboot、jsp、ssmvue等技术项目合集) 目录 1. …

八大技术趋势案例(人工智能物联网)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

酒店能源监测管理系统:实现节能减排与提升管理效率的利器

随着全球能源问题的日益突出和可持续发展理念的深入人心,酒店业也在积极探索节能减排的途径。在这一背景下,酒店能源监测管理系统应运而生,成为了酒店行业提升管理效率、降低能源消耗的重要工具。本文将从多个角度介绍酒店能源监测管理系统的…

qt学习第三天,qt设计师的第一个简单案例

3月25,应用qt设计师,手动设计界面形状 ​ 如何启动qt设计师,找到对应的安装地点,对应你自己安装的pyside6或其他qt的安装路径来找 ​ 应用qt设计师的优点是不用敲代码然后慢慢调节框框大小,位置等、可以直接修改…

6.RGB转YCbcr

1.方法 RGB转灰度有很多种方式   1.将RGB中任意分量拿出来当做灰度值。   2.取RGB三通道的均值来当灰度值。   3.将RGB转YUV(YCbCr)然后取Y分量作为灰度值。   其余的几种实现方式较为简单,这里不做介绍。重点实现RGB转YCbCr。 1.1 YUV(YCbCr)格式 Y表示亮…

【检索增强】Retrieval-Augmented Generation for Large Language Models:A Survey

简述 本文将RAG搜索范式分成了三类:朴素RAG、高级RAG和模块化RAG 从模块化RAG来看,朴素RAG是只有读取和检索模块,高级RAG除了朴素RAG中的读取和检索模块外,还具有重写和重排模块。 从某种程度上来说,朴素RAG是高级RA…

Kubernetes(K8S)学习(三):K8S实战案例

K8S实战案例 一、部署wordpressmysql(NodePort方式)(1)创建命名空间:wordpress(2)创建wordpress-db.yaml文件(mysql)(3)创建pod:mysql…

2024/03/28(C++·day4)

一、思维导图 二、练习题 1、写出三种构造函数&#xff0c;算术运算符、关系运算符、逻辑运算符重载尝试实现自增、自减运算符的重载 #include <iostream>using namespace std;// 构造函数示例 class MyClass { private:int data; public:// 默认构造函数MyClass() {da…

企微侧边栏开发(内部应用内嵌H5)

一、背景 公司的业务需要用企业微信和客户进行沟通&#xff0c;而客户的个人信息基本都存储在内部CRM系统中&#xff0c;对于销售来说需要一边看企微&#xff0c;一边去内部CRM系统查询&#xff0c;比较麻烦&#xff0c;希望能在企微增加一个侧边栏展示客户的详细信息&#xf…

Autodesk Maya 2025---智能建模与动画创新,重塑创意工作流程

Autodesk Maya 2025是一款顶尖的三维动画软件&#xff0c;广泛应用于影视广告、角色动画、电影特技等领域。新版本在功能上进行了全面升级&#xff0c;新增了对Apple芯片的支持&#xff0c;建模、绑定和角色动画等方面的功能也更加出色。 在功能特色方面&#xff0c;Maya 2025…