【JVM】Java八股文之JVM篇

目录

  • 一、JVM类加载与垃圾回收
    • 加载过程
    • 加载机制
      • 优点
      • 图解加载机制
    • 分代回收
      • 分代垃圾回收
      • 新生代垃圾回收
      • 老年代垃圾回收
    • 回收算法

一、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)是一种垃圾回收算法,其基本思想是为每个对象维护一个引用计数器,用于记录当前对象被引用的次数。当引用计数器减少到零时,说明该对象不再被任何其他对象引用,即成为垃圾对象,可以被回收。
    当然这并不理想,因为会出现循环引用。所以引出第二个算法:

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

清除算法

  1. G1 算法

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

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

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

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

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

  1. ZGC 算法

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

特点:

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

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

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

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

相关文章

双纤SFP光模块和单纤SFP光模块之间的区别

双纤SFP光模块和单纤SFP光模块是两种不同的光模块类型。对于网络部署而言,了解它们之间的区别至关重要。本文将深入探讨这两种光模块之间的差异,并介绍其特性和适用场景。 双纤与单纤SFP光模块:它们是什么? 双纤SFP光模块是常用…

回文子串 每日温度 接雨水

647. 回文子串 力扣题目链接 如果s【i】和s【j】相同 dp【i1】【j-1】也是回文串的话 (等于true) 那么dp【i】【j】也是回文串 true 定义一个bool二维数组 遍历顺序是从下到上 从左到右 因为dp【i】【j】是通过dp【i1】【j-1】推出来的 i从最后一…

120.龙芯2k1000-qt(19)-做了一个qt测试界面

主要接口和性能测试,主要针对的是龙芯2k1000. 以下是windows下的截图,大概功能就是这样吧,能想到的都想了一遍。 cpu的温度和频率采集不到,就没有放了。

冒泡排序(六大排序)

