当前位置: 首页 > news >正文

Java虚拟机——JVM(Java Virtual Machine)解析一

1.JVM是什么?

1.1 JVM概念

Java Virtual Machine (JVM) 是JDK的核心组件之一,它使得 Java 程序能够在任何支持 JVM 的设备或操作系统上运行,而无需修改源代码

JDK是什么,JDK和JVM是什么关系?

在这里插入图片描述
1.Java IDE(Integrated Development Environment):集成开发环境,专门用于Java编程(例如IDEA),开发Java应用程序前需要选择某具体版本的JDK
在这里插入图片描述
2.JDK(Java Development Kit)
Java开发工具包,用于编写,编译,调试和运行Java应用程序,提供了开发Java程序所需的所有工具和资源。JDK=JRE+其他
3.JRE(Java Runtime Environment)
Java运行时环境,包含Java虚拟机(JVM),类库和其他文件,用于运行Java程序
通过以上的内容梳理可知,JDK包含JRE,JRE包含JVM

1.2 JVM作用

说到这里,我就要搞清楚计算机是如何认识我们编写的代码的
首先,计算机只认识0和1,执行的指令集也是一串一串的01。所以,我们编写的代码一定是被转换为二进制文件才能被计算机执行。
其次,不同的操作系统的指令集是不同的。例如,在Windows系统中0000 0010的意思是加法,而在Linux系统中的意思是减法(只是举例,不是真正的指令集)。
那么将开发者编写的代码直接转换为二进制文件,放在不同的操作系统中运行的结果可能也不同,如果要实现同样的功能就需要在不同的操作系统上编写不同的代码。
Java能跨平台运行的原因
先回忆一下刚开始学习Java编程的时候听过的一句话"一次编译,到处运行",这句话体现了Java的跨平台能力,开发者只需要编写一次Java代码并编译成字节码文件,就可以在任何安装了JVM的机器上执行。
下面是Java代码从编写到运行的过程
在这里插入图片描述

java文件通过javac(Java编译器,Java Compiler)编译成字节码文件(class文件)
可以把JVM看成计算机,字节码文件就相当于JVM的指令集。然后JVM把字节码文件转换为对应系统的指令集,
例如:现在有"Hello World"这么一串代码,Windows系统上的JVM将代码转换为0010,Linux系统上的JVM将代码转换为0110,最后两个系统的执行结果都是"Hello World",这就实现了Java程序的跨平台运行

1.3 JVM执行流程

在这里插入图片描述
程序在执行之前先要把java代码转换成字节码(class文件),JVM 首先需要把字节码通过一定的方式类加载器(ClassLoader) 把文件加载到内存中运行时数据区(Runtime Data Area) ,而字节码文件是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine)将字节码翻译成底层系统指令再交由CPU去执行,而这个过程中需要调用其他语言的接口本地库接口(Native Interface) 来实现整个程序的功能

2.深入学习JVM

2.1运行时数据区

运行时数据区是Java程序执行时所需的内存区域。JVM启动时,会根据不同的内存区域分配管理内存。一般来说,线程共享的区域的生命周期和JVM一致;线程私有的区域会随着线程的创建和销毁跟着一起创建和销毁,生命周期和所属线程一致。
在这里插入图片描述

2.1.1.方法区(线程共享)

方法区是JVM内存规范中定义的抽象概念,并不是真实的物理空间。

在JDK8以前,使用永久代来实现方法区。永久代是在堆中开辟的内存空间,主要存储:

(1)类的元信息:类名,修饰符等
(2)常量池
(3)静态变量
注:永久代的大小是在JVM启动时固定的,难以根据实际需求来动态调整,而且永久代是在堆内存中开辟的空间,这也限制了永久代的大小。所以在JDK8之后使用元空间来实现方法区

在JDK8及以后,使用元空间来实现方法区(上面图片中的元数据区/元空间不太准确,但我确实没有找到更好的图片)

元空间存储方式相较于永久代有所改动。首先,元空间不再在堆内存中开辟空间,而是单独向操作系统申请空间,这就不会再受到堆内存大小的限制。其次,元空间可以根据实际需求来动态调整大小。然后,元空间内部存储的数据也发生了一些变化
(1)类的元信息依旧存储在元空间中
(2)常量池转移到堆中
(3)静态变量
在这里插入图片描述

2.1.2.堆(线程共享)

