JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解
JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解
- JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解
- 一、引言
- 二、JVM的组成部分
- 2.1 类加载子系统
- 2.2 运行时数据区
- 2.3 执行引擎
- 2.4 本地接口(Native Interface)
- 三、JVM的运行流程
- 3.1 类加载阶段
- 3.2 程序执行阶段
- 四、程序计数器详解
- 4.1 程序计数器的定义与作用
- 4.2 程序计数器与字节码执行
- 4.3 程序计数器与异常处理
- 4.4 程序计数器的特点与限制
- 五、总结
)
JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解
一、引言
Java虚拟机(Java Virtual Machine,JVM)是Java语言能够实现“一次编写,到处运行”这一特性的关键所在。它如同一个幕后的魔法师,将Java代码转换为可以在不同操作系统和硬件平台上执行的指令。深入了解JVM的组成结构、运行流程以及其中各个组件的功能,对于Java开发者来说至关重要。它不仅有助于我们编写出更高质量、性能更优的代码,还能在遇到问题时,更深入地进行分析和调试。接下来,我们就一起深入探究JVM的奥秘。
二、JVM的组成部分
2.1 类加载子系统
类加载子系统负责加载字节码文件(.class文件)到JVM中。它主要包含以下几个关键组件:
- ClassLoader(类加载器):ClassLoader是类加载子系统的核心,它主要有三种类型:
- 启动类加载器(Bootstrap ClassLoader):它是JVM的内置类加载器,用C++编写(在HotSpot虚拟机中),负责加载Java的核心类库,比如
java.lang
包下的类。它是最顶层的类加载器,加载的路径是Java安装目录下的lib
目录中被虚拟机认可的(按照文件名识别,如rt.jar
等)类库。 - 扩展类加载器(Extension ClassLoader):由Java语言编写,继承自
ClassLoader
类。它负责加载Java的扩展类库,加载路径是Java安装目录下的lib/ext
目录或者由系统变量java.ext.dirs
指定的路径中的类库。 - 应用程序类加载器(Application ClassLoader):也称为系统类加载器,同样由Java语言编写。它负责加载应用程序classpath路径下的类库,我们编写的应用程序代码基本都是由这个类加载器来加载的。
- 启动类加载器(Bootstrap ClassLoader):它是JVM的内置类加载器,用C++编写(在HotSpot虚拟机中),负责加载Java的核心类库,比如
- Class文件:Class文件是Java源文件经过编译器编译后生成的字节码文件,它包含了类的元数据信息(如类名、父类名、接口名、字段信息、方法信息等)、常量池、字节码指令等内容。这些信息是类加载子系统加载和解析的对象。
- 运行时数据区:类加载子系统将Class文件加载到JVM后,会在运行时数据区中为类分配相应的内存空间,存储类的相关信息,比如在方法区中存储类的元数据,在堆中分配对象实例(如果该类有对象被创建的话)。
2.2 运行时数据区
运行时数据区是JVM在运行时管理内存的核心区域,它主要包括以下几个部分:
- 堆(Heap):堆是JVM中最大的一块内存区域,被所有线程共享。它的主要作用是存放对象实例和数组。几乎所有的对象实例都在堆上分配内存。堆可以分为新生代和老年代,新生代又可以进一步细分为伊甸园区(Eden Space)、幸存0区(Survivor 0 Space)和幸存1区(Survivor 1 Space)。对象首先会在伊甸园区分配内存,当伊甸园区空间不足时,会触发Minor GC(新生代垃圾回收),将存活的对象移动到幸存区,经过多次GC后,如果对象仍然存活,会被晋升到老年代。堆的大小可以通过JVM参数(如
-Xmx
设置最大堆大小,-Xms
设置初始堆大小)进行调整。 - 方法区(Method Area):方法区也是被所有线程共享的区域,用于存储已被加载的类的元数据信息(如类的结构信息、常量池、静态变量、即时编译器编译后的代码缓存等)。在Java 8之前,方法区的实现是永久代(PermGen),从Java 8开始,使用元空间(Meta - Space)来替代永久代。元空间使用本地内存,其大小不再受限于
-XX:MaxPermSize
参数,而是受限于系统的可用内存。 - Java栈(Java Stack):Java栈是线程私有的,它描述的是Java方法执行的内存模型。每个方法在执行时都会创建一个栈帧(Stack Frame),栈帧中存储了局部变量表、操作数栈、动态链接、方法返回地址等信息。当方法被调用时,对应的栈帧入栈,方法执行完毕后,栈帧出栈。Java栈的大小可以通过
-Xss
参数进行设置。 - 本地方法栈(Native Method Stack):本地方法栈与Java栈类似,也是线程私有的,它主要用于支持Native方法的执行。当Java程序调用Native方法(通常是用C或C++编写的本地代码)时,会在本地方法栈中创建相应的栈帧来管理方法的执行。
- 程序计数器(Program Counter Register):程序计数器也是线程私有的,它记录了当前线程所执行的字节码指令的地址(行号)。在多线程环境下,每个线程都有自己独立的程序计数器,这样当线程切换时,能够保证线程继续正确地执行。
2.3 执行引擎
执行引擎是JVM的执行核心,它负责执行加载到JVM中的字节码指令。执行引擎主要包含以下几个组件:
- 解释器(Interpreter):解释器会逐条读取字节码指令,并将其解释为对应平台的机器码并执行。它的优点是启动速度快,因为不需要进行额外的编译工作,但执行效率相对较低,因为每次执行都需要解释。
- 即时编译器(Just - In - Time Compiler,JIT):即时编译器会在运行时将热点代码(被频繁执行的代码)编译成机器码,这样在后续执行时就可以直接执行编译后的机器码,提高执行效率。HotSpot虚拟机中包含两种即时编译器:C1编译器和C2编译器。C1编译器又称为客户端编译器,它的编译速度较快,适用于对启动速度要求较高的应用场景;C2编译器又称为服务器端编译器,它的编译优化程度更高,适用于对执行效率要求较高的服务器端应用。
- 垃圾回收器(Garbage Collector,GC):虽然垃圾回收器主要的职责是回收堆中不再使用的对象所占用的内存空间,但它也与执行引擎密切相关。当执行引擎在执行字节码指令时,会产生新的对象并分配内存,同时垃圾回收器会监控堆中对象的存活情况,当发现有不再使用的对象时,会进行垃圾回收操作,以保证堆有足够的空间来分配新的对象。
2.4 本地接口(Native Interface)
本地接口的作用是使Java程序能够调用本地代码(通常是用C或C++编写的代码)。通过本地接口,Java程序可以与操作系统底层进行交互,例如访问本地文件系统、网络接口等。Java提供了JNI(Java Native Interface)来实现Java代码与本地代码的交互。在JNI中,定义了一系列的函数和数据结构,用于在Java虚拟机和本地代码之间传递数据和控制执行流程。
三、JVM的运行流程
3.1 类加载阶段
- 加载:首先,类加载器会根据类的全限定名(如
com.example.HelloWorld
)来查找对应的Class文件。如果是启动类加载器,它会在指定的核心类库路径中查找;如果是扩展类加载器或应用程序类加载器,会在相应的加载路径中查找。找到Class文件后,类加载器会将Class文件中的字节码加载到内存中,并创建一个对应的java.lang.Class
对象来表示这个类。 - 验证:加载后的字节码需要进行验证,以确保其符合JVM的规范,不会对JVM的安全造成威胁。验证阶段主要包括文件格式验证(检查字节码文件是否符合Class文件的格式规范)、元数据验证(检查类的元数据信息是否符合Java语言规范,如类的继承关系是否正确等)、字节码验证(检查字节码指令是否合法,是否存在安全隐患等)和符号引用验证(检查符号引用是否能正确解析到实际的类、字段、方法等)。
- 准备:在准备阶段,JVM会为类的静态变量分配内存,并设置默认初始值。例如,对于
public static int num = 10;
,在准备阶段,num
会被初始化为0,而不是10,因为真正的赋值操作是在初始化阶段进行的。 - 解析:解析阶段是将符号引用转换为直接引用的过程。符号引用是在Class文件中使用的一种对类、字段、方法等的符号化表示,而直接引用是可以直接指向目标的指针或句柄等。例如,在字节码中对一个类的引用可能是通过类的全限定名这种符号引用表示的,在解析阶段会将其转换为指向该类在内存中实际位置的直接引用。
- 初始化:初始化阶段是类加载过程的最后一步,在这个阶段,JVM会执行类的静态代码块和对静态变量的赋值操作。例如,对于
public static int num = 10;
,会在这个阶段将num
赋值为10,同时静态代码块中的代码也会被执行。
3.2 程序执行阶段
当类加载完成后,JVM就可以开始执行程序了。
- 创建线程:JVM会根据程序的入口点(如
main
方法所在的类)创建主线程。在Java程序中,除了主线程外,还可以创建多个子线程来实现多线程编程。每个线程都有自己独立的Java栈、本地方法栈和程序计数器。 - 方法调用与执行:当主线程开始执行时,会从
main
方法开始调用。在方法调用过程中,会在Java栈中创建相应的栈帧。栈帧中包含了局部变量表(用于存储方法中的局部变量)、操作数栈(用于执行字节码指令时的操作数存储和计算)、动态链接(用于将符号引用转换为直接引用,实现方法调用的动态绑定)和方法返回地址(用于记录方法执行完毕后返回的位置)。执行引擎会按照字节码指令的顺序,从方法的第一条字节码指令开始执行,通过解释器或即时编译器将字节码转换为机器码并执行。在执行过程中,可能会涉及到对其他方法的调用,此时会重复上述过程,在Java栈中创建新的栈帧。 - 内存管理与垃圾回收:在程序执行过程中,会不断地创建对象并分配内存,这些对象主要存放在堆中。随着程序的运行,堆中的对象数量会不断增加,当堆空间不足时,垃圾回收器会被触发,对堆中不再使用的对象进行回收,释放内存空间,以保证程序能够继续正常运行。垃圾回收器会根据一定的算法(如标记 - 清除算法、标记 - 整理算法、复制算法等)来判断对象是否存活,并进行相应的回收操作。
- 线程结束:当所有线程都执行完毕(例如主线程执行完
main
方法中的所有代码,子线程也都完成了各自的任务),JVM会进行一些清理工作,然后退出程序。
四、程序计数器详解
4.1 程序计数器的定义与作用
程序计数器是JVM运行时数据区中的一个较小的内存区域,它是线程私有的。其主要作用是记录当前线程所执行的字节码指令的地址(行号)。在Java程序执行过程中,字节码指令是按照顺序依次执行的,程序计数器就像是一个指针,指向当前正在执行的字节码指令的位置。当一条指令执行完毕后,程序计数器会指向下一条要执行的指令。
在多线程环境下,程序计数器的作用尤为重要。由于多个线程是并发执行的,CPU会在不同线程之间进行切换。当一个线程被暂停,另一个线程开始执行时,每个线程都需要能够记住自己上次执行到的位置,以便在下次被调度执行时能够继续正确地执行。程序计数器就为每个线程提供了这样一个记录执行位置的功能,保证了线程切换后能够继续从正确的位置开始执行字节码指令。
4.2 程序计数器与字节码执行
在JVM执行字节码指令的过程中,程序计数器始终与执行过程紧密配合。当JVM加载一个类并开始执行其方法时,首先会将程序计数器设置为方法字节码的起始位置。然后,执行引擎会根据程序计数器所指向的位置,读取相应的字节码指令,并进行解释或编译执行。在执行过程中,每执行完一条字节码指令,程序计数器会自动递增,指向下一条字节码指令的位置。
例如,对于以下简单的Java代码:
public class Test {public static void main(String[] args) {int a = 10;int b = 20;int c = a + b;System.out.println(c);}
}
在编译后的字节码中,会有一系列的指令来实现变量的赋值、加法运算和输出操作。程序计数器会从字节码的第一条指令开始,依次指向每条指令,执行引擎根据程序计数器的指示来执行相应的操作。当执行完变量a
的赋值指令后,程序计数器会指向下一条关于变量b
赋值的指令,以此类推,直到整个main
方法执行完毕。
4.3 程序计数器与异常处理
在Java程序中,异常处理也是与程序计数器密切相关的一个重要方面。当程序在执行过程中遇到异常时,JVM会根据异常的类型和处理机制进行相应的操作。在异常发生时,程序计数器所指向的位置会被记录下来,以便在异常处理完毕后能够正确地恢复程序的执行。
例如,当使用try - catch
语句块来捕获异常时,如果在try
块中发生了异常,JVM会暂停当前字节码指令的执行,根据异常类型查找对应的catch
块。在找到合适的catch
块后,程序计数器会被设置为catch
块中第一条字节码指令的位置,开始执行异常处理代码。当异常处理完毕后,如果需要继续执行后续代码,程序计数器会根据异常处理的结果和程序的逻辑,被设置为合适的位置,继续执行字节码指令。
4.4 程序计数器的特点与限制
程序计数器是一块非常小的内存区域,它的生命周期与线程相同。当线程创建时,程序计数器也会被创建并初始化;当线程结束时,程序计数器也会随之销毁。由于程序计数器只是记录字节码指令的地址,所以它所占用的内存空间非常小,对JVM的整体性能影响几乎可以忽略不计。
需要注意的是,程序计数器只能记录字节码指令的地址,对于Native方法,由于其不是由字节码指令组成,所以程序计数器无法记录Native方法的执行位置。在执行Native方法时,程序计数器的值通常为空。
五、总结
JVM作为Java语言的核心运行环境,其组成部分和运行流程涵盖了类加载、内存管理、指令执行等多个方面。类加载子系统负责将字节码文件加载到JVM中并进行初始化;运行时数据区管理着程序运行时的内存分配和使用;执行引擎负责执行字节码指令;本地接口则实现了Java程序与本地代码的交互。而程序计数器作为运行时数据区中一个看似微小却不可或缺的部分,在保证线程正确执行字节码指令方面发挥着关键作用。
深入理解JVM的这些知识,不仅有助于我们编写出更高效、更稳定的Java程序,还能在遇到性能问题、内存泄漏等故障时,从JVM的底层原理出发进行分析和解决。随着Java技术的不断发展,JVM也在持续演进和优化,我们需要不断学习和关注JVM的新特性和新变化,以更好地适应和应用Java技术。希望通过本文的介绍,读者能够对JVM有一个更加全面和深入的认识。
相关文章:
JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解
JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解 JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解一、引言二、JVM的组成部分2.1 类加载子系统2.2 运行时数据区2.3 执行引…...
从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.1.2Tokenization策略:BPE算法与词表设计
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 3.1.2 Tokenization策略:BPE算法与词表设计1. BPE(Byte-Pair Encoding)算法原理与实现1.1 BPE核心思想1.2 BPE算法步骤2. 词表设计关键要素2.1 词表规模与模型性能2.2 特殊标记设计3. BPE变体与改进算…...
学透Spring Boot — 013. Spring Web-Flux 函数式风格的控制器
这是我的学透Spring Boot的第13篇文章,更多文章请移步我的专栏 学透 Spring Boot_postnull咖啡的博客-CSDN博客 目录 传统风格的Spring MVC 函数式编程风格的Spring MVC 引入WebFlux依赖 定义Handler类 定义Router类 WebFlux不生效 灵魂拷问 Spring Web MVC…...
L33.【LeetCode题解】快乐数(双指针思想)
目录 1.题目 2.分析 3.代码 4.提交结果 5.题外话 证明:一定是循环的 前置知识:鸽巢原理 不严格证明 1.题目 https://leetcode.cn/problems/happy-number/ 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将…...
gltf unity-Unity中Gltf模型的使用与优化技巧
在现代游戏开发和3D应用领域,高质量模型是提升用户体验的关键因素之一。GLTF(GL Transmission Format)作为一款开放标准的3D模型交换格式,已经被越来越多的开发者所认可。Unity引擎,作为全球领先的3D游戏开发平台&…...
Oracle数据库指南
目录 一、前言 二、Oracle数据库基础入门篇 1. Oracle体系结构概述 2. 安装与配置 3. SQL语言入门 三、PL/SQL编程与高级特性 1. PL/SQL基础语法 2. 触发器与任务调度 3. 高级特性 四、日常维护与监控 1. 备份与恢复策略 2. 日志管理与故障排查 3. 自动化运维 五…...
Qt -信号与槽
博客主页:【夜泉_ly】 本文专栏:【暂无】 欢迎点赞👍收藏⭐关注❤️ 目录 前言引入connect调用链模板类型的connectQObject::connectImplQObjectPrivate::connectImpl qobject_p_p.hconnect作用总结ai对信号与槽的模拟实现 前言 面向对象&am…...
macos 魔搭 模型下载 Wan-AI ComfyUI
环境安装 ➜ ~ sw_vers ProductName: macOS ProductVersion: 15.3.2 ➜ ~ pip --version pip 24.3.1 from /opt/homebrew/lib/python3.11/site-packages/pip (python 3.11)安装ModelScope SDK pip install modelscope➜ ~ modelscope download --help Traceback (most r…...
Xshell Plus 6下载与安装
文章目录 Xshell Plus 6 简介(一)网络连接与协议支持(二)会话管理(三)安全特性(四)文件传输功能(因集成Xftp 6 )(五)个性化与便捷功能…...
Kubernetes 集群搭建(一):从环境准备到 Calico 网络插件部署
(一)虚拟环境准备 名称ip备注m1192.168.101.131mastern1192.168.101.132workern2192.168.101.133worker (二)集群统一配置 2.1 关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld sed -i s/enforcin…...
【国产突围!致远电子ZXDoc如何打破Vector垄断,成为新能源车研发“神器”?】
摘要:在汽车“新四化”浪潮下,国产汽车总线工具链软件正迎来高光时刻!广州致远电子推出的ZXDoc以全栈自主化技术硬核国产芯片生态,斩获2024金辑奖“最佳技术实践应用奖”,成为新能源车企研发工程师的“效率倍增器”。本…...
3-Visual Studio 2022打包NET开发项目为安装包
引言 本文将上一期博文>>>门店管理系统开发<<<开发的项目打包为Windows安装包 一,安装扩展 安装此扩展:installer Projects 二,创建安装程序项目 创建项目 右键解决方案-添加-新建项目 选择setup Project项目 填写项目名…...
Cookie、Session、Token、JWT的区别和使用场景
Cookie、Session和Token的区别 存储位置数据容量安全性生命周期性能Cookie客户端(通常是浏览器)4KB、Cookie数量也有限制不安全、XSS(跨站脚本攻击)、CSRF(跨站请求伪造)可以设置过期时间,过期后…...
P1883 【模板】三分 | 函数
题目描述 给定 n 个二次函数 f1(x),f2(x),…,fn(x)(均形如 ax2bxc),设 F(x)max{f1(x),f2(x),...,fn(x)},求 F(x) 在区间 [0,1000] 上的最小值。 输入格式 输入第一行为正整数 T,表示有 T 组数据。 每组…...
Ruoyi-vue plus 5.2.2 flowble设计流程点击开始流程图错误
网关设置条件或者是事件删除后出现,点击网关节点无法找到下面的事件节点。 配置页面事件错误,点背景配置进去了事件,发现再次加载,或者删除的时候VUE页面无法加载。 解决方式:查看XML文件,这个节点是否存在…...
MySQL学习笔记(三)——图形化界面工具DataGrip
目录 1. 图形化界面工具 2.下载 3. 安装 3.1 安装步骤 3.2 激活说明 4. 使用 4.1 汉化教程 4.2 使用 1. 图形化界面工具 上述,我们已经讲解了通过 DDL 语句,如何操作数据库、操作表、操作表中的字段,而通过 DDL 语句执行在命令进行操…...
keil软件仿真
设置 选择软件仿真。 修改参数。 获取参数 找到自己的芯片信号。这里用的是F103ZET6 复制下来,并对其进行修改。 接下来进入仿真即可...
每日一题(小白)模拟娱乐篇14
直接理解题意,一分钟扩散一次,那么2020分钟也就是需要循环2020次,然后加入扩散后的条件,每一个次扩散使方格子的总量1(只要有一个点扩散就无需看其他的点),若干次循环过后总数之和即所有黑色格子…...
(二)使用Android Studio开发基于Java+xml的安卓app之环境搭建
以下是使用Android Studio搭建基于Java和XML的Android应用开发环境的详细步骤: 一、系统要求 操作系统:Windows 7/8/10/11(64位)内存:建议8GB及以上磁盘空间:至少5GB空闲(建议预留10GB以上&…...
STM32定时器通道1-4(CH1-CH4)的引脚映射关系
以下是 STM32定时器通道1-4(CH1-CH4)的引脚映射关系的详细说明,以常见型号为例。由于不同系列/型号差异较大,请务必结合具体芯片的参考手册确认。 一、STM32F1系列(如STM32F103C8T6) 1. TIM1(高级定时器) 通道默认引脚重映射引脚(部分/完全)备注CH1PA8无互补输出CH1…...
看爬山虎学本领 软爬机器人来创新 各种场景能适应
*本文只做阅读笔记分享* 一、灵感来源:向植物取经 大家好!今天来聊一款超酷的软爬机器人,它的灵感来自会攀爬的植物——爬山虎。 大家都知道,爬墙高手爬山虎能在各种复杂墙面轻松生长攀爬,可现有的攀爬机器人在复杂…...
Spring AI Alibaba示例项目深度解析:dashscope-audio子模块详解
Spring AI Alibaba示例项目深度解析:dashscope-audio子模块详解 一、模块定位与核心价值 1.1 功能定位 • 音频处理核心组件:基于阿里云DashScope平台实现STT(语音识别)和TTS(文生语音)双模态能力 • 企业级解决方案:提供同步/异步/流式三种调用范式,适配不同业务场景…...
Linux 下 日志系统搭建全攻略
目录 一、引言 二、日志系统基础 日志级别 日志输出格式 三、创建日志所需函数 认识可变参数 编辑 获取时间的函数 小结 四、创建日志 一、引言 在 Linux 环境中开发 C/C 程序时,日志系统是不可或缺的一部分。它不仅有助于调试程序、排查问题ÿ…...
前端布局难题:父元素padding导致子元素无法全屏?3种解决方案
大家好,我是一诺。今天要跟大家分享一个我在实际项目中经常用到的CSS技巧——如何让子元素突破父元素的padding限制,实现真正的全屏宽度效果。 为什么会有这个需求? 记得我刚入行的时候,接到一个需求:要在内容区插入…...
写.NET可以指定运行SUB MAIN吗?调用任意一个里面的类时,如何先执行某段初始化代码?
VB.NET 写.NET可以指定运行SUB MAIN吗?调用任意一个里面的类时,如何先执行某段初始化代码? 分享 1. 在 VB.NET 中指定运行 Sub Main 在 VB.NET 里,你能够指定 Sub Main 作为程序的入口点。下面为你介绍两种实现方式: 方式一:在项目属性…...
蓝桥杯单片机频率
long int Freq; unsigned int Timer_1000Ms; 加上 TMOD | 0x05; void Timer0Init(void) //0毫秒12.000MHz {AUXR & 0x7F; //定时器时钟12T模式TMOD & 0xF0; //设置定时器模式TMOD | 0x05;TL0 0x00; //设置定时初值TH0 0x00; //设置定时初值TF0 0; //清除TF0标…...
word导出PDF老是目录格式变化的问题
这里是写给和我一样的笨蛋的经验帖,适合试了很多网上的经验,结果都用不成的傻瓜蛋,先说好,我是傻瓜蛋,我不是在攻击谁,我们只是客观的,缺根弦罢了。 这些帖子里讲的最多的应该是:“…...
P1577 切绳子(二分)
题目描述 有 N 条绳子,它们的长度分别为 Li。如果从它们中切割出 K 条长度相同的绳子,这 K 条绳子每条最长能有多长?答案保留到小数点后 2 位(直接舍掉 2 位后的小数)。 输入格式 第一行两个整数 N 和 K,接下来 N 行…...
高级:分布式系统面试题精讲
一、引言 分布式系统在现代软件开发中占据重要地位,其设计和实现需要考虑多个关键因素。面试官通过相关问题,考察候选人对分布式系统核心概念的理解、实际应用能力以及在复杂场景下的问题解决能力。本文将深入分析分布式系统的CAP定理、一致性协议、分布…...
【速写】SFT案例实操(以Qwen2.5-instruct-0.5B)
参考资料: https://openbayes.com/console/bbruceyuan/containers/OPg9Oo99ET6https://www.bilibili.com/video/BV1NM1tY3Eu5 LoRA微调案例 首先还是要安装: !pip install -q accelerate peft bitsandbytes transformers sentencepiece !pip install…...
springboot457-库存管理系统(源码+数据库+纯前后端分离+部署讲解等)
💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm…...
Node.js中间件的分类
目录 Node.js 中间件的分类与详细介绍 1. 目录结构 2. Express 中间件的主要分类 3. 代码实现 1. 应用级中间件(作用于整个应用) 示例:日志记录中间件 2. 路由级中间件(仅作用于特定路由) 示例:身份…...
棒球规则快速入门·棒球1号位
棒球规则快速入门: 得分方式 进攻方击球后,依次跑过一、二、三垒并返回本垒得1分。若击球直接飞出外场围栏(全垒打),击球员和已上垒的跑垒员均可得分。 比赛结构 共9局,每局分上下半场,双方各…...
【深度学习】通过colab将本地的数据集上传到drive
本地数据集上传到colab很慢,而且断开后就没了,因此通过colab将本地的数据集上传到drive,即使断开连接,第二次连接后挂载drive后即可直接使用数据集。 步骤一、将本地数据集上传到colab的临时文件夹中,由于将文件夹上传…...
MYSQL 存储引擎 和 日志
存储引擎 InnoDB 支持行级别的锁粒度,MyISAM 不支持,只支持表级别的锁粒度。MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别。MyISAM 不支持外键,而 InnoDB 支持。MyISAM 不支持 MVCC,…...
【2022】【论文笔记】太赫兹量子阱——
前言 类型 太赫兹 + 量子阱 太赫兹 + 量子阱 太赫兹+量子阱 期刊 红外与毫米波学报 红外与毫米波学报 红外与毫米波学报 作者 张真真 ,...
【NLP 面经 7、常见transformer面试题】
目录 1. 为何使用多头注意力机制? 2. Q和K使用不同权重矩阵的原因 3. 选择点乘而非加法的原因 4. Attention进行scaled的原因 5. 对padding做mask操作 6. 多头注意力降维原因 7. Transformer Encoder模块简介 8. 乘以embedding size的开方的意义 9. 位置编码 10. 其…...
在js中数组相关用法讲解
数组 uniqueArray 简单数组去重 /*** 简单数组去重* param arr* returns*/ export const uniqueArray <T>(arr: T[]) > [...new Set(arr)];const arr1 [1,1,1,1 2, 3];uniqueArray(arr); // [1,2,3]uniqueArrayByKey 根据 key 数组去重 /*** 根据key数组去重* …...
第四章 react-redux,@reduxjs/toolkit依赖,学习
redux系列文章目录 第一章 简单学习redux,单个reducer 第二章 简单学习redux,多个reducer 第三章 redux和react-redux,reduxjs/toolkit依赖结合使用 第五章 两张图告诉你redux常使用的api有哪些 前言 本章将使用react-redux,reduxjs/toolkit依赖创…...
雅思7分听说读写专项书籍推荐
对于目标 7分以上的雅思考生(中高级水平),选对资料真的事半功倍。 下面按照 听力、阅读、写作、口语、综合书籍 五大类来分别列举高分推荐书籍,每本书包括:适合人群、核心内容、推荐理由,并贴合7分目标。 …...
C++容器使用说明
C标准库提供了多种容器,分为序列容器、关联容器、无序关联容器、容器适配器及其他相关类型。以下是所有标准容器的分类及简要说明: 1. 序列容器(Sequence Containers) 按线性顺序存储元素,支持随机或顺序访问。 vecto…...
Python-函数
1. 函数基础 1.1 定义函数 在Python中,使用def关键字来定义函数: def greet():"""简单的问候函数"""print("Hello, World!")1.2 调用函数 定义函数后,可以通过函数名加括号来调用: …...
【Redis】数据的淘汰策略
目录 淘汰策略方案(8种) LRU和LFU策略的区别 使用建议 手搓LRU算法 方式一 方式二 大家好,我是jstart千语。今天和大家回来聊一下redis,这次要讲的是它的淘汰策略。为什么需要淘汰策略呢,就是当redis里面的内存占…...
第七章:从类库到服务的分布式基石_《凤凰架构:构建可靠的大型分布式系统》
第七章:从类库到服务的分布式基石 一、服务发现(Service Discovery) 核心目标:解决分布式系统中服务实例动态变化时如何定位可用服务的问题。 1. 服务发现的意义 动态环境挑战: 微服务架构中,服务实例的…...
spring-ai-alibaba第九章使用Milvus构建大模型RAG应用
1、pom文件 <dependencies><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>${spring-ai-alibaba.version}</version></dependency><dependency&g…...
手撕LLM(一):从源码出发,探索LLM推理全流程
2025年,大模型爆发元年,各种各样的大模型、框架、工具层出不穷,不断刷新人们应用大模型的门槛,短短10行代码,就能完成“加载模型加载数据集推理强化学习”的全流程训练,但其底层的运行机制也被高度抽象的接…...
讯飞语音听写(流式版)开发指南
语音交互大模型的功能越来越受到重视。讯飞语音听写(流式版)为开发者提供了一种高效、准确的语音识别解决方案。本文将基于 Home.vue、iat_xfyun.js 和 sparkChat.js 这三个文档,详细阐述讯飞语音听写(流式版)的开发逻…...
P3654 First Step (ファーストステップ)
题目描述 可是……这个篮球场,好像很久没有使用过的样子啊…… 里面堆满了学校的各种杂物呢…… 我们 Aqours 的成员要怎么在里面列队站下呢? 我们浦之星女子学院的篮球场是一个 R 行 C 列的矩阵,其中堆满了各种学校的杂物 (用 # 表示)&a…...
MySQL篇(六)MySQL 分库分表:应对数据增长挑战的有效策略
MySQL篇(六)MySQL 分库分表:应对数据增长挑战的有效策略 MySQL篇(六)MySQL 分库分表:应对数据增长挑战的有效策略一、引言二、为什么需要分库分表2.1 性能瓶颈2.2 存储瓶颈2.3 高并发压力 三、分库分表的方…...
SonarQube 配置SQL Server 数据库遇到的问题
之前本机跑了一套SonarQube的社区版,默认使用的是H2数据库,那么我把它练到我机器上的SQL Server数据库了,期间遇到以下两个问题,并在配置过程中解决掉,特将这个过程记录下来。 一、JDBC连接SQL Server问题 1. 问题出…...