JVM 02

今天是2025/03/23 19:07 day 10

总路线请移步主页Java大纲相关文章

今天进行JVM 3,4 个模块的归纳

首先是JVM的相关内容概括的思维导图

3. 类加载机制

加载过程
  1. 加载(Loading)

    • 通过类全限定名获取类的二进制字节流(如从JAR包、网络、动态代理生成等)。

    • 将字节流转化为方法区的运行时数据结构,生成Class对象作为访问入口。

  2. 验证(Verification)

    • 文件格式验证:检查魔数、版本号等是否符合JVM规范。

    • 元数据验证:语义校验(如是否有父类、是否继承final类等)。

    • 字节码验证:确保代码逻辑合法(如类型转换、跳转指令)。

    • 符号引用验证:确保符号引用能正确解析到目标类/方法/字段。

  3. 准备(Preparation)

    • 静态变量(static修饰)分配内存(方法区),并赋默认零值(如int=0,引用=null)。

    • 若字段被final修饰且是基本类型/字符串常量,直接赋程序设定的初始值(无需等到初始化阶段)。

  4. 解析(Resolution)

    • 将常量池中的符号引用(类、方法、字段的间接引用)替换为直接引用(内存地址偏移量)。

    • 解析可能发生在初始化之前(静态绑定)或之后(动态绑定,如虚方法调用)。

  5. 初始化(Initialization)

    • 执行类构造器<clinit>()方法,合并类中所有静态变量的赋值动作和静态代码块。

    • JVM保证父类的<clinit>()先于子类执行。

    • 初始化是触发类加载的最终步骤(如new、反射调用、主类加载等)。


类加载器
  1. 启动类加载器(Bootstrap ClassLoader)

    • 由C++实现,加载JAVA_HOME/lib下的核心类库(如rt.jar)。

    • 唯一不继承ClassLoader的加载器,Java代码中无法直接引用。

  2. 扩展类加载器(Extension ClassLoader)

    • Java实现,加载JAVA_HOME/lib/ext目录的扩展类。

    • sun.misc.Launcher$ExtClassLoader的实例。

  3. 应用程序类加载器(Application ClassLoader)

    • 加载用户类路径(ClassPath)下的类,是默认的类加载器。

    • sun.misc.Launcher$AppClassLoader实现。

  4. 自定义类加载器

    • 继承ClassLoader类,重写findClass()方法,实现从特定路径加载类。

    • 典型场景:热部署、模块化加载、加密类文件解密。


双亲委派模型
  • 工作原理: 子加载器收到加载请求后,先委派父加载器尝试加载,父加载器无法完成时,子加载器才自行加载。

  • 优点

    • 避免类重复加载(如java.lang.Object只会由Bootstrap加载一次)。

    • 防止核心类被篡改(自定义的java.lang.String不会被加载)。

  • 打破双亲委派

    • SPI机制(如JDBC驱动加载):使用线程上下文类加载器(TCCL)逆向委派。

    • OSGi模块化:自定义类加载器实现网状委派。


4. 执行引擎

解释器(Interpreter)
  • 逐行解释执行字节码,无需等待编译,启动速度快。

  • 适用于短生命周期或低频执行的代码(如一次性任务)。


JIT编译器(Just-In-Time)
  1. C1编译器(Client Compiler)

    • 轻量级优化,编译速度快,适合对启动速度敏感的应用(如GUI程序)。

    • 优化手段:方法内联、去虚拟化、冗余消除。

  2. C2编译器(Server Compiler)

    • 深度优化,生成高效本地代码,适合长时间运行的服务端应用。

    • 优化手段:逃逸分析、锁消除、循环展开。

  3. 分层编译(Tiered Compilation)

    • JDK7+默认策略,结合C1和C2:

      • Level 0:解释执行。

      • Level 1~3:C1编译(带基础性能监控)。

      • Level 4:C2编译(激进优化)。

    • 通过-XX:+TieredCompilation启用。


热点代码检测
  • 方法调用计数器:统计方法调用次数,触发JIT编译(阈值:Client模式1500次,Server模式10000次)。

  • 回边计数器:统计循环体执行次数,触发OSR(栈上替换)编译。

  • 热度衰减:计数器半衰期(-XX:CounterHalfLifeTime),避免长期未触发的代码占用资源。