JVM内存中最大的部分,是所有线程共享的空间。
1.在JVM启动时创建(可以动态调整大小,有上限),是垃圾回收的主要位置。
2.几乎所有的对象实例(通过new创建)都存储在堆中
3.从内存回收角度来看java堆可分为:新生代和老生代
注:JVM在编译时会分析对象是否逃逸出方法或者线程,如果对象不会逃逸出方法或者线程,只在内部使用,JVM就可以将其分配在栈(线程私有)上,以提高性能减少垃圾回收的开销,这里不做详细讨论

2.1.3.虚拟机栈(线程私有)

每个线程都有一个独立的虚拟机栈,用于存储栈帧(Stack Frame)。每个方法在执行时都会创建一个栈帧,用于存储方法的局部变量,方法调用和返回地址

2.1.4.本地方法栈(线程私有)

存储本地方法(Native Methods)调用的信息。本地方法是使用非Java语言(如C、C++)编写的方法,它们通过JNI(Java Native Interface,Java本地方法接口)与Java代码进行交互

2.1.5.程序计数器(线程私有)

存储当前线程执行的字节码指令的地址

2.2类加载器

2.2.1类加载过程

类加载包括:加载(Loading),连接(Linking)和初始化(Initialization)三个步骤
在这里插入图片描述

(1)加载(Loading)

通过类加载器将硬盘中的字节码文件加载到运行时数据区,并生成一个类对象存储在方法区。当然,也不一定是硬盘中的字节码文件,还可能来自于网络、数据库,甚至是即时生成的字节码文件
在这里插入图片描述
注意一:着重区分加载和类加载的区别。加载(Loading)只是类加载的第一个阶段;而类加载包括加载(Loading),连接(Linking)和初始化(Initialization)三个步骤

(2)验证(Verification)

确保类文件符合JVM规范中定义的类文件格式。
文件格式验证:检查文件是否是以0xCAFEBABE开头,这是Java类文件的标识;检查类文件的版本号是否和JVM对应,Java 8的JVM不支持Java 9的类文件
元数据验证:确保类的元数据信息没有语法错误
字节码验证:确保类的字节码指令是合法的,不会导致JVM崩溃或者执行不安全操作
注意二:在今天,验证操作不单单是验证(Verification)这一个阶段了。在解析阶段还有符号引用验证,解析阶段可以发生在初始化之前,也可能发生在初始化之后(代码中发生多态来实现后期绑定),而且JVM的开发人员还在不断完善验证策略,所以验证操作分散在各个阶段内,并不是单一的阶段。

(3)准备(Preparation)

为类的静态变量分配内存并设置默认值。

  1.  将类的静态变量分配到方法区(有一些静态变量不在方法区)
    
  2.  基本数据类型初始化默认值,int类型初始化为0,boolean类型初始化为false
    
  3.  引用类型初始化为null
    
  4.  如果是静态常量,直接赋目标值,跳过默认值
    
(4)解析(Resolution)

将符号引用替换为直接引用。
直接引用:指向内存中的实际地址的指针或者偏移量
符号引用:是一种文本形式的引用,使用字符串或其他符号来描述目标类,字段和方法
问题:为什么要引入符号引用?
因为在class文件加载到运行时数据区之前,class文件是在硬盘或者其他空间中存储的(反正不是内存),没有地址和指针这个概念,如果要定位一个类,只能使用其他形式的标识符
在这里插入图片描述
动态解析举例:加入B类是一个抽象类,实现的是身份选择功能,C和D类继承了B,分别代表普通用户和管理员。那么A到底引用C还是D,这可能需要用户来决定。此时,A类就会先进行初始化阶段,当用户选择完身份后再来解析

(5)初始化(Initialization)

