一文流:JVM精讲(多图提醒⚠️)
一文流系列是作者苦于技术知识学了-忘了,背了-忘了的苦恼,决心把技术知识的要点一笔笔✍️出来,一图图画出来,一句句讲出来,以求刻在🧠里。
该系列文章会把核心要点提炼出来,以求掌握精髓,至于其他细节,写在文章里,留待后续回忆。
目前进度请查看:
:::info
https://www.yuque.com/u1949579/vtk1e4/fuq6986htl8yy9bg?singleDoc# 《我的技术栈-思维导图》
:::
猛图开局,自己看去吧。
引用自:Java虚拟机-JVM初识(体系结构, 栈stack, 堆heap, GC, Jprofiler,JVM参数 )_jvm total-CSDN博客
JVM是个啥?
JVM(Java Virtual Machine)是 Java 程序运行的核心组件,它提供了一个独立于硬件和操作系统的执行环境,使得 Java 程序能够在不同平台上具有跨平台的特性。
JVM 主要实现商:
JVM 实现 | 开发商 | 特点 | 支持的操作系统 | 应用场景 |
---|---|---|---|---|
HotSpot VM | Oracle | 性能优化出色,广泛应用,具有自适应优化技术,不断迭代更新。 | Windows、Linux、Mac OS 等多种主流操作系统 | 适用于各类企业级应用、桌面应用以及服务器端应用开发,是 Java 应用的主流选择。 |
OpenJDK | 开源社区(Oracle 主导) | 开源免费,与 HotSpot VM 有紧密联系,代码开源利于社区贡献和定制化开发。 | 多种操作系统,与 HotSpot VM 兼容的系统基本都支持 | 在开源项目、学术研究以及对成本敏感且需要自主定制的场景中广泛应用,也是许多 Linux 发行版默认的 JVM 选择。 |
JRockit | BEA Systems(后被 Oracle 收购) | 专注于服务器端应用性能,在大规模并发和高性能计算场景下表现优异,有专门的优化策略。 | 主要支持 Linux、Solaris、Windows 等服务器常用操作系统 | 在企业级服务器应用中,特别是对性能和稳定性要求极高的关键业务系统中发挥优势,不过目前已逐渐被 HotSpot 融合和取代。 |
IBM J9 VM | IBM | 针对 IBM 硬件和软件生态系统有较好的适配性和优化,具有良好的稳定性和性能,支持多种编程语言。 | AIX、Linux、Windows、z/OS 等 IBM 相关操作系统以及其他一些主流系统 | 常用于 IBM 的服务器产品、企业级解决方案以及金融等行业的关键业务系统,与 IBM 硬件和软件紧密集成,提供整体解决方案。 |
JVM 主要构成及其作用(了解即可)
JVM主要由类加载器系统,运行时数据区,执行引擎和本地方法接口/库 四部分组成。下面的脑图详细介绍了其详细结构和主要作用说明。
JVM工作流程(掌握)
上图展示了主要工作流程的交互关系。下面介绍下简要的工作流程,特别容易考察的点会单独列出来说明。
- 编译:.java 文件经过编译形成.class 文件
基本流程:词法分析 -> 语法分析 -> 语义分析 -> 字节码生成 【不必理会】
- 加载:类加载器查找并加载.class文件并将类相关信息存储到元空间(JDK7:方法区)
流程参考:JVM类加载运行全过程
- 执行:字节码执行,将.class中的java字节码解释/JIT成操作系统可识别的机器码
- 运行时:运行时数据区管理、内存分配与垃圾回收阶段(与字节码执行阶段交叉进行)
- 结束:程序结束
类加载的双亲委派机制(重要)
在加载一个类时,类加载器会先将加载请求委托给它的父加载器,只有当父加载器无法完成加载时,才会由自己去加载。这种机制可以保证 Java 核心类库的一致性和安全性,避免类加载冲突(完全限定名必须唯一)。
eg1. 加载 java.util.List.class
提交 -> UserClassLoader.loadClass(java.util.List.class);
委托 --> ApplicationClassLoader.loadClass(java.util.List.class);
委托 —> ExtensionClassLoader.loadClass(java.util.List.class);
委托 ----> BootsratpClassLoader.loadClass(java.util.List.class); 加载成功!
对应代码:
// ClassLoader 类代码,示例用途已删除部分代码
public abstract class ClassLoader {protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// 从内存中查找已经加载过的类Class<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {// 查找父类, 优先由父类加载if (parent != null) {c = parent.loadClass(name, false);} else {// 这里注意BootstrapClassLoader不是java实现的// 所以层级结构没办法在java维护,需要调用native方法。c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {}if (c == null) {// 如果仍然查找不到类,则由当前加载器查找类long t1 = System.nanoTime();c = findClass(name);}}if (resolve) {resolveClass(c);}return c;}}
}
类加载时静态成员/代码块的执行(重要)
类的静态变量和静态代码块会在类加载的准备阶段和初始化阶段进行处理。
- 在准备阶段,静态变量会被赋初始值(零值)
- 初始化阶段,会按照代码编写的顺序执行静态变量的赋值语句和静态代码块。
// 假如类中声明
public static int num = 10;
// 类加载。准备阶段 -> 元空间
num = 0;//0是int类型的初始值
// 类加载。初始化阶段 -> new 或访问类,比如访问类的静态方法
注意:静态变量赋值先于静态代码块执行。
类加载器的自定义和隔离性(了解即可)
自定义的类加载器,可以自行实现 ClassLoader 以实现加载同名的Java,这常用于加载自定义插件。
如下案例:
- 先编译类
kern@MBP plugins % javac p1/cn/kern/demo/local/classloader/PluginObject.java
kern@MBP plugins % javac p2/cn/kern/demo/local/classloader/PluginObject.java
kern@MBP plugins % ll p1/cn/kern/demo/local/classloader/PluginObject.class
-rw-r--r-- 1 kern staff 229 Dec 12 14:55 p1/cn/kern/demo/local/classloader/PluginObject.class
kern@MBP plugins % ll p2/cn/kern/demo/local/classloader/PluginObject.class
-rw-r--r-- 1 kern staff 229 Dec 12 14:55 p2/cn/kern/demo/local/classloader/PluginObject.class
对应的类,相同的名字,不同的存放地方和实现。
// 去掉部分代码
public class PluginObject {static long time;static {time = new Date().getTime();}public void hello() {System.out.println("I'm P1 Plugin Object, loaded at " + time);}
}
// 去掉部分代码
public class PluginObject {static long time;static {time = new Date().getTime();}public void hello() {System.out.println("I'm P2 Plugin Object, loaded at " + time);}
}
- 实现自定义ClassLoader
public class MyClassLoader extends ClassLoader {private final String classPath;public MyClassLoader(String classPath) {this.classPath = classPath;}// 重写 findClass 方法@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] classData = loadClassData(name);if (classData == null) {throw new ClassNotFoundException();}return defineClass(name, classData, 0, classData.length);}// 自定义读取类数据的方法protected byte[] loadClassData(String name) throws ClassNotFoundException {try {// 将包名中的 . 替换为路径分隔符 /String fileName = classPath + name.replace</
相关文章:

一文流:JVM精讲(多图提醒⚠️)
一文流系列是作者苦于技术知识学了-忘了,背了-忘了的苦恼,决心把技术知识的要点一笔笔✍️出来,一图图画出来,一句句讲出来,以求刻在🧠里。 该系列文章会把核心要点提炼出来,以求掌握精髓,至于其他细节,写在文章里,留待后续回忆。 目前进度请查看: :::info https:/…...

python 分段拟合笔记
效果图: 源代码: import numpy as np import cv2 import matplotlib.pyplot as plt from numpy.polynomial.polynomial import Polynomialdef nihe(x_points,y_points,p_id):# 按照 p_id 将 points 分成两组group_0_x = []group_0_y = []group_1_x = []group_1_y = []for i, …...

Mysql索引类型总结
按照数据结构维度划分: BTree 索引:MySQL 里默认和最常用的索引类型。只有叶子节点存储 value,非叶子节点只有指针和 key。存储引擎 MyISAM 和 InnoDB 实现 BTree 索引都是使用 BTree,但二者实现方式不一样(前面已经介…...

数据结构——队列的模拟实现
大家好,上一篇博客我带领大家进行了数据结构当中的栈的模拟实现 今天我将带领大家实现一个新的数据结构————队列 一:队列简介 首先来认识一下队列: 队列就像我们上学时的排队一样,有一个队头也有一个队尾。 有人入队的话就…...

在window环境下安装openssl生成钥私、证书和签名,nodejs利用express实现ssl的https访问和测试
在生成我们自己的 SSL 证书之前,让我们创建一个简单的 Express应用程序。 要创建一个新的 Express 项目,让我们创建一个名为node-ssl -server 的目录,用终端cmd中进入node-ssl-server目录。 cd node-ssl-server 然后初始化一个新的 npm 项目…...
Redis 最佳实践
这是以前写下来的文章,发出来备份一下 Redis 在企业中的最佳实践可以帮助提高性能、可用性和数据管理效率。以下是一些推荐的做法: 选择合适的数据结构: 根据需求选择适当的 Redis 数据结构(如 Strings、Lists、Sets、Hashes、So…...

网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...

从客户跟进到库存管理:看板工具赋能新能源汽车销售
在新能源汽车市场日益扩张的今天,门店销售管理变得更加复杂和重要。从跟踪客户线索到优化订单流程,再到团队协作,效率低下常常成为许多门店的“隐形成本”。如果你曾为销售流程不畅、客户管理混乱而苦恼,那么一种简单直观的工具—…...

算法时间空间复杂度的计算
一、时间复杂度 :找循环最内层 二、空间复杂度: 1.找int float等变量 2.递归调用:空间复杂度递归调用的深度 int 型变量: 四个字节...

人才画像系统如何支撑企业的人才战略落地
在当今竞争激烈的商业环境中,企业的人才战略对于其长期发展至关重要。为了有效实施人才战略,企业需要一套精准、高效的人才管理工具,而人才画像系统正是满足这一需求的关键解决方案。本文将探讨人才画像系统如何支撑企业的人才战略落地&#…...

[数据结构] 链表
目录 1.链表的基本概念 2.链表的实现 -- 节点的构造和链接 节点如何构造? 如何将链表关联起来? 3.链表的方法(功能) 1).display() -- 链表的遍历 2).size() -- 求链表的长度 3).addFirst(int val) -- 头插法 4).addLast(int val) -- 尾插法 5).addIndex -- 在任意位置…...