编译优化技术
  1. 方法内联(Inlining)

    • 将小方法(如Getter/Setter)直接嵌入调用处,减少栈帧开销。

    • -XX:MaxInlineSize(默认35字节)控制。

  2. 逃逸分析(Escape Analysis)

    • 判断对象是否仅在方法内部使用(未逃逸),若成立则:

      • 栈上分配:对象直接在栈上分配,避免堆内存压力。

      • 标量替换:将对象拆分为基本类型字段,消除对象头开销。

  3. 锁消除(Lock Elision)

    • 基于逃逸分析,若锁对象未逃逸(线程私有),直接移除同步操作。


本地方法接口(JNI)
  • 允许Java代码调用C/C++编写的本地方法(如native修饰的方法)。

  • 典型场景

    • 操作系统底层操作(如文件IO)。

    • 高性能计算(如矩阵运算)。

  • 缺点

    • 破坏平台无关性。

    • JNI调用开销较大(需切换上下文)。


  • 类加载机制通过双亲委派保障安全性和一致性,支持动态扩展(如SPI)。

  • 执行引擎通过解释器与JIT编译器的协同,平衡启动速度和运行效率,结合逃逸分析等优化技术提升性能。

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

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

相关文章

Python学习笔记(7)关于列表创建,增加,删除

列表 **Python中一切都是对象 存放多个值的连续内存空间 大小可变 增加元素 a a[50]#➕运算符操作&#xff0c;产生了新对象 list.append(x) #将元素x增加至list尾部 list.extend(alist) #将列表alist增加至list尾部 list.insert(index.x) #将元素x插入list指定index位置 …

【图片识别Excel表格】批量将图片上的区域文字识别后保存为表格,基于WPF和阿里云的项目实战总结

一、项目背景 在信息处理和文档管理中,经常会遇到需要从大量图片中提取文字并进行整理的场景。例如,财务部门需要从大量报销票据中提取金额、日期等信息;法务部门需要从合同文档中提取关键条款;教育行业需要从试卷中提取学生的答题内容等。传统的手工处理方式不仅耗时长、…

【C语言】文件操作(详解)

个人主页 今天我们来讲一下有关文件的相关操作&#xff0c;希望看完这篇文章对你有所帮助&#xff0c;大力感谢你对博主的支持&#xff01; 文章目录 ⭐一、为什么使用文件&#x1f389;二、什么是文件2.1 程序文件2.2 数据文件2.3 文件名 &#x1f3a1;三、二进制文件和文本…

数据库中不存在该字段

mybatisplus 定义的类中某些字段是数据库里面没有的&#xff0c;我们可用tablefield(existfalse)来注解&#xff0c;演示如下&#xff1a;

计算机组成原理———I\O系统精讲<1>

本篇文章主要介绍输入输出系统的发展概况 一.输入输出系统的发展概况 1.早期阶段 该阶段的特点是I/O设备与主存交换信息都必须通过CPU 当时的I/O设备有如下几个特点&#xff1a; &#xff08;1&#xff09;每个I\O设备都必须配有一套独立的逻辑电路与CPU相连&#xff0c;用来…

Linux操作系统7- 线程同步与互斥7(RingQueue环形队列生产者消费者模型改进)

上篇文章&#xff1a;Linux操作系统7- 线程同步与互斥6&#xff08;POSIX信号量与环形队列生产者消费者模型&#xff09;-CSDN博客 本篇代码仓库&#xff1a;myLerningCode/l36 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 单生产单消费单保…

全面讲解python的uiautomation包

在常规的模拟鼠标和键盘操作&#xff0c;我们一般使用pyautogui&#xff0c;uiautomation模块不仅能直接支持这些操作&#xff0c;还能通过控件定位方式直接定位到目标控件的位置&#xff0c;而不需要自己去获取对应坐标位置。uiautomation模块不仅支持任意坐标位置截图&#x…

图解CNN、RNN、LSTM

一、CNN 二、RNN 三、LSTM 以上笔记参考自b站up主 自然卷小蛮&#xff08;自然卷小蛮的个人空间-自然卷小蛮个人主页-哔哩哔哩视频&#xff09;&#xff0c;感兴趣的可以去深入了解。

3.25学习总结 抽象类和抽象方法+接口+内部类+API

抽象类和抽象方法&#xff1a; 有抽象方法&#xff0c;那么类肯定是抽象类。父类不一定是抽象的&#xff0c;但如果父类中有抽象方法那一定是抽象类。 如果子类中都存在吃这个行为&#xff0c;但吃的具体东西不同&#xff0c;那么吃这个行为定义在父类里面就是抽象方法&#x…

