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

news2024/11/24 14:33:26

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

请你讲讲在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.coloradmin.cn/o/1553190.html

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

相关文章

灰色预测模型以及matlab软件使用

1,灰色系统简介 著名学者邓聚龙教授于20世纪70年代末、80年代初提出: “ The诞生标志:邓教授第一篇灰色系统论文Control Problems of Grey Systems”,发表于北荷兰出版公司期刊 System & Control Letter,1982, No.5. 1.1 灰色系统&…

C语言数据输出和输入介绍

在C语言中,数据的输出和输入是程序与用户或外部环境进行交互的重要方式之一。通过数据的输出,程序可以向用户展示信息或结果;通过数据的输入,程序可以获取用户提供的数据或参数。本文将深入介绍C语言中数据输出和输入的相关知识&a…

定时器的原理和应用

#include<reg51.h> unsigned char s[]{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned char count0,num0; void inittimer() {TMOD0x01;//0000 0001TH0(65536-50000)/256; //定时50ms50000us 2562^8 初值向右边移动8位TL0(65536-50000)%256;ET01;//开启定…

Stable Diffusion WebUI 生成参数:脚本(Script)——提示词矩阵、从文本框或文件载入提示词、X/Y/Z图表

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 在本篇文章中,我们将深入探讨 Stable Diffusion WebUI 的另一个引人注目的生成参数——脚本(Script)。我们将逐一细说提示词矩阵、从文本框或文件导入提示词,…

Linux学习:进程(3)与 环境变量

目录 1. 进程的优先级1.1 什么是进程的优先级1.2 优先级的具体表示与查看方式 2. 进程的切换与调度2.1 切换2.2 调度 3. 环境变量3.1 main参数/命令行参数3.2 什么是环境变量3.3 环境变量的使用与特性3.5 本地变量与环境变量的脚本配置文件 1. 进程的优先级 在计算机运行的过程…

前端基础知识html

一.基础标签 1.<h1>-<h6>:定义标题&#xff0c;h最大&#xff0c;h最小 2.<font>&#xff1a;定义文本的字体&#xff0c;尺寸&#xff0c;颜色 3.<b>&#xff1a;定义粗体文本 4.<i>&#xff1a;定义斜体文本 5.<u>&#xff1a;定义文本下…

SPDZ基础使用手册(深度学习视角)

基本类型 深度学习中最常使用的便是秘密定点数sfix&#xff0c;有关定点数的高级运算协议请参阅Paper: Secure Computation With Fixed-Point Numbers. 容器类型 SPDZ的深度学习框架主要基于TensorFlow实现&#xff0c;其中使用的容器是张量Tensor&#xff0c;在库中的定义如下…

如何提bug?

很多公司都有提bug的标准&#xff0c;对于新人刚介入测试行业时&#xff0c;提bug的时候&#xff0c;描述的清晰与否就很重要&#xff0c;那一个很明朗清晰的bug应该包含那些呢&#xff1f; bug包含的要素有那些&#xff1f;&#xff08;以jira工具为例&#xff09; 1、项目名…

Parade Series - SVG Resource

iconfont https://www.iconfont.cn/?spma313x.search_index.i3.2.74e53a819tkkcG音符 <div class"form-group"><a href"Javascript:reload();" class"btn btn-icon btn-outline-light btn-block" style";"><svg t&q…

docker logs 查找日志常用命令

docker logs 是什么 docker logs 是 Docker 命令行工具提供的一个命令&#xff0c;用于查看容器的日志输出。它可以显示容器在运行过程中生成的标准输出&#xff08;stdout&#xff09;和标准错误输出&#xff08;stderr&#xff09;&#xff0c;帮助用户诊断容器的行为和排查…

Spring boot 发送文本邮件 和 html模板邮件

Spring boot 发送文本邮件 和 html模板邮件 提示&#xff1a;这里使用 spring-boot-starter-mail 发送文本邮件 和 html模板邮件 文章目录 Spring boot 发送文本邮件 和 html模板邮件一、开启QQ邮箱里的POP3/SMTP服务①&#xff1a;开启步骤 二、简单配置①&#xff1a;引入依赖…

【Linux 驱动基础】Linux platform平台设备驱动

# 前置知识 总线驱动模型简介&#xff1a; 总线是处理器与一个或者多个设备之间的通道&#xff0c;在设备模型中&#xff0c;所有的设备都是通过总线相连&#xff0c;当然也包括虚拟的 platform 平台总线。 总线驱动模型中有三要素&#xff1a; 1. 总线 /*** struct bus_ty…

RTSP应用:实现视频流的实时推送

在实现实时视频流推送的项目中&#xff0c;RTSP&#xff08;Real Time Streaming Protocol&#xff09;协议扮演着核心角色。本文将指导你通过安装FFmpeg软件&#xff0c;下载并编译live555&#xff0c;以及配置ffmpeg进行视频流推送&#xff0c;来实现一个基本的RTSP流媒体服务…

05-JavaScript对象

1. 对象 1.1 对象的相关概念 什么是对象&#xff1f; 在 JavaScript 中&#xff0c;对象是一组无序的相关属性和方法的集合&#xff0c;所有的事物都是对象&#xff0c;例如字符串、数值、数组、函数等。 对象是由属性和方法组成的。 属性&#xff1a;事物的特征&#xff0c;…

Fantasy Forest Environment

此包包含120多个预制件,您需要创建风格化的森林环境:从树木、灌木丛到岩石和蘑菇。演示场景有夏季、秋季和冬季变体! 下载:​​Unity资源商店链接资源下载链接 效果图:

Java八股文(JVM)

Java八股文のJVM JVM JVM 什么是Java虚拟机&#xff08;JVM&#xff09;&#xff1f; Java虚拟机是一个运行Java字节码的虚拟机。 它负责将Java程序翻译成机器代码并执行。 JVM的主要组成部分是什么&#xff1f; JVM包括以下组件&#xff1a; ● 类加载器&#xff08;ClassLoa…

Linux应用实战之网络服务器(三)CSS介绍

0、前言 准备做一个Linux网络服务器应用实战&#xff0c;通过网页和运行在Linux下的服务器程序通信&#xff0c;这是第三篇&#xff0c;介绍一下CSS&#xff0c;优化上一篇文章中制作的HTML页面。 1、CSS常用语法 CSS&#xff08;层叠样式表&#xff09;是用于描述HTML或XML…

数据库原理与应用(SQL Server)笔记 关系数据库

目录 一、关系数据库的基本概念&#xff08;一&#xff09;关系数据库的定义&#xff08;二&#xff09;基本表、视图&#xff08;三&#xff09;元组、属性、域&#xff08;四&#xff09;候选码、主码、外码 二、关系模型三、关系的完整性&#xff08;一&#xff09;实体完整…

Android Studio控制台输出中文乱码问题

控制台乱码现象 安卓在调试阶段&#xff0c;需要查看app运行时的输出信息、出错提示信息。 乱码&#xff0c;会极大的阻碍开发者前进的信心&#xff0c;不能及时的根据提示信息定位问题&#xff0c;因此我们需要查看没有乱码的打印信息。 解决步骤&#xff1a; step1: 找到st…

阿里通义千问Qwen1.5开源MoE模型

介绍 2024年3月28日&#xff0c;阿里团队推出了Qwen系列的首个MoE模型&#xff0c;Qwen1.5-MoE-A2.7B。它仅拥有27亿个激活参数&#xff0c;但其性能却能与当前最先进的70亿参数模型&#xff0c;如Mistral 7B和Qwen1.5-7B相媲美。相较于包含65亿个Non-Embedding参数的Qwen1.5-…