冒泡排序 冒泡排序的特性总结: 1. 冒泡排序是一种非常容易理解的排序 2. 时间复杂度:O(N^2) 3. 空间复杂度:O(1) 4. 稳定性:稳定 动图分析: 代码实现: Swap(int*p1,int*p2) {int tmp *p1;*p1*p2…

程序员35岁的职业困惑及应对之道

35岁,对许多程序员来说,是一个职业生涯的重要分水岭。在这个年龄,一些人开始感到迷茫和焦虑,担心自己的技能已经落后,难以跟上日新月异的技术变革。而另一些人则充满信心,认为多年来积累的丰富经验和扎实的技术功底,将助力他们在未来的职业道路上取得新的飞跃。 无疑,在AI、自…

【Flutter 面试题】 Flutter中的路由(Route)是什么?如何在应用程序中实现路由导航?

【Flutter 面试题】 Flutter中的路由(Route)是什么?如何在应用程序中实现路由导航? 文章目录 写在前面口述回答补充说明 写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏…

电商产品效果图渲染用什么工具更方便?

​在电子商务的快速发展中,产品的视觉呈现变得至关重要。对于电商行业的设计师而言,选择一款既便捷又高效的渲染工具,对于快速完成高质量的产品效果图至关重要。特别是对于初学者,工具的直观性和功能性是他们最为关注的焦点。 那…

在线接口文档预言方案

在线接口文档预言方案 要求: ​ 支持自动生成接口文档 ​ 能够支持在线测试(http,websocket) ​ 对代码没有侵入性 一、目前涉及的相关技术收集 sudo apt update #更新数据 sudo apt upgrade #更新软件 sudo apt install openssh-server #下载安装…

鸿蒙HarmonyOS应用开发之Node-API常见问题

ArkTS/JS侧import xxx from libxxx.so后,使用xxx报错显示undefined/not callable 排查.cpp文件在注册模块时的模块名称与so的名称匹配一致。 如模块名为entry,则so的名字为libentry.so,napi_module中nm_modname字段应为entry,大小…

844. 走迷宫 典bfs

AC代码&#xff1a; #include<algorithm> #include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<cmath> using namespace std; const int N 110;int mp[N][N]; int sx,sy; bool vis[N][N]; struct node{i…

2024年热门游泳耳机推荐!公认最佳的4大游泳耳机分享,好用不贵

随着科技的发展&#xff0c;游泳运动已经不仅仅是一项健身活动&#xff0c;更是一种生活方式。在游泳过程中&#xff0c;音乐的陪伴能够让我们更好地享受这项运动&#xff0c;同时也能提高我们的游泳效果。因此&#xff0c;选择一款适合自己的游泳耳机显得尤为重要。 然而&…

嵌入式和 Java 走哪条路?

最近看到一个物联网大三学生的疑问&#xff0c;原话如下&#xff1a; 本人普通本科物联网工程专业&#xff0c;开学大三&#xff0c;现在就很迷茫&#xff0c;不打算考研了&#xff0c;准备直接就业&#xff0c;平时一直在实验室参加飞思卡尔智能车比赛&#xff0c;本来是想走嵌…

BRICK POP展示了有趣的链上游戏玩法与奖励

新游戏BRICK POP将Sui区块链技术与低Gas费用&#xff0c;以及我们在Web3游戏开发方面的专业知识无缝结合。通过充分利用Sui和我们自己的INNO平台的优势&#xff0c;BRICK POP为玩家提供了一个融合了前沿技术和引人入胜游戏的沉浸式游戏体验。BRICK POP游戏设计为实时交易和高用…

配置文件 application properties

配置文件 application properties 1 参数交由配置文件集中管理 Value(“${}”)用于外部配置的属性注入 在之前编写的程序中进行文件上传时&#xff0c;需要调用AliOSSUtils工具类&#xff0c;将文件上传到阿里云OSS对象存储服务当中。而在调用工具类进行文件上传时&#xff0c…

JaveSE—IO流详解:对象输入输出流(序列化及反序列化)

一. 基础理论知识 &#x1f4cc;怎么理解对象输入输出流 &#xff1f; ○ 把java中的对象输出到文件中&#xff0c;从文件中把对象输入到程序中. &#x1f4cc;为什么要这样做(目的) &#xff1f; 当我们创建一个对象时, 如new Student( "小张",20 ); 数据存储在…

【Ucore操作系统】8. 并发

文章目录 【 0. 引言 】0.1 线程定义0.2 同步互斥 【 1. 内核态的线程管理 】1.1 线程概念1.2 线程模型与重要系统调用1.2.1 线程创建系统调用1.2.2 等待子线程系统调用1.2.3 进程相关的系统调用 1.3 应用程序示例1.3.1 系统调用封装1.3.2 多线程应用程序 – threads 1.4 线程管…

STL中 function 源码解析

1. function 本文基于 GCC 9.4 function 的作用就是将各种仿函数的调用统一起来&#xff1b; 1.1 类中非静态成员函数指针为什么是16字节 auto cptr &A::myfunc; 类中非静态成员函数 &#xff0c;其类型为 void (A::*)(int) auto rptr print_num; 普通函数对应汇…

git clone 后如何 checkout 到 remote branch

what/why 通常情况使用git clone github_repository_address下载下来的仓库使用git branch查看当前所有分支时只能看到master分支&#xff0c;但是想要切换到其他分支进行工作怎么办❓ 其实使用git clone下载的repository没那么简单&#x1f625;&#xff0c;clone得到的是仓库…

23种设计模式之创建型模式 - 单例模式

文章目录 一、单例模式1.1单例模式定义1.2 单例模式的特点 二、实现单例模式的方式2.1 饿汉式2.2 懒汉式2.3 双重检查锁&#xff1a;2.4 静态内部类2.5 枚举实现&#xff08;防止反射攻击&#xff09;&#xff1a; 一、单例模式 1.1单例模式定义 单例模式确保系统中某个类只有…