面试总结之JVM入门

news2024/9/29 23:23:16

文章目录

  • 🐒个人主页
  • 🏅JavaEE系列专栏
    • 📖前言:
    • 🎀你为什么要学习JVM?
    • 🎀JVM的作用
  • 🎀JVM的构成(5大类)
    • 🏨1.类加载系统
      • 🐕类什么时候会被加载?
      • 🐕类加载器的分类(具体加载类的执行者)
      • 🐕双亲委派机制
        • 🪀如何打破双亲委派机制呢?
    • 🏨2.运行时数据区
      • 🐕程序计数器
      • 🐕虚拟机栈
      • 🐕本地方法栈
      • 🐕堆 (存储空间)
        • 🧸堆为什么要进行区域划分?(新生代、老年代)
        • 🧸对不同区域垃圾回收的称呼
        • 🧸(堆空间参数设置)jvm调优
      • 🐕方法区
    • 🏨3.本地方法接口
    • 🏨4.执行引擎
    • 🏨5.垃圾回收
      • 🐕Stop the world
      • 🐕垃圾回收的相关算法
        • 🪀垃圾标记阶段
        • 🪀垃圾回收阶段
      • 🐕finalize()方法
      • 🐕垃圾回收器
        • 🪀垃圾回收器的分类
        • 🪀CMS垃圾回收器 ( Concurrent Mark Sweep 并发标记清除 )
        • 🪀G1垃圾回收器(Garbage First)
  • 🐒持续更新...

🐒个人主页

🏅JavaEE系列专栏

📖前言:

本篇博客主要以总结面试中对JVM知识的考察点

🎀你为什么要学习JVM?

通过学习jvm,对程序的运行过程更加的了解,提高自己对编码的认识,扩展自己的知识储备,以提高编码规范。它也是中高级程序员必备的知识技能(项目管理、性能调优),先入门为以后铺路。

🎀JVM的作用

1.将.class字节码文件加载到内存中,负责存储数据
2.将字节码解释/编译成计算机能识别的机器码
3.垃圾回收

🎀JVM的构成(5大类)

  • 类加载系统(将字节码文件加载到JVM中)
  • 运行时数据区(虚拟机栈、堆、方法区、本地方法栈、程序计数器)
  • 本地方法接口(负责调用操作系统提供的本地方法)
  • 执行引擎(将字节码 解释/编译成机器码)
  • 垃圾回收 (回收垃圾数据,释放内存空间)

🏨1.类加载系统

在这里插入图片描述
验证:不包含以final修饰的静态变量,因为会把它视为静态常量

🐕类什么时候会被加载?

  • 在类中运行main()时
  • 创建对象时
  • 使用类中的静态变量
  • 反射class.forName(“类地址”)
  • 初始化子类。导致父类被加载

【注意:final修饰的是常量不会被加载】【 Car[] cars=new Car[10]; 这种情况也不会被加载 】

🐕类加载器的分类(具体加载类的执行者)

大致分为两大类:引导类加载器、其他类加载器(扩展类加载器、应用程序类加载器、用户自定义类加载器)
在这里插入图片描述

🐕双亲委派机制

当加载一个类的时候,会先让上一级类加载器去加载,直到找到引导类加载器,再向下到扩展类加载器中寻找是否可以加载此类,如果不可以,就再向下到应用程序类加载器中找,如果都找不到,就报异常
【好处】:避免了我们自己定义的子类覆盖了系统中的类,双亲委派机制会确保优先调用系统中的类。 eg: (自己定义一个String类,但仍然会调用系统中的String类,而不会调用自己定义的)

🪀如何打破双亲委派机制呢?

可以通过继承ClassLoader类,重写ClassLoader类中的findClass方法,实现自定义类加载。
也可以重写 loadClass 方法(是实现双亲委派逻辑的地方,修改他会破坏双亲委派机制, 不推荐)

eg: Tomcat服务器自定义类加载规则

🏨2.运行时数据区

在这里插入图片描述

🐕程序计数器

特点:内存空间小,jvm中运行速度最快的区域,线程私有的(生命周期同线程一样),不会有内存溢出问题,不会有垃圾回收。
作用:记录此线程正在执行的位置,以便线程切换后继续执行

🐕虚拟机栈

特点:线程私有的,存在内存溢出问题,不会有垃圾回收,用来执行方法,栈的基本单位是栈帧(一个栈帧就是一个方法)
栈帧的结构:(局部变量表、操作数栈、返回方法调用地址…)

🐕本地方法栈

特点:也是线程私有的,存在内存溢出问题,不会有垃圾回收,用来执行本地方法(就是操作系统提供的方法),修饰的关键字是 native,没有方法体。它使用C语言写的。