Ubuntu22.04 UEFI系统配置Apache Tomcat/8.5.87为开机自动启动

前置条件&#xff0c;Java与Tomcat目录均为/usr/local路径下。 java安装目录为&#xff1a;/usr/local/java tomcat安装目录为&#xff1a;/usr/local/tomcat 1. 创建 Tomcat 专用用户和组&#xff08;可选但推荐&#xff09; # 创建 tomcat 用户组 sudo groupadd tomcat#…

MySQL复习

1基本操作复习 1.1数据库创建 创建数据库create database 数据库名;判断再创建数据库create database if not exists 数据库名;创建数据库指定字符集create database 数据库名 character set 字符集;创建数据库指定排序方式create database 数据库名 collate 排序方式;创建数据…

数据结构—树(java实现)

目录 一、树的基本概念1.树的术语2.常见的树结构 二、节点的定义三、有关树结构的操作1.按照数组构造平衡 二叉搜索树2.层序遍历树3.前、中、后序遍历树(1).前序遍历树(2).中序遍历树(3).后序遍历树(4).各种遍历的情况的效果对比 4.元素添加5.元素删除1.删除叶子节点2.删除单一…

SPI 机制与 Spring Boot AutoConfiguration 对比解析

一、架构效率革命性提升 1.1 类加载效率跃升 Spring Boot 2.7引入的AutoConfiguration.imports采用清单式配置加载&#xff0c;对比传统SPI机制&#xff1a; 传统SPI扫描路径&#xff1a;META-INF/services/** Spring Boot新方案&#xff1a;META-INF/spring/org.springfram…

node-red dashboard

安装&#xff1a; npm install node-red-dashboard 访问&#xff1a; http://127.0.0.1:1880/ui 1. 创建一个新的 Dashboard 页面: 在 Node-RED 编辑器中&#xff0c;拖动一个 ui_dashboard 节点到工作区&#xff0c;并将其连接到你的数据流。 2. 配置 Dashboard 节点: 双击…

深入理解现代C++在IT行业中的核心地位与应用实践

深入理解现代C在IT行业中的核心地位与应用实践 一、C在IT行业中的不可替代性 现代IT行业中&#xff0c;C凭借其零成本抽象和系统级控制能力&#xff0c;在以下关键领域保持不可替代地位&#xff1a; 应用领域C优势体现典型应用案例高性能计算直接内存管理&#xff0c;SIMD指令…

医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)

医院挂号预约小程序 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 &#xff08;1&#xff09; 用户管理 &#xff08;2&#xff09;医院管理 &#xff08;3&#xff09;医生管理 &#xf…

2025最新版Ubuntu Server版本Ubuntu 24.04.2 LTS下载与安装-详细教程,细致到每一步都有说明

官网 https://ubuntu.com/ 下载 点击菜单 Prodercts> Ubuntu OS>Ubuntu Server 点击下载 下载后会有个弹窗 安装 选择第一个 install Ubuntu Server 直接默认&#xff0c;选择English 【默认】 选择键盘布局【默认】 选择安装配置【默认】 配置网络 我这里选择…

【AI】NLP

不定期更新&#xff0c;建议关注收藏点赞。 目录 transformer大语言模型Google Gemma疫情网民情绪识别 整体框架 baseline构建 模型调参、模型优化、其他模型 数据trick、指标优化、magic feature 数据增强、伪标签、迁移学习 模型融合sklearn中TFIDF参数详解 频率阈值可以去掉…

vscode正则表达式使用

小标题 ^\d.\d.\d\s.*$ ^表示匹配字符串的开头。\d\.\d\.\d表示匹配一到多个数字&#xff0c;接着一个小数点&#xff0c;再接着一到多个数字&#xff0c;然后又一个小数点和一到多个数字&#xff0c;用来匹配类似 “2.1.1” 这样的标题号部分。\s表示匹配一个空格。.*表示匹配…

TCP/IP三次握手的过程,为什么要3次?

一&#xff1a;过程 第一次&#xff08;SYN&#xff09;&#xff1a; 客户端发送一个带有SYN标志的TCP报文段给服务器&#xff0c;设置SYN1&#xff0c;并携带初始序列号Seqx&#xff08;随机值&#xff09;&#xff0c;进入SYN_SENT状态。等待服务器相应。 第二次&#xff08…