深入理解 JVM(重点:双亲委派模型 + 垃圾回收算法)

news2025/1/31 22:45:49

一、什么是 JVM?

JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。可以认为 JVM 是一台被定制过的现实当中不存在的计算机,Java程序最终是在JVM(Java虚拟机)中运行的。

二、JVM 的执行流程

三、JVM 运行时数据区

  1. 堆(Heap):是Java程序中最大的一块内存区域,用于存储使用new关键字创建的对象实例和数组对象。

  2. 栈(Stack):为每个线程分配单独的栈空间,主要用于存储方法调用时的栈帧、局部变量等。

  3. 方法区(Method Area):主要用于存储类的结构信息(类对象)、方法元信息、常量池、静态变量等。

  4. 程序计数器(Program Counter Register):每个线程都有一个独立的程序计数器,用于存储当前线程正在执行的指令地址或下一条即将执行的指令地址。

四、JVM 类加载机制

1、类加载过程

程序要想运行,就要把依赖的“指令和数据”加载到内存中,这里主要体现为将 .class 文件加载到内存中的过程。总结为5个词就是:

  1. 加载:它通过类加载器(ClassLoader)查找并读取类的字节码文件,将其加载到内存中。加载过程中会生成一个代表该类的Class对象,用于后续操作。
  2. 验证.class文件具有明确的数据格式
  3. 准备:正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。
  4. 解析:是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。
  5. 初始化:主要初始化静态成员、执行静态代码块、加载父类(如果存在父类)等过程。

2、双亲委派模型

在 “加载” 这个过程中涉及到类加载器的概念,JVM 中内置了三个类加载器,构成“双亲委派模型:

  1. BootStrap ClassLoader:负责加载 Java 标准库中的类
  2. Extension ClassLoader:负责加载 Sun、Oracle拓展库的类
  3. Application ClassLoader:负责加载项目中自定义类以及第三方库中的类

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最 终都应该传送到最顶层的类加载器中,只有当父加载器反馈自己无 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。直到在某一层加载完成进入下一环节,如果始终没有找到,则抛出异常:ClassNotFoundException

五、JVM 垃圾回收策略

JVM垃圾回收(Garbage Collection)主要用于回收不再被程序引用的内存对象。而对象又是存储在堆内存上的,因此CG的主要目标就是 ,并且 CG 是以 对象 为单位进行释放的。至于其他内存区域:

:方法调用完毕,方法的栈帧、局部变量就随着出栈操作销毁了。整个栈也是随着线程一起销毁。

方法区:主要存储类对象,很少涉及“卸载”操作。

程序计数器:只是是一个单纯的地址整数,随着线程一起销毁。

1、死亡对象的判断算法

Java堆中存放着所有的对象实例,垃圾回收器在对堆进行垃圾回收前,首先要判断这些对象哪些还存活,哪些已经"死去"。判断对象是否已"死"有主要有如下 2 种算法:

(1)引用计数算法

给对象增加一个引用计数器,每当有一个地方引用它时,计数器就+1;当引用失效时,计数器就-1;任何时刻计数器为0的对象就是不能再被使用的,即对象已"死"。

使用引用计数法判断对象存活的思想很简单,一般情况下判定效率也比较高,但是 引用计数法无法解决对象的循环引用问题。

(2)可达性分析法(Java 采取的方案)

把对象中的引用关系理解为一个树形结构,通过一系列称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,只要能遍历到的对象都是可达的,否则证明此对象是不可用的。

这里的GC Roots包含以下几种:

  1. 栈上引用的对象
  2. 方法区中常量池中引用的对象
  3. 方法区中静态成员引用的对象

虽然可达性分析解决了引用计数法中的 循环引用 问题,但是搜索的过程可能会消耗更多的时间,并且为了防止在搜索的过程中引用关系发生变化,会让一些业务线程暂停工作,也就是产生STW(Stop-The-World)问题。

2、垃圾回收算法

(1)标记清除

"标记-清除"算法是最基础的垃圾回收算法。算法分为"标记"和"清除"两个阶段 : 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

标记清除算法最大的问题是会产生 内存碎片。一般在申请内存时,往往是申请整块连续的空间,而内存碎片会导致空间利用率大打折扣。

(2)复制算法

它将整个可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这块内存需要进行垃圾回收时,会将此区域还存活着的对象复制到另一块上面,然后再把已经使用过的内存区域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情况。

这种算法的缺陷是内存空间的利用率比较低,将最大可用空间减为原来的一般。并且如果可用内存中垃圾很少,需要保留的对象很多,此时复制成本就比较高,效率就会变低。

(3)标记整理