任务:执行类的初始化代码
触发条件(以下任一情况都会触发初始化):
1.创建类的实例(new
2.访问类的静态变量(非final)或静态方法
3.反射调用类(Class.forName("com.example.MyClass")
4.子类初始化时,其父类会先被初始化
5. 作为程序入口的主类(包含main()方法的类)
执行顺序
1.父类静态变量和静态代码块(按代码顺序执行)
2.子类静态变量和静态代码块(按代码顺序执行)
3.父类实例变量和构造代码块
4.父类构造函数
5.子类实例变量和构造代码块
6.子类构造函数

2.2.2类加载器

在上述类加载过程中,第一个阶段"加载"涉及到JVM中一个非常重要的模块——类加载器。类加载器主要负责根据类的全限定名找到对应的.class文件
在这里插入图片描述

什么是全限定名?
全限定名指的是包含**包名**在内的**类**的完整名称。例如,假设有一个ArrayList类,属于java.util包,那么它的全限定名就是java.util.ArrayList
类加载器的搜索范围:不同的类加载器负责不同路径的类加载。在JVM中,不算自定义的类加载器,默认的类加载器有三种:

(1) 启动/引导类加载器(Bootstrap ClassLoader):加载 `JAVA_HOME/lib` 下的核心类库
(如 `rt.jar`)

注:这里的JAVA_HOME一般指的是JDK的安装路径,如下图
在这里插入图片描述

rt.jar(以JDK8为例):包含Java标准库,如java.lang,java.util等,至于标准库有哪些在Java语言规范中有明确规定,这里不过多赘述。这些标准库中的类由启动/引导类加载器负责加载。

(2) 扩展类加载器(Extension ClassLoader):加载 `JAVA_HOME/lib/ext` 下的扩展类

Java语言规范中没有的类,并且是由JVM开发者添加的类,称为扩展类,这些类由扩展类加载器负责加载。JVM的版本有很多,所以扩展类有哪些和JVM的具体版本有关

(3) 应用类加载器(Application ClassLoader):加载用户类路径(ClassPath)下的类

一般包括开发者编写的类和第三方依赖库

2.2.3 双亲委派机制(不考虑自定义类加载器)

核心思想:当类加载器收到类加载请求时,不会自行立即加载,而是先将该加载请求委派给父类加载器,最终请求会到达顶层类加载器。

完整过程:

(1)顶层加载器(启动类加载器,Bootstrap ClassLoader)检查JAVA_HOME/lib路径下的核心类库,如果能找到就加载
(2)如果启动类加载器找不到,请求返回给扩展类加载器,检查JAVA_HOME/lib/ext路径下的扩展类,如果能找到就加载
(3)如果扩展类加载器找不到,请求返回给应用类加载器,检查用户类路径下的类
(4)如果所有类加载器均无法加载请求类,则抛出ClassNotFoundException

双亲委派机制的优势:

1. 避免核心类被篡改
安全性:通过优先由启动类加载器加载核心类(如 java.lang.String),确保用户无法定义同名类覆盖核心类
示例:若用户自定义 java.lang.String,JVM 会直接加载核心库中的版本,用户类被忽略
2.防止重复加载
唯一性:每个类由父类优先加载,确保同一个类在多个类加载器中只加载一次
示例:若父类已加载 com.example.MyClass,子类不会再重复加载,避免内存浪费和类冲突
3.天然的类隔离性
隔离性:不同类加载器加载的类属于不同的命名空间,天然隔离。
4.灵活扩展
可定制性:允许子类加载器扩展加载范围(如从网络、数据库加载类),同时不破坏核心类的稳定性

3.小结

下篇博文将继续介绍JVM剩下核心机制——垃圾回收

相关文章:

Java虚拟机——JVM(Java Virtual Machine)解析一

1.JVM是什么? 1.1 JVM概念 Java Virtual Machine (JVM) 是JDK的核心组件之一,它使得 Java 程序能够在任何支持 JVM 的设备或操作系统上运行,而无需修改源代码 JDK是什么,JDK和JVM是什么关系?1.Java IDE(Integrated …...

【JVM】question

问题 JVM线程是用户态还是内核态 java线程在jdk1.2之前,是基于名为“绿色线程”的用户线程实现的,这导致绿色线程只能同主线程共享CPU分片,从而无法利用多核CPU的优势。 由于绿色线程和原生线程比起来在使用时有一些限制, jdk1.2…...

页面编辑器CodeMirror初始化不显示行号或文本内容

延迟刷新 本来想延迟100毫秒的,但是会出现样式向左偏移的情况,于是试了试500毫秒,发现就没有问题了,可能是样式什么是需要一个加载过程吧。 useEffect(() > {editorRef.current?.setValue(value || );setTimeout(() > {edi…...

顺序表——C语言实现

目录 一、线性表 二、顺序表 1.实现动态顺序表 SeqList.h SeqList.c Test.c 问题 经验:free 出问题,2种可能性 解决问题 (2)尾删 (3)头插,头删 (4)在 pos 位…...

OpenCV 图形API(21)逐像素操作

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在OpenCV的G-API模块中,逐像素操作指的是对图像中的每个像素单独进行处理的操作。这些操作可以通过G-API的计算图(Graph …...

车载联网终端4G汽车TBOX介绍定义与概述

汽车 TBOX(Telematics Box)是专为汽车设计的远程通信终端设备,属于车联网系统的关键组成部分。车联网系统一般包含主机、汽车 T - BOX、手机 APP 及后台系统。融合了车身网络和 4G 无线通信技术,为汽车提供丰富的 Telematics 服务…...

CentOS无法安装Vim文本编辑器问题以及解决方法

1.问题一:用户权限不够 解决方法一:切换到root用户 解决方法二:给本用户添加权限 2.问题二:镜像源问题:官方镜像源可能已经失效 解决方法: 1. 检查网络连接 2. 检查和配置 DNS 3. 更换镜像源&#…...

Kettle如何与应用集成

Kettle(Pentaho Data Integration,PDI)可以通过多种方式与应用程序集成,以下是7种主流方法及具体实现示例: 一、命令行调用(最基础) # 执行转换(Transformation) ./pan.…...

Pytorch torch.nn.utils.rnn.pad_sequence 介绍

torch.nn.utils.rnn.pad_sequence 是 PyTorch 中一个用于填充序列的实用函数,它主要用于处理长度不一的序列数据,将这些序列填充到相同的长度,以便能将它们组合成一个批量(batch)输入到神经网络中。以下是详细介绍&…...

4.7正则表达式

1.字符匹配 一般字符匹配自身. 匹配任意字符(换行符\n除外),一个点占一位\转义字符,使其后一个字符改变原来的意思(\.就是.)[......]字符集,对应的位置可以是字符集中的任意字符.字符集中的字符可以逐个列出,也可以给出范围如[abc]或[a-c] [^abc] 表示取反&#xf…...

CogPatInspectTool工具

CogPatInspectTool是康耐视中的一种模板比对的视觉检测工具,主要用于产品不良检测。其核心功能是通过将输入图像与预先训练好的模板进行对比,识别出两者之间的差异,并生成高亮差异图,从而判断产品是否存在缺陷。 效果图 CogPatIn…...

牛客周赛 + 洛谷刷题

秘藏 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 200010; ll a[N], b[N]; int n, k; ll dp[2][N];//dp[i][j]是在i界中取了j之前的最大值 int main(){ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n >&…...

【数据结构】图论存储革新:十字链表双链设计高效解决有向图入度查询难题

十字链表 导读一、邻接表的优缺点二、十字链表2.1 结点结构2.2 原理解释2.2.1 顶点表2.2.2 边结点2.2.3 十字链表 三、存储结构四、算法评价4.1 时间复杂度4.2 空间复杂度 五、优势与劣势5.1 优势5.2 劣势5.3 特点 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff…...

【JavaScript】十五、事件对象与环境对象

文章目录 1、事件对象1.1 获取事件对象1.2 常用属性1.3 案例&#xff1a;回车发布评论 2、环境对象this3、回调函数4、案例&#xff1a;tab切换5、案例&#xff1a;全选文本框&#x1f4d6; 1、事件对象 事件对象&#xff1a; 也是个对象&#xff0c;object&#xff0c;里面存…...

OJ--第N个泰波那契数列

1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09; 1 题干部分 2 拆解 1 状态表示&#xff1a;dp[i] 2 状态转移方程:dp[i]dp[i-1]dp[i-2]dp[i-3] 3 初始化:让dp[0]0,dp[1]dp[2]1 4 填表顺序:从dp[3]开始填从左往右填 5 返回值&#xff1a;dp[n]即为返回的…...

Python从入门到高手8.1节-元组类型详解

目录 8.1.1 理解元组类型 8.1.2 元组的类型名 8.1.3 元组的定义 8.1.4 元组的解包 8.1.5 元组是可迭代的 8.1.6 假期就这么结束了 8.1.1 理解元组类型 元组与列表有着相同的数据结构&#xff0c;区别在于&#xff0c;元组是不可变的数据类型&#xff0c;而列表是可变的数…...

使用 Qt 和 OBS 工具检测系统硬件编码器支持情况(NVENC、QSV、AMF)

在开发涉及视频处理的软件时,判断系统是否支持硬件加速编码器(如 NVIDIA NVENC、Intel QSV、AMD AMF)对于性能优化至关重要。本文将介绍如何结合 Qt 与 OBS Studio 附带的小工具程序,实现一个完整、异步且不会卡住 UI 的硬件加速检测模块。 一、背景与目标 硬件加速编码器…...

Python爬虫生成CSV文件的完整流程

引言 在当今数据驱动的时代&#xff0c;网络爬虫已成为获取互联网数据的重要工具。Python凭借其丰富的库生态系统和简洁的语法&#xff0c;成为了爬虫开发的首选语言。本文将详细介绍使用Python爬虫从网页抓取数据并生成CSV文件的完整流程&#xff0c;包括环境准备、网页请求、…...

图论:多源最短路

多源最短路 B3647 【模板】Floyd - 洛谷 #include<iostream> #include<cstring> using namespace std;const int N 110; int f[N][N]; int n, m;int main() {memset(f, 0x3f, sizeof(f));//对于重边的处理取较小值&#xff0c;所以要把全部都初始化成无穷大&…...

2024年已备案大模型发展趋势分析

2024年已备案大模型发展趋势分析 随着生成式人工智能技术的快速发展,其在各个领域的应用逐渐深入。为了规范和促进生成式人工智能服务的健康发展,国家互联网信息办公室发布了《生成式人工智能服务已备案信息》。本文将基于已备案信息,分析生成式人工智能服务的发展趋势,并…...

spring功能汇总

1.创建一个dao接口&#xff0c;实现类&#xff1b;service接口&#xff0c;实现类并且service里用new创建对象方式调用dao的方法 2.使用spring分别获取dao和service对象(IOC) 注意 2中的service里面获取dao的对象方式不用new的(DI) 运行测试&#xff1a; 使用1的方式创建servic…...

Transformer - Feed Forward前馈网络

一、数学原理 1. 前馈神经网络公式 2. Dropout公式 二、代码实现 import math import torchimport torch.nn as nnclass FeedForward(nn.Module):def __init__(self, d_model, dff, dropout):super().__init__()self.W1 nn.Linear(d_model, dff)self.W2 nn.Linear(dff, d_mo…...

Compose Multiplatform+Kotlin Multiplatfrom 第五弹跨平台 截图

截图功能 Compose MultiplatformKotlin Multiplatfrom下实现桌面端的截图功能&#xff0c;起码搞了两星期&#xff0c;最后终于做出来了&#xff0c;操作都很流畅&#xff0c;截取的文件大小也正常&#xff0c;可参考支持讨论&#xff01; 功能效果 代码实现 //在jvmMain下创…...

算法题(119):高精度减法

审题&#xff1a; 本题高精度减法主要是要区分正负号&#xff0c;然后进行模拟 思路&#xff1a; 方法一&#xff1a;模拟法 首先本题需要我们利用字符串进行大数相减 第一步&#xff1a;区分s1和s2谁更大 先从数的位数进行判断&#xff0c;然后再从高到低的位数进行判断 第二步…...

使用成员函数指针数组简化C++类中的操作

使用成员函数指针数组简化C类中的操作 在C编程中&#xff0c;我们常常会遇到需要对一组相似的操作进行处理的情况。例如&#xff0c;在一个游戏引擎中&#xff0c;你可能希望角色能够执行一系列的动作&#xff0c;如行走、跳跃或攻击等。为了简化这些操作的管理和调用&#xf…...

WebGL数学手记:矩阵基础

一、矩阵的定义 矩阵&#xff0c;数学术语。在数学中&#xff0c;矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集合。 1.英文发音&#xff08;Matrix&#xff09; Matrix的发音类似于中文的[美吹克斯]&#xff0c;知道它的发音。方便后期看教程时…...

Python爬取数据(二)

一.example2包下的 1.re模块的compile函数使用 import repatternre.compile(r\d) print(pattern) 2.match的方法使用 import re patternre.compile(r\d) # m1pattern.match(one123twothree345four) #参数2&#xff1a;指定起始位置(包含),参数3&#xff1a;终止位置(包含),…...

我的NISP二级之路-01

目录 一.SSE-CMM系统安全工程-能力成熟度模型(Systems Security Engineering - Capability Maturity Model) 二.ISMS 即信息安全管理体系(Information Security Management System),是一种基于风险管理的、系统化的管理体系 三.Kerberos协议 1. 用户登录与 AS 请求 2…...

自制简易 Shell:像搭建积木小屋一样打造命令交互小天地

目录 准备工作&#xff1a;搭建小屋的材料 打造小屋的 “身份牌” 接收指令&#xff1a;小屋的 “对讲机” 拆解指令&#xff1a;把大任务拆成小积木 执行指令&#xff1a;小屋的 “行动队” 特殊指令&#xff1a;小屋的 “特色功能” 小屋的日常运转 完整代码 啥是 …...

WEB安全--内网渗透--利用Net-NTLMv2 Hash

一、前言 在前两篇文章中分析了NTLM协议中Net-NTLMv2 Hash的生成、如何捕获Net-NTLMv2 Hash&#xff0c;现在就来探讨一下在内网环境中&#xff0c;如何利用Net-NTLMv2 Hash进行渗透。 二、Net-NTLM Hash的破解 工具&#xff1a;hashcat 原理&#xff1a;利用其内部的字典对…...

MySQL 数据库操作指南:从数据库创建到数据操作

关键词&#xff1a;MySQL&#xff1b;数据库操作&#xff1b;DDL&#xff1b;DML 一、引言 MySQL 作为广泛应用的关系型数据库管理系统&#xff0c;对于开发人员和数据库管理员而言&#xff0c;熟练掌握其操作至关重要。本文章通过一系列 SQL 示例&#xff0c;详细阐述 MySQL…...

从传递函数到PID控制器

在过程控制中&#xff0c;按偏差的比例&#xff08;P&#xff0c;Proportional&#xff09;、积分&#xff08;I&#xff0c;Integral&#xff09;和微分&#xff08;D&#xff0c;Differential&#xff09;进行控制的PID控制器&#xff08;亦称PID调节器&#xff09;是应用最为…...

抓wifi无线空口包之Ubuntu抓包(二)

一、设置网卡信道和频段&#xff0c;并抓包 1、使用iwconfig查看自己机器的无线网卡名称 wangwang-ThinkCentre-M930t-N000:~$ iwconfig lo no wireless extensions. eno1 no wireless extensions. enxc8a3624ab329 no wireless extensions. wlx90de80d1b5b1 IE…...

使用protobuf编译提示无法打开包括文件: ‘absl/log/absl_log.h’: No such file or directory

问题原因 Protobuf 依赖 Abseil&#xff1a; Protobuf 3.20 版本开始依赖 Abseil&#xff0c;但你的系统未正确安装或配置 Abseil。 头文件路径未包含&#xff1a; 编译器找不到 absl/log/absl_log.h&#xff0c;可能是因为 Abseil 未正确安装或未在项目中设置包含路径。 …...

深入浅出Java 锁 | 源码剖析 | 万字解析

目录 硬件内存结构&Java内存模型 硬件内存结构 Java内存模型&#xff08;JMM&#xff09; JMM中三大特性&#xff1a;原子性、有序性、可见性 Java中有哪些锁&#xff1f; Java中锁可以分成悲观锁和乐观锁的实现。 乐观锁和悲观锁的区别&#xff0c;乐观锁一定好嘛&…...

java流程控制12:流程控制练习

流程控制练习 打印三角型 package com.zheng.struct;public class TestDemo {public static void main(String[] args) {//打印三角形 5行for(int i1;i<5;i){for(int j5;j>i;j--){System.out.print(" ");}for(int j1;j<i;j){System.out.print("*&quo…...

JAVA:ByteBuddy 动态字节码操作库的技术指南

1、简述 ByteBuddy 是一个功能强大的 Java 字节码操作库&#xff0c;可以帮助开发者在运行时动态生成和修改类&#xff0c;而无需直接接触复杂的 ASM API。它被广泛应用于框架开发、AOP&#xff08;面向切面编程&#xff09;、代理类生成、性能监控等领域。 2、ByteBuddy 的优…...

C语言学习记录(13)自定义类型:结构体

一、结构体变量的声明、创建和初始化 1.结构体变量的声明 结构体变量我们学操作符的时候就顺带讲了一点了&#xff0c;因为当时讲了结构体成员变量访问操作符.。 结构体变量不像int、float这种内置类型的&#xff0c;一旦创建&#xff0c;系统就知道这是干啥的&#xff0c;结…...

rtthread 软件SPI驱动, 支持mode0~3,MSB,LSB

rtthread的软件模拟SPI用的上层PIN驱动写&#xff0c;由于经过层层封装&#xff0c;时钟频率并不会太高&#xff0c;200MHz的MCU跑不到1MHz的时钟频率。所以最好是在底层就模拟好&#xff0c;给上层用。 头文件 struct io_poSOFT {gpio_type *port;uint16_t pin; }; typedef …...

C++自学笔记——动态创建对象

动态创建对象 1. 什么是动态创建对象&#xff1f; 在学习之前的知识点时&#xff0c;我们知道有静态存储期和自动存储期。 静态存储期的对象在程序的整个生命周期内都存在&#xff0c;全局变量和static修饰的局部变量都属于这一类。自动存储期的对象&#xff0c;这些对象在函…...

35.[前端开发-JavaScript基础]Day12-for循环中变量-华为商城-商品列表-轮播图

for循环中监听函数中打印变量 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wi…...

详细描述以太坊的gas、gaslimit、gasPrice

目录 一、Gas 是什么? ✅ 简要定义: 🧠 举例理解: 二、Gas Limit 是什么? ✅ 简要定义: 分两种: 举例说明: 三、Gas Price 是什么? ✅ 简要定义: 为什么它重要? 示例: 四、 EIP-1559 后的新机制(伦敦升级) 三个要素: 五、额外技巧(开发实用) 本文…...

【Java】Maven

一、概念 是一个项目管理和构建工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的构建。 二、Maven坐标 <groupId>com.itheima</groupId><artifactId>maven-project01</artifactId>&…...

PageCache

目录 一、PageCache的具体过程 二、具体实现代码 一、PageCache的具体过程 页缓存主要解决的是内存外碎片问题&#xff0c;并且直接和系统调用打交道。 申请过程如下&#xff1a; 当中心缓存中没有内存时,会去页缓存申请一个span结构,要经过下面几步: &#xff08;1&#xf…...

Vue3实战五、面包屑,收缩菜单,高亮暗黑主题切换,全屏功能实现

目录 面包屑&#xff0c;收缩菜单&#xff0c;黑夜白夜样式,全屏功能实现收缩菜单按钮结合pinia功能实现第一步、定义布局配置的数据类型第二步、创建布局状态管理文件第三步、使用布局配置状态第四步、进行展开/收起左侧菜单逻辑第五步、动态切换左侧菜单宽度样式第六步、动态…...

Linux内核设计——(二)进程调度

目录 一、进程调度简介 二、多任务 三、调度器 3.1 I/O消耗型和处理器消耗型进程 3.2 进程优先级 3.3 CFS算法 3.4 实时调度策略 3.5 SCHED_FIFO 3.6 SCHED_RR 3.7 调度器入口 四、上下文切换 4.1 睡眠和唤醒 4.2 need_resched标志 4.3 用户抢占 4.4 内核抢占 一…...

【C++初阶】--- string类模拟实现

1.基础函数 1.1成员函数 成员函数主要是_str、_size、_capacity这三个。npos是size_t 的最大值,用于当作后续成员函数的参数的缺省值。 class string { private:char* _str nullptr;//指向字符串的指针size_t _size 0;//字符串长度size_t _capacity 0;//空间大小static c…...

Pythia 使用说明

Pythia 是一个由非营利研究组织 EleutherAI 开发的开源语言模型套件&#xff0c;专注于透明性和可复现性。它是为了推动自然语言处理&#xff08;NLP&#xff09;领域的开放研究而设计&#xff0c;尤其在模型训练过程和性能分析方面提供了详尽的文档和数据。 Pythia 的核心特点…...

python:获取某路径下所有图片的名称

可以使用 Python 的 os 模块或者 pathlib 模块来获取指定路径下所有图片的名称。以下是使用这两种方法实现的代码示例&#xff1a; 使用 os 模块 import osdef get_image_names_os(path):image_extensions (.jpg, .jpeg, .png, .gif, .bmp)image_names []for root, dirs, f…...

一个开源的 VS Code 大模型聊天插件:Light-at

这篇文章是一个开发杂谈。对于有经验的开发者来说&#xff0c;可能这个项目并不算特别复杂或者高技术&#xff0c;只是对我个人来说算一个里程碑&#xff0c;因此写篇杂谈文章记录一下。也许也能给起步者一些参考。 项目地址&#xff1a;https://github.com/HiMeditator/light-…...