三格电子——新品IE103转ModbusTCP网关
型号:SG-TCP-IEC103 产品概述 IE103转ModbusTCP网关型号SG-TCP-IEC103,是三格电子推出的工业级网关(以下简称网关),主要用于IEC103数据采集、DLT645-1997/2007数据采集,IEC103支持遥测和遥信,可…...

遥感影像目标检测:从CNN(Faster-RCNN)到Transformer(DETR
我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…...
深入详解神经网络基础知识——理解前馈神经网络( FNN)、卷积神经网络(CNN)和循环神经网络(RNN)等概念及应用
深入详解神经网络基础知识 深度学习作为人工智能(AI)的核心分支之一,近年来在各个领域取得了显著的成果。从图像识别、自然语言处理到自动驾驶,深度学习技术的应用无处不在。而深度学习的基础,神经网络,是理…...
react 项目打包二级目 使用BrowserRouter 解决页面刷新404 找不到路由
使用BrowserRouter package 配置 (这部分代码可以不做配置也能实现) {"homepage": "/admin",}vite.config 配置 export default defineConfig({base: /admin])BrowserRouter 添加配置项 <BrowserRouter basename/admin>&l…...

EasyPlayer.js播放器Web播放H.265要兼顾哪些方面?
在数字化时代,流媒体技术已经成为信息传播和娱乐消费的重要方式。随着互联网技术的飞速发展和移动设备的普及,流媒体服务正在重塑我们的生活和工作方式。从视频点播、在线直播到音乐流媒体,流媒体技术的广泛应用不仅改变了内容的分发和消费模…...

使用 acme.sh 申请域名 SSL/TLS 证书完整指南
使用 acme.sh 申请域名 SSL/TLS 证书完整指南 简介为什么选择 acme.sh 和 ZeroSSL?前置要求安装过程 步骤一:安装 acme.sh步骤二:配置 ZeroSSL 证书申请 方法一:手动 DNS 验证(推荐新手使用)方法二…...

睡岗和玩手机数据集,4653张原始图,支持YOLO,VOC XML,COCO JSON格式的标注
睡岗和玩手机数据集,4653张原始图,支持YOLO,VOC XML,COCO JSON格式的标注 数据集分割 训练组70% 3257图片 有效集20% 931图片 测试集10% 465图片 预处理 没有采用任何预处…...
[Unity] 【VR】【游戏开发】在VR中使用New Input System获取按键值的完整教程
在使用Unity开发VR项目时,推荐使用 New Input System 来处理输入操作。相比于旧的Input系统,New Input System更加灵活、功能强大,尤其在处理VR控制器的按键输入时具有明显优势。本文将详细介绍如何在VR项目中使用New Input System获取按键值,并通过代码示例和图文讲解,帮…...

网络安全渗透有什么常见的漏洞吗?
弱口令与密码安全问题 THINKMO 01 暴力破解登录(Weak Password Attack) 在某次渗透测试中,测试人员发现一个网站的后台管理系统使用了非常简单的密码 admin123,而且用户名也是常见的 admin。那么攻击者就可以通过暴力破解工具&…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...

相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...