标记整理也可以解决内存碎片的问题,总体思路类似于顺序表删除中间元素,每次将存活对象都向一端移动,然后直接清理掉端边界以外的内存。

标记整理算法,由于每次需要挪动,因此导致效率降低。

(4)分代回收(JVM 采用)

分代算法是通过区域划分,实现不同区域(阶段)采用不同的垃圾回收策略。大量的经验表明,Java对象大多都具备朝 生夕灭的特性,一般经过一轮扫描就有大量新生代对象死去,如果一个对象存活的时间很长了,那么经验表明他将会持续存活更长的时间。

  1. 新建的对象,会放到伊甸区。当垃圾回收扫描到伊甸区后,绝大部分对象会在第一轮 GC 中被干掉。
  2. 如果伊甸区的对象熬过第一轮 GC,会通过复制算法,将存活的对象拷贝到生存区。
  3. 生存区分为两部分,大小相等,一次使用一半,垃圾回收扫描到生存区,发现垃圾,就使用复制算法,将仍然存活的对象复制到生存区的另一半。
  4. 当生存区的对象熬过若干轮 GC 后,认为年龄增长到一定程度,则进入老年区,会通过复制算法将其拷贝到老年代。
  5. 进入老年代的对象,一般都是存活时间较长的对象,死亡的概率就比新生代中小了很多,因此针对老年代的 GC 频率就会降低很多。如果某次扫描发现老年代中某个对象是垃圾,则直接使用标记整理的方式删除。
  6. 特殊情况:如果某个对象非常大,则直接进入老年代。因为大对象进行复制算法成本比较高,并且大对象不会有很多。

六、Java 虚拟机中的垃圾收集器(了解)

Java虚拟机中的三个垃圾收集器是基于以上算法的具体实现,通常会基于以上做出一些改进和优化。这里主要列举了两个:

  1. CMS(Concurrent Mark-Sweep)垃圾收集器:CMS是一种旨在减少应用程序停顿时间的垃圾收集器。它采用并发标记-清除算法,允许在大部分清除过程中应用程序继续运行。
  1. G1(Garbage-First)垃圾收集器:G1是一种面向服务端应用程序的垃圾收集器,旨在提供可控制的停顿时间和高吞吐量。它使用分代、区域化的垃圾回收策略,可以更精确地控制停顿时间。

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

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

相关文章

Tuxera NTFS for Mac2024最新中文版本下载

如果你想用U盘在Mac和其他设备之间传输文件,可能会遇到一些问题。因为Mac系统支持的U盘格式和其他系统不同,而且苹果电脑对U盘的读写权限也有一定的限制。那么,Mac系统支持什么格式的U盘呢?苹果电脑读写权限怎么开启呢&#xff1f…

前端打包项目上线-nginx

第一步:下载nginx。 直接下载 nginx/Windows-1.25.2 pgp 第二步:解压zip包 第三步:打开文件夹,把http里的路径打开cmd 第四步:打开你的http-server服务,没有下载去下一次就ok了 打开后就可以访问了 第五步…

黑豹程序员-页面录音-在vue页面中进行录音wav/mp3

功能 在vue页面中进行录音wav/mp3 效果图 官网展示页面 https://recorder.zhuyuntao.cn/ 安装组件 npm i js-audio-recorder 测试页面 <template><h3>录音时长&#xff1a;{{ recorder.duration.toFixed(4) }}</h3><el-row><el-button type…

QE01/QA11/QA02屏幕增强

1、业务需求 需要对来料检验增加“合格数量”和“不合格数量”字段&#xff0c;涉及三个增强开发 2、QE01\QE02\QE03\QE51N屏幕增强 增强表 增强点BADI&#xff1a;QEEM_SUBSCREEN_5000 创建程序&#xff0c;包含子屏幕&#xff0c;在增强点中调用 在程序屏幕中绘制字段 在输…

【CNN-GRU预测】基于卷积神经网络-门控循环单元的单维时间序列预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Redux 错误处理

Redux 错误处理 这两天正好收尾一个 Redux 页面的重构&#xff0c;碰到了一些错误处理的方式&#xff0c;这里就写个笔记总结一下碰到的问题和几种处理方式 大体上是分为同步函数和异步函数两个方面去处理 同步函数 这个是指的是直接在 reducer 中进行操作&#xff0c;可以…

基于springboot实现医疗服务系统项目【项目源码+论文说明】计算机毕业设计

摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 医疗服务系统&#xff0c;主要的模块包括查看管理员&#xff1b;首页、个人中心、普通村民管理、乡村医生管理、公告信息管理、乡村诊室管理、…

抖音店铺提供优质服务|成都瀚网科技