eg:
Object类中的hashCode() 、clone() 、getClass() 、notify() 、notifyAll()、wait() ;
Thread.start()中有一个start0()本地方法、
FileInputStream的read()方法中调用了read0()本地方法

🐕堆 (存储空间)

存放程序中产生的对象,线程共享,存在堆溢出,是垃圾回收的重点区域。
堆的大小可以调节。
堆区域划分:
在这里插入图片描述

新生代:
🍓伊甸园区:存放刚刚创建的对象
🍓幸存者1区:进行一次GC,存放伊甸园区以及另一个幸存者区存活的对象,清空这两个区域的垃圾
🍓幸存者2区:进行一次GC,存放伊甸园区以及另一个幸存者区存活的对象,清空这两个区域的垃圾

老年代:
存放超过进行15次垃圾回收仍然存活的对象或 大对象(list中有元素,List就是大对象),垃圾回收频率比新生代慢。(默认是15次,最大也是15次,在对象头中分代年龄占4个比特位,可以自己调节参数)

比例关系:【新生代 : 老年代=2 : 1】【伊甸园 : 幸存者1 : 幸存者2= 8 : 1 : 1】

🧸堆为什么要进行区域划分?(新生代、老年代)

根据对象存活的生命周期进行分区,调整不同区域垃圾回收频率,从而提高垃圾回收效率。还可以对不同区域采用不同的垃圾回收器、垃圾回收算法,对算法扬长避短。

🧸对不同区域垃圾回收的称呼

Minor GC :新生代垃圾回收
Major GC :老年代垃圾回收
Full GC :整堆收集(触发条件:老年区满了 或 方法区满了)

🧸(堆空间参数设置)jvm调优

没有调过,它是根据程序运行的实际需要来进行参数设置,来调整各个区间的比例大小

🐕方法区

存储加载到虚拟机的类信息,方法区的大小可以调整参数,
方法区是线程共享的,会存在内存溢出,可以进行垃圾回收,但是条件非常苛刻: 1.该类实例全部回收 2.该类的类加载器已经回收 3.该类没有在任何地方被引用

🏨3.本地方法接口

本地方法是非java方法,是java调用外部环境的方法,
java提供一个接口,让java可以与其他应用进行交互。

🏨4.执行引擎

是jvm中将字节码 解释/编译为机器码的区域模块。
辨析:
前端编译: 将.java文件经过JDK中的javac编译成.class文件
后端编译:将.class文件经过JVM中的执行引擎编译成机器码

解释器:一行一行的执行代码。(效率低,但省去了编译时间) eg: 脚本语言html、python…
JIT编译器: (just in time)(及时编译器)将一段代码作为整体进行编译,将结果缓存起来,直接引用。(编译需要花费时间,执行效率高,适合“热点代码段”)
java采用的是半解释半编译的方式,可以先逐行解释执行,到“热点代码”时再对此编译执行并将结果缓存起来,两者结合使用,提高运行效率。

🏨5.垃圾回收

(【垃圾】没有被任何引用指向的对象成为“垃圾”,它们会占据内存空间)
(【内存溢出】内存满了,空间不足)
(【内存泄漏】我们已经不用的对象无法被垃圾回收,仍然占据着内存,导致内存空间越来越小,严重时可引发“内存溢出”)

🐕Stop the world

简称STW,指GC事件发生的过程中,会产生程序的停顿。(停顿产生时,整个应用程序都会暂停,像拍快照)。原因是GC需要先标记垃圾,为了保证数据一致性,以防出现错标、漏标垃圾的情况。

🐕垃圾回收的相关算法

🪀垃圾标记阶段

主要标记哪些对象是垃圾。

引用计数算法:统计每个对象被引用的次数,从而判断此对象是否是垃圾对象。(没有被使用)
(🎀缺点:
1.需要计数,增加空间开销 2.每次需要更新,增加时间开销。
3.无法处理循环引用问题(P->A->B->C->A,此时只有P是已知的,如果把P断开,ABC就形成了一个孤岛,导致“内存泄漏”)

可达性分析算法:(根搜索算法),有一组“根”对象为起始点,看其他对象是否可达,若不可达则被认为是垃圾对象。
🎀名词解释:
:虚拟机栈中的引用对象、方法区中的静态变量、所有被synchronized持有的锁对象、java系统中的类
引用链:搜索的路径

🪀垃圾回收阶段

回收阶段目前在JVM中三种常见的算法:复制、清除、压缩

复制算法: 类比两块幸存者区,其中一块B是空的,将另一块A的存活的对象复制到B,把A清空,循环往复,内存碎片少
在这里插入图片描述
在这里插入图片描述

清除算法: 存活对象位置不变,用列表记录一下垃圾对象的位置,不会把它们清除掉,下次需要使用此内存空间时,直接覆盖掉。适用于老年区,但因为不移动对象,会产生内存碎片。
在这里插入图片描述

压缩算法: 将存活的对象重新排列到一端,将剩余区域直接清理。无内存碎片。效率低,适合老年区。

🐕finalize()方法

是Object类中提供的方法,对象垃圾回收前会自动调用此方法,并且finalize()方法只会被调用一次,重写finalize()可能复活对象(相当于复活甲),第二次被回收时不会调用finalize(),直接被回收。
为此定义虚拟机中对象三种状态:

可触及的 :就是可达的,有引用指向的
可复活的 :对象所有引用被释放,但是对象可能在finalize()中复活
不可触及的:对象的finalize()被调用,并没有复活

🐕垃圾回收器

真正进行垃圾回收的执行者。

🪀垃圾回收器的分类

按线程数分类:

🎇单线程: 适用于简单小型场景,只有一个线程进行垃圾回收,GC时,其他应用程序停止工作(STW)
🎇多线程:有多个线程进行垃圾回收

按工作模式分类:

🎇独占式:就是STW,当GC工作时,其他线程停止工作
🎇并发式:GC线程可以和其他用户线程同时工作

按年龄分代分类:

🎇新生代:
🎇老年代:

在这里插入图片描述

🪀CMS垃圾回收器 ( Concurrent Mark Sweep 并发标记清除 )

目标:追求低停顿 (首个实现垃圾回收线程与其他用户线程同时工作,但不是所有的都是并发执行的,也会有独占执行的时候)
在这里插入图片描述

CMS垃圾回收过程:
1.初始标记:STW 独占 会暂停其他用户线程
2.并发标记: 并发 会与其他用户线程同时工作
3.重新标记:STW 独占 会暂停其他用户线程
4.并发清除: 并发 会与其他用户线程同时工作

🪀G1垃圾回收器(Garbage First)

适合多核CPU、大内存大型项目 ,它将每个区域(伊甸园、幸存者1、…)又划分成了更小的区域,哪一个区域垃圾数量多,就优先回收哪一个区域,它可以做到整堆收集管理。当然它也可以做到并发执行。

🐒持续更新…

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

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

相关文章

《Docker 简易速速上手小册》第2章 容器和镜像(2024 最新版)

文章目录 2.1 理解 Docker 容器2.1.1 重点基础知识2.1.2 重点案例:使用 Docker 运行 Python 应用2.1.3 拓展案例 1:Docker 中的 Flask 应用2.1.4 拓展案例 2:Docker 容器中的数据分析 2.2 创建与管理 Docker 镜像2.2.1 重点基础知识2.2.2 重点…

k8s(5)

目录 使用Kubeadm安装k8s集群: 初始化操作: 每台主从节点: 升级内核: 所有节点安装docker : 所有节点安装kubeadm,kubelet和kubectl: 修改了 kubeadm-config.yaml,将其传输给…

网络攻防之网络扫描

目录 1、进行ping扫描 2、进行TCP SYN扫描 3、进行TCP全连接扫描 4、进行FIN扫描 5、进行UDP扫描 6、进行操作系统扫描 7、进行主机全面扫描 8、对网络号进行扫描 环境配置拓扑图: 实验前准备 查看kali和靶机的ip地址信息: 查看两台主机是否能互…

vue中循环多个li(表格)并获取对应的ref

有种场景是这样的 <ul><li v-for"(item,index) in data" :key"index" ref"???">{{item}}</li> </ul> //key值在项目中别直接用index&#xff0c;最好用id或其它关键值const data [1,2,3,4,5,6]我想要获取每一个循环并…

数据结构知识点总结-线性表(3)-双向链表定义、循环单链表、、循环双向链表、静态链表、顺序表与链表的比较

双向链表定义 单链表结点中只有一个指向其后继的指针&#xff0c;这使得单链表只能从头结点依次顺序地向后遍历。若要访问某个结点的前驱结点&#xff08;插入、删除操作时&#xff09;&#xff0c;只能从头开始遍历&#xff0c;访问后继结点的时间复杂度为 O(1) &#xff0c; …

详解java类型转换

✨✨ 所属专栏&#xff1a; Java基石&#xff1a;深入探索Java核心基础✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 引言 在Java编程中&#xff0c;类型转换是将一个数据类型的值转换为另一个数据类型的过程。Java中的类型转换主…

Django学习笔记-ModelForm使用(完全依赖)

1.创建模型 ,code,name,sex,entrydate 2.模型映射 python manage.py makemigrations myapp01,python manage.py migrate 3.创建模型表单,继承forms.ModelForm,Meta:元数据,models需引入,fields填写引用的模型变量 4.创建testModelForm.html,添加urls 5.views编写testmodelfo…

前端sql条件拼接js工具

因为项目原因&#xff0c;需要前端写sql&#xff0c;所以弄了一套sql条件拼接的js工具 ​ /*常量 LT : " < ", LE : " < ", GT : " > ", GE : " > ", NE : " ! ", EQ : " ", LIKE : " like &qu…

字典树入门

//本题是一道字典树的模板题 //字典树是一种高效率存储多个字符串的数据结构 //其每个结点的权值代表以该结点结尾的字符串的数量,每条边存储一个字符 //从根结点开始,按某一路径遍历到某一结点,即得到一种字符串,其个数等于当前结点存储的数值 //如从根结点开始,依次走过abc三…

【iOS ARKit】ARWorldMap

ARWorldMap 用于存储 ARSession 检测扫描到的空间信息数据&#xff0c;包括地标&#xff08;Landmark&#xff09;、特征点&#xff08;Feature Point&#xff09;、平面&#xff08;Plane&#xff09;等&#xff0c;以及使用者的操作信息&#xff0c;如使用者添加的 ARAnchor …

【Vue】组件通信组件通信

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;JVM ⛺️稳中求进&#xff0c;晒太阳 组件通信 组件通信&#xff0c;就是指组件与组件之间的数据传递 组件的数据是独立的&#xff0c;无法直接访问其他组件的数据想用其他组件的数据--&…

【深度学习】Pytorch教程(十三):PyTorch数据结构:5、张量的梯度计算:变量(Variable)、自动微分、计算图及其可视化

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09; 2、张量的数学运算1. 向量运算2. 矩阵…

景联文科技:引领战场数据标注服务,赋能态势感知升级

自21世纪初&#xff0c;信息化战争使战场环境变得更为复杂和难以预测&#xff0c;持续涌入的海量、多样化、多来源和高维度数据&#xff0c;加大了指挥员的认知负担&#xff0c;使其需要具备更强的数据处理能力。 同时&#xff0c;计算机技术和人工智能技术的飞速发展&#xff…

EMQX Enterprise 5.5 发布:新增 Elasticsearch 数据集成

EMQX Enterprise 5.5.0 版本已正式发布&#xff01; 在这个版本中&#xff0c;我们引入了一系列新的功能和改进&#xff0c;包括对 Elasticsearch 的集成、Apache IoTDB 和 OpenTSDB 数据集成优化、授权缓存支持排除主题等功能。此外&#xff0c;新版本还进行了多项改进以及 B…

Gemma谷歌(google)开源大模型微调实战(fintune gemma-2b)

Gemma-SFT Gemma-SFT(谷歌, Google), gemma-2b/gemma-7b微调(transformers)/LORA(peft)/推理 项目地址 https://github.com/yongzhuo/gemma-sft全部weights要用fp32/tf32, 使用fp16微调十几或几十的步数后大概率lossnan;(即便layer-norm是fp32也不行, LLaMA就没有这个问题, …

SpringBoot/Java中OCR实现,集成Tess4J实现图片文字识别

场景 Tesseract Tesseract是一个开源的光学字符识别&#xff08;OCR&#xff09;引擎&#xff0c;它可以将图像中的文字转换为计算机可读的文本。 支持多种语言和书面语言&#xff0c;并且可以在命令行中执行。它是一个流行的开源OCR工具&#xff0c;可以在许多不同的操作系…

【Vue3】插槽使用和animate使用

插槽使用 插槽slot匿名插槽具名插槽插槽作用域简写 动态插槽transition动画组件自定义过渡class类名如何使用animate动画库组件动画生命周期appear transition- group过渡列表 插槽slot 插槽就是子组件中提供给父组件使用的一个占位符父组件可以在这个占位符智能填充任何模板代…

pytest-配置项目不同环境URL

pytest自动化中&#xff0c;在不同环境进行测试&#xff0c;可以将项目中的url单独抽取出来&#xff0c;通过pytest.ini配置文件实现&#xff08;类似postman中的“Environments”&#xff09; 使用步骤&#xff1a; 1&#xff09;安装pytest-base-url插件 pytest-base-url …

【Flink精讲】Flink状态及Checkpoint调优

RocksDB大状态调优 RocksDB 是基于 LSM Tree 实现的&#xff08;类似 HBase&#xff09; &#xff0c;写数据都是先缓存到内存中&#xff0c; 所以 RocksDB 的写请求效率比较高。 RocksDB 使用内存结合磁盘的方式来存储数据&#xff0c;每 次获取数据时&#xff0c;先从内存中 …

Mac下载安装配置运行MySQL

一、打开官网 MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 1、根据自己的电脑版本下载相对应的MySQL版本&#xff0c;Mac分为ARM和X86两个不同的架构 ​ 不知道自己电脑是ARM还是X86的&#xff0c;如下操作进行查询 uname -a 我的电脑是…