抖音是中国领先的电子商务平台。为了帮助商家增加销量和品牌曝光度&#xff0c;抖音推出了精选联盟计划。精选联盟是由优质商家组成的联盟&#xff0c;旨在为消费者提供更多优质、高性价比的产品选择。那么&#xff0c;如何使用抖店开通精选联盟呢&#xff1f;这将在下面详细描…

计算机中了360后缀勒索病毒怎么办?360勒索病毒解密数据恢复

最近一段时间360后缀勒索病毒变得异常嚣张&#xff0c;时不时就会攻击企业的计算机服务器&#xff0c;导致众多的企业服务器被360后缀勒索病毒攻击。360后缀的勒索病毒并非360公司&#xff0c;是黑客专门具有针对性地研发的勒索病毒&#xff0c;通过加密企业的计算机给企业带来…

Docker容器与虚拟化技术:DaoCloud账户注册

目录 一、实验 1.DaoCloud 一、实验 1.DaoCloud &#xff08;1&#xff09;概念 DaoCloud是企业级容器云平台&#xff0c;它提供了一套容器集群解决方案&#xff0c;Daocloud可以管理你的计算资源&#xff0c;包括物理机和公有云环境&#xff0c;你可以在DaoCloud平台上部…

基于springboot实现音乐网站与分享平台项目【项目源码+论文说明】计算机毕业设计

摘要 本论文主要论述了如何使用JAVA语言开发一个音乐网站与分享平台 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述音乐网站与分享平台的当前背景以及系统开…

C++桶排序算法的应用:存在重复元素 III

题目 给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。 找出满足下述条件的下标对 (i, j)&#xff1a; i ! j, abs(i - j) < indexDiff abs(nums[i] - nums[j]) < valueDiff 如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例…

在不安全的集群上启用 Elasticsearch Xpack 安全性

本博文详细描述如何把一个没有启动安全的 Elasticsearch 集群升级为一个带有 HTTPS 访问的启用 Elasticsearch xpack 安全的集群。 为了增强 Elasticsearch 集群的安全性&#xff0c;你需要执行完全集群重启&#xff0c;并在客户端进行一些更改。 启用身份验证后&#xff0c;所…

分析谐波失真

目录 简介 查看非线性的影响 量化非线性失真 降低谐波失真的输入衰减 SNR THD 和 SINAD 当作输入衰减的函数 用于消除失真的后处理 组合方法 总结 此示例说明如何分析在具有噪声的情况下弱非线性系统的谐波失真。 简介 在此示例中&#xff0c;我们将研究放大器的简化模…

推荐动漫《头文字D》

《头文字D》是漫画家重野秀一作画的青年漫画&#xff0c;从1995年开始在《周刊Young Magazine》上连载&#xff0c;于2013年7月29日完结&#xff0c;电子版由漫番漫画连载 [1] 。已被改编成同名动画和电影&#xff0c;还有多本探讨汽车驾驶技巧的周边专书。头文字D漫画刚出版即…

机器学习: 初探 定义与应用场景

机器学习 第一课 初探 定义与应用场景 机器学习 第一课 初探 定义与应用场景机器学习的历史机器学习为什么重要?机器学习的定义机器学习在日常生活中的应用推荐系统语音识别图像识别 商业领域的机器学习金融风险评估股票市场预测客户关系管理 机器学习在医疗领域的应用疾病预测…

9、Docker 安装 Redis

1、下载镜像 docker pull redis:3.2.10 2、本机创建redis目录并修改配置文件 1&#xff09;创建目录 mkdir /usr/local/redis 2&#xff09;进入redis目录 cd /usr/local/redis 3&#xff09;创建data目录 mkdir data 4&#xff09;创建redis.conf文件 vi redis.conf 5&a…

人工智能轨道交通行业周刊-第63期(2023.10.9-10.15)

本期关键词&#xff1a;一体化智慧列车运行系统、车辆数字化运维管理、智能传感器、PHM、LKJ 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro…

数据结构之手撕顺序表(增删查改等)

0.引言 在本章之后&#xff0c;就要求大家对于指针、结构体、动态开辟等相关的知识要熟练的掌握&#xff0c;如果有小伙伴对上面相关的知识还不是很清晰&#xff0c;要先弄明白再过来接着学习哦&#xff01; 那进入正题&#xff0c;在讲解顺序表之前&#xff0c;我们先来介绍…

【HCIP】HCIA复习

目录 大纲 情景代入 访问百度/谷歌服务器的准备工作 1、计算机网络发展第一阶段人机交互的加工过程 2、OSI参考模型 3、TCP/IP参考模型 访问谷歌&#xff08;百度&#xff09;服务器的流程 1、主机需要一个IP地址才能上网&#xff08;本场景中通过DHCP服务获取IP地址&a…