【JVM】运行时数据区域
文章目录
- 1. 程序计数器
- 补充
- 2. 虚拟机栈
- 2.1 栈帧
- 1. 局部变量表
- 2. 操作数栈
- 3. 动态链接
- 4. 方法返回地址
- 补充
- 3. 本地方法栈
- 4. 堆
- 5. 方法区
- 静态常量池(Class常量池)
- 运行时常量池
- 字符串常量池
- (1)位置变化
- (2)放入字符串常量池的3种途径
- 1. 字面量赋值
- 2. new String("")
- 3. **intern()**
- 4. StringTable垃圾回收
- 5. StringTable调优
- 6. 直接内存
- (1)概念
- (2)特性
- (3)管理与回收机制
- 一、直接内存的分配与对象结构
- 二、释放流程
- 三、关键机制深度解析
- 其他
- 1. 永久代为什么被替换为元空间
1. 程序计数器
(1)定义
一块比较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。
- JVM解释器通过程序计数器读取下一条需要执行的字节码指令。
- 在Java虚拟机的概念模型里(代表了虚拟机的统一外观,但各个Java虚拟机不一定一定要按照概念模型的定义来实现),字节码解释器的工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
- 它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器实现。
(2)特点
-
线程私有
内存隔离:程序计数器属于线程私有内存
作用:避免多线程竞争,确保线程独立性。 -
无OOM异常
JVM规范未定义程序计数器的OOM(OutOfMemoryError)场景。
因为它不占用堆或方法区,仅存储当前指令的地址。 -
占用较小内存
仅保存一个指令地址(或Native方法的undefined),内存消耗可忽略。 -
无垃圾回收
不涉及对象存储,无需GC管理。
补充
-
这个线程如果正在执行的是一个Java方法,那么这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是一个本地(Native)方法,这个计数器值应该为空
-
程序计数器是否可能为null?
- Java方法执行时:始终指向有效指令地址
- Native方法执行时:值为undefined,但不为null
-
工作流程:
0: iload_1 // 加载局部变量1到操作数栈 1: iload_2 // 加载局部变量2到操作数栈 2: iadd // 执行加法 3: istore_3 // 将结果存储到局部变量3
- 当线程执行到iadd(地址2)时,程序计数器值为2。
- 执行完iadd后,程序计数器自动更新为3,指向istore_3。
2. 虚拟机栈
(1)定义
用于存储方法的调用和执行信息(保存方法的局部变量、操作数栈、动态链接、方法返回地址等)。每个方法调用对应一个栈帧(Stack Frame)。
虚拟机栈由一个个栈帧组成,每个方法在运行时,JVM都会同步创建一个栈帧,然后将栈帧压入到虚拟机栈中。每次方法调用的数据都是通过栈传递的。
(2)异常
-
栈内存溢出(栈帧过多或栈帧过大):
StackOverflowError
- 触发条件:线程请求的栈深度超过JVM允许的最大深度(如无限递归调用)
- 默认栈大小:不同JVM实现不同,HotSpot默认为1MB(可通过
-Xss
参数调整,如-Xss256k
)
-
OutOfMemoryError
- 触发条件:如果Java虚拟机栈容量可以动态扩展,栈扩展时无法申请到足够内存(如多线程场景下系统内存耗尽)
2.1 栈帧
每一个方法被调用到执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
每个栈帧存储以下信息:
1. 局部变量表
存放的是编译器可知的各种基本数据类型、对象引用和returnAddress类型。
- A. 对象引用(reference类型,不等同于对象本身)
- B. returnAddress类型(指向了一条字节码指令的地址)
局部变量表的容量:以变量槽(Slot)为最小单位(32位类型占1个Slot,64位如long/double占2个Slot,其余的数据类型只占用1个)。
2. 操作数栈
用于执行字节码指令的临时数据存储区(如算术运算、方法参数传递)。
i++ 和 ++i的区别:
- i++:从局部变量表取出局部变量 i 并压入操作栈后,对局部变量表中的 i 自增 1。线程取出使用操作数栈栈顶值的自增前的值。
- ++i:先对局部变量表的 i 自增 1,然后取出并压入操作栈,线程再从操作栈栈顶值取出自增之后的值使用。
3. 动态链接
4. 方法返回地址
方法退出的过程就是栈帧在虚拟机栈上的出栈过程,因此退出时的操作可能有:恢复上层方法的局部变量表和操作数栈,把返回值压入调用者的操作数栈,每条整pc计数器的值指向调用该方法的后一条指令。
补充
-
垃圾回收是否涉及栈内存?
- 垃圾回收主要针对的是堆内存。栈内存的生命周期由方法调用和返回自动管理,因此不需要GC机制介入。
-
栈内存分配越大越好吗?
- 优点:较大的栈内存可以允许更深的递归调用和更复杂的调用栈
- 缺点:每个线程占用更多内存,容易耗尽总内存资源
-
方法内的局部变量是否线程安全?
- 通常线程安全,因为每个线程有独立的栈空间。
- 例外:若局部变量引用了可变对象并被多个线程共享,则需要同步控制。
3. 本地方法栈
(1)定义
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的:
- 虚拟机栈为虚拟机执行Java方法(也就是字节码)服务
- 本地方法栈则是为虚拟机使用到的本地(Native)方法服务
(2)作用
为 JVM 执行 Native 方法(非 Java 代码实现的方法,如 C/C++ 编写的 JNI 方法)提供内存空间。
(3)归属
线程私有,每个线程在创建时都会分配独立的本地方法栈。
(4)栈合并
HotSpot 将虚拟机栈与本地方法栈合并,通过一个统一的栈结构管理。
(5)异常
StackOverflowError
:栈深度超过 JVM 限制时抛出(如递归调用过深)OutOfMemoryError
:栈扩展失败时抛出(如内存不足)
4. 堆
(1)定义
JVM 中最大的内存区域,用于存储所有对象实例和数组(通过 new 关键字创建的对象)。
此内存区域的唯一作用就是存放对象实例。
(2)归属
线程共享,所有线程均可访问堆中的对象。
(3)生命周期
对象在堆中分配内存,由垃圾回收器(GC)自动回收(无显式释放)。
(4)异常
OutOfMemoryError
:堆内存不足且无法扩展时抛出(如内存泄漏或对象过多)
(5)虚拟机栈
栈帧中存储对象的引用(指向堆中的对象实例)。
5. 方法区
(1)定义
方法区是JVM规范中定义的逻辑内存区域,用于存储类元数据、运行时常量池、静态变量、即时编译器(JIT)编译后的代码等数据。
(2)内容
- 类元数据存储:类名、父类、字段、方法、访问修饰符等
- 静态变量:类级别的static变量直接存储在方法区
- JIT热点代码:编译后的本地机器码存储在“代码缓存”(Code Cache)
- 运行时常量池:动态解析符号引用,支持运行时添加常量
(3)垃圾回收
- 可以不实现垃圾回收
- 回收目标主要是常量池和类型卸载
- 方法区无法满足内存需求时抛出
OutOfMemoryError
静态常量池(Class常量池)
(1)定义
每个Java类被编译后形成的 .class
文件中包含常量池信息,用于存放编译器生成的各种字面量和符号引用。
(2)位置
保存在编译后的 .class
文件中。
(3)存储内容
-
字面量:
- 文本字符串(用双引号包裹的值)
- 被声明为final的常量
- 基本数据类型值
- null
-
符号引用:
- 类符号引用(完全限定名)
- 字段/方法的名称和描述符
运行时常量池
(1)定义
方法区的一部分,用于存储类文件中的常量数据(字面量)和符号引用。
(2)位置
- JDK 7 及之前:永久代(PermGen)
- JDK 8 起:Metaspace
(3)作用
- 内存优化:共享重复常量
- 加速访问:减少解析开销
(4)来源
- 编译期字面量与符号引用
- 运行期动态生成常量(如
String.intern()
)
(5)结构组成
- 字符串常量池(JDK 7 起移至堆中)
- 符号引用表
(6)关键特性
- 字符串字面量直接引用池中对象,
new String("a")
创建堆中新对象 intern()
可强制加入池(注意性能)- 包装类常量池(如 Integer 缓存 -128~127)
- 类加载时解析符号引用为直接引用
以下是不改动文章内容,仅转换为 Markdown 格式后的结果:
字符串常量池
(1)位置变化
- JDK 1.6及之前:作为运行时常量池的一部分,位于永久代。
- JDK 1.7:从永久代分离,移动到堆内存中。
- JDK 1.8及之后:仍保留在堆内存中。
(2)放入字符串常量池的3种途径
1. 字面量赋值
直接存入常量池
- 字符串变量拼接原理是 StringBuilder
- 字符串常量拼接原理是编译期优化
String s1 = "a"; // 延迟:运行到这一步才会放入串池
String s2 = "b";
String s3 = "ab";
String s4 = s1 + s2; // new StringBuilder().append(s1).append(s2).toString() 即 new String("ab")
String s5 = "a" + "b"; // javac在编译器的优化
System.out.println(s3 == s4); // f
System.out.println(s3 == s5); // t
流程步骤:
- 检查常量池:JVM 解析代码时发现字面量
"abc"
,首先检查字符串常量池中是否存在哈希值相同的字符串。 - 存在则复用:若池中存在
"abc"
(通过equals
确认内容相同),直接返回池中对象的引用(s1 和 s2 指向同一对象)。 - 不存在则创建:若池中无
"abc"
,在常量池中创建该字符串对象,并返回引用。
底层实现:
- 字符串常量池本质是哈希表(StringTable),默认桶数为 60013(可通过
-XX:StringTableSize
调整)。 - 哈希值由字符串内容计算,冲突时通过链表或红黑树处理。
2. new String(“”)
堆对象与池交互
String s3 = new String("abc");
String s4 = s3.intern();
System.out.println(s3 == s4); // JDK 7+ 中为 false(s4 指向池对象,s3 指向堆对象)
流程步骤:
- 堆中创建对象:
new String("abc")
会在堆中创建一个新的字符串对象。 - 处理字面量:
- 若字面量
"abc"
不在常量池中,JVM 先在池中创建"abc"
,再将堆对象指向该字面量的字符数组。 - 若池中已有
"abc"
,堆对象直接引用池中的字符数组(但堆对象本身是独立实例)。
- 若字面量
3. intern()
String s5 = new StringBuilder("ja").append("va").toString();
System.out.println(s5.intern() == s5); // JDK 7+ 输出 true(池中无 "java" 时)
流程步骤(以 JDK 7+ 为例):
- 检查常量池:调用
intern()
时,检查池中是否存在与当前字符串内容相同的对象。 - 存在则返回引用:直接返回池中对象的引用。
- 不存在则驻留:
- JDK 1.8:将当前字符串对象自身的引用直接加入常量池,并返回这个引用。
- JDK 1.6:在常量池中复制(也就是在永久代中创建一份新的字符串对象)后返回该副本的引用,这样原来在堆中创建的字符串对象和常量池中的对象就不是同一个引用了。
4. StringTable垃圾回收
- JDK6及之前:StringTable 位于永久代(PermGen),仅在 Full GC 时回收,且永久代空间有限,易导致 OutOfMemoryError。
- JDK7及之后:StringTable 移至堆内存,随堆的 Minor GC 或 Major GC 触发回收,内存管理更灵活。
- StringTable 中的字符串对象会参与垃圾回收,但其哈希表结构本身不受 GC 影响。
StringTable 的底层结构
- 哈希表存储:
StringTable 本质是一个固定大小的哈希表(HashTable),采用数组 + 链表(或红黑树)结构,默认桶数为 60013(可通过-XX:StringTableSize
调整)。
5. StringTable调优
-
调整哈希表桶数量
- StringTable 底层由 HashTable 实现,其性能与桶(Bucket)数量直接相关。桶数量越大,哈希冲突概率越低,查询效率越高。
- 默认值:
- JDK6及之前:1009(永久代)
- JDK7+:60013(堆内存)
- 调整桶数:
-XX:StringTableSize=<size>
(JDK8+最小值为 1009)
-
主动控制字符串入池(intern()方法)
-
适用场景:大量重复字符串(如地址、配置项)通过
intern()
复用,减少堆内存占用。List<String> address = new ArrayList<>(); address.add(line.intern()); // 入池后重复字符串引用同一对象
-
6. 直接内存
(1)概念
直接内存(Direct Memory)是 Java 通过 java.nio.ByteBuffer.allocateDirect()
分配的堆外内存,由操作系统直接管理,不属于 JVM 运行时数据区,但可通过 JVM 参数 -XX:MaxDirectMemorySize
限制其大小。
(2)特性
- 高性能:减少数据在 JVM 堆与操作系统内核之间的拷贝,适用于高频 I/O 操作(如文件读写、网络通信)。
- 手动管理:内存分配和释放需开发者控制,但通过
DirectByteBuffer
对象间接管理,实际回收依赖 JVM 垃圾回收机制和虚引用。 - 零拷贝:支持直接与本地 I/O 交互,避免传统 I/O 的双缓冲区复制。
(3)管理与回收机制
一、直接内存的分配与对象结构
- 分配入口
调用ByteBuffer.allocateDirect()
时,底层通过DirectByteBuffer
构造函数触发内存分配:DirectByteBuffer(int cap) {super(...);// 通过 Unsafe 类分配直接内存long base = unsafe.allocateMemory(cap);unsafe.setMemory(base, cap, (byte) 0);// 创建 Cleaner 虚引用,绑定释放逻辑cleaner = Cleaner.create(this, new Deallocator(base, cap)); }
- 关键对象关系
- DirectByteBuffer 对象:位于堆内存,作为直接内存的引用句柄。
- Cleaner 对象:继承自
PhantomReference
,维护释放内存的回调逻辑。 - Deallocator 对象:实现
Runnable
,最终调用Unsafe.freeMemory()
释放内存。
二、释放流程
阶段 1:DirectByteBuffer 对象被标记为不可达
- 触发条件:堆中的 DirectByteBuffer 对象不再被任何 GC Roots 引用(如局部变量失效、强引用置为 null)。
- GC 扫描:在 Young GC 或 Full GC 时,垃圾回收器识别该对象为垃圾。
阶段 2:Cleaner 虚引用入队
- 引用队列:Cleaner 作为虚引用(PhantomReference),当 DirectByteBuffer 对象被回收时,JVM 将其关联的 Cleaner 对象加入
ReferenceQueue
。 - 内部线程处理:JVM 的
ReferenceHandler
线程(高优先级守护线程)监控该队列,发现新加入的 Cleaner 对象后,触发其清理逻辑。
阶段 3:执行 Deallocator 释放内存
- 回调逻辑:
Cleaner 对象的clean()
方法被调用,执行其绑定的Deallocator.run()
:public void run() {if (address != 0) {// 调用 Unsafe 释放内存unsafe.freeMemory(address);address = 0;} }
- 内存释放:
Unsafe.freeMemory()
直接向操作系统释放对应的物理内存或虚拟内存。
三、关键机制深度解析
- 虚引用(PhantomReference)的作用
- 与 Finalizer 的区别:
- Finalizer 通过
finalize()
方法实现资源释放,但存在执行延迟和不确定性。 - Cleaner 使用虚引用 +
ReferenceQueue
,确保释放逻辑更及时、更可靠。
- Finalizer 通过
避免内存泄漏:
- 虚引用不阻止对象被回收(
get()
始终返回 null),确保DirectByteBuffer
对象可被正常 GC。
- 显式 GC 的触发问题
- 若 JVM 启动参数包含
-XX:+DisableExplicitGC
,显式调用System.gc()
将失效,或者未显式调用System.gc()
且未触发 Full GC,则ByteBuffer
、DirectByteBuffer
对象可能长期未被回收,导致直接内存未释放。
- 若 JVM 启动参数包含
其他
1. 永久代为什么被替换为元空间
- 永久代设置空间大小是很难确定的,因为可能某个实际的业务场景中有不断的类加载等工作,但是元空间时使用本地内存,默认情况下是本地大小限制的。
- 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
- 字符串存在永久代中,容易出现性能问题和内存溢出。这些也是
相关文章:
【JVM】运行时数据区域
文章目录 1. 程序计数器补充 2. 虚拟机栈2.1 栈帧1. 局部变量表2. 操作数栈3. 动态链接4. 方法返回地址补充 3. 本地方法栈4. 堆5. 方法区静态常量池(Class常量池)运行时常量池字符串常量池(1)位置变化(2)放…...
【场景应用5】深入探讨去噪扩散概率模型及训练推理过程
在这篇博客文章中,我们将深入探讨去噪扩散概率模型(Denoising Diffusion Probabilistic Models,简称DDPMs,扩散模型,基于评分的生成模型,或简单的自编码器),因为研究人员在(无条件或有条件的)图像/音频/视频生成任务中,已经取得了显著的成果。流行的例子(在撰写本文…...
TCP 如何在网络 “江湖” 立威建交?
一、特点: (一)面向连接 在进行数据传输之前,TCP 需要在发送方和接收方之间建立一条逻辑连接。这一过程类似于打电话,双方在通话前需要先拨号建立连接。建立连接的过程通过三次握手来完成,确保通信双方都…...
mysql:重置表自增字段序号
情况一:清空表数据后重置自增 ID 如果你希望清空表中的所有数据,并将自增 ID 重置为初始值(通常为 1) 1、truncate truncate table tb_dict; 2、delete 配合 alter 语句 delete from tb_dict; alter table tb_dict AUTO_INCR…...
【Code】《代码整洁之道》笔记-Chapter13-并发编程
第13章 并发编程 “对象是过程的抽象。线程是调度的抽象。” 编写整洁的并发程序很难——非常难,而编写在单线程中执行的代码却简单得多。编写表面上看似不错、深入进去却支离破碎的多线程代码也简单,但是系统一旦遭受压力,这种代码就扛不…...
TDengine 可靠性保障:数据持久化与容灾备份(一)
一、引言 在数字化浪潮席卷全球的当下,数据已成为企业和组织最为关键的资产之一。无论是互联网企业记录用户的行为数据,还是金融机构存储交易信息,又或是工业领域监测设备的运行状态,数据的可靠性直接关乎到业务的正常运转、决策…...
AWTK-MVVM 如何让多个View复用一个Model记录+关于app_conf的踩坑
前言 有这么一个业务,主界面点击应用窗口进入声纳显示界面,声纳显示界面再通过按钮进入菜单界面,菜单界面有很多关于该声纳显示界面的设置项,比如量程,增益,时间显示,亮度,对比度等…...
第四节:React Hooks进阶篇-useEffect依赖项为空数组[]与不写的区别
陷阱题:闭包问题、Stale Closure举例 一、依赖项为空数组[]与不写的核心区别 行为空数组[]不写依赖项执行时机仅在组件挂载时执行一次(类似componentDidMount)组件每次渲染后都执行(类似componentDidUpdate)更新触发…...
25级总分413数学一142专业124东南大学820考研经验电子信息通信工程,真题,大纲,参考书。
我是南京理工大学的本科生,25 考研一战东大,政治 69,英一 78,数一 142,专业课(820)124,总分 413。我从 3 月正式开始备考,专业课跟着无线电论坛jenny 老师进行学习&#…...
Docker Desktop磁盘镜像位置用途解析
在设置里面的资源中有个磁盘镜像位置的配置,这个目录默认位置是:C:\Users\haitao.luo\AppData\Local\Docker\wsl\disk,这里面对应的是一个docker_data.vhdx,虚拟磁盘文件,因为是在c盘上,所以可能后面下载镜…...
android display 笔记(十)surfaceflinger与HWC的关系
在 Android 图形系统中,SurfaceFlinger 和 Hardware Composer (HWC) 是紧密协作的两个核心组件,共同负责屏幕内容的合成与显示。它们的关系可以用 “决策者与执行者” 来概括: 首先HWC中 DEVICE:指“显示设备硬件”(…...
#MES系统运维问题分析思路
一套适用于90% MES运维现场问题的排查分析思维模型,叫做: 🔍 MES系统问题分析七步法(现场实战适用) ✅ 第一步:明确问题现象(What) 问题要说清楚,“不能操作”这种模糊描…...
基于FPGA的六层电梯智能控制系统 矩阵键盘-数码管 上板仿真均验证通过
基于FPGA的六层电梯智能控制系统 前言一、整体方案二、软件设计总结 前言 本设计基于FPGA实现了一个完整的六层电梯智能控制系统,旨在解决传统电梯控制系统在别墅环境中存在的个性化控制不足、响应速度慢等问题。系统采用Verilog HDL语言编程,基于Cyclo…...
FPGA上实现SD卡连续多块读的命令
在FPGA上实现SD卡连续多块读的命令 CMD17命令一次只能读取1个块 CMD18命令一次可以连续读取多个块,直到停止命令CMD12 CMD18命令读的块数程序可任意设置 目录 前言 一、SD卡多块读命令CMD18 二、停止读命令CMD12 三、SD卡初始化SD卡连续块读操作的verilog代码 …...
AI 大语言模型 (LLM) 平台的整体概览与未来发展
📋 分析报告:AI 大语言模型 (LLM) 平台的整体概览与未来发展 自动生成的结构化分析报告 💻 整体概述:AI LLM 平台的市场现状与发展动力 随着人工智能技术的飞速发展,大语言模型(Large Language Models, L…...
【技术派部署篇】Windows本地部署技术派
一、技术派简介 技术派是一个采用 Spring Boot、MyBatis-Plus、MySQL、Redis、ElasticSearch、MongoDB、Docker、RabbitMQ 等技术栈的社区系统,其 1.0 版已正式上线。该项目的技术栈按阶段集成引入,开发者可根据自身需求选择不同版本进行学习。 二、环…...
asm汇编语言源代码之-获取环境变量
提供1个子程序: 1. 读取环境变量 GETENVSTR 具体功能及参数描述如下 GETENVSTR PROC FAR ;IN: DSPSP SEG. ; ES:BX -> ENV VAR NAME ;OUT: DS:DX -> ENV VAR VALUE; IF DX0FFFFH, NOT FOUND ; more source code at http://www.ahjoe.com/source/srcdown.aspPU…...
消失的它:揭开 CoreData 托管对象神秘的消失之谜(上)
概述 使用 CoreData 作为 App 持久存储“定海神针”的小伙伴们想必都知道,我们需要将耗时的数据库查询操作乖巧的放到后台线程中,以便让主线程负责的 UI 获得风驰电掣般地享受。 不过,如何将后台线程中查询获得的托管对象稳妥的传送至主线程…...
Python中如何用正则表达式精准匹配IP地址?
在网络编程和数据处理时,我们经常需要从文本中提取或验证IP地址。Python的正则表达式(re模块)是完成这个任务的利器。但你知道怎么写才能准确匹配各种合法的IP地址吗?今天我们就来详细探讨这个问题。 为什么需要IP正则表达式? 假设你正在分…...
初识华为防火墙
防火墙配置与应用 一、防火墙的基本概念 1.防火墙的网络区域(一般认为三个区域:trust、DMZ、untrust) (1)本地区域(安全级别 100,local)(防火墙内部区域,一般不说明此…...
十二、C++速通秘籍—静态库,动态库
上一章节: 十一、C速通秘籍—多线程-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147055932?spm1001.2014.3001.5502 本章节代码: cpp2/library CuiQingCheng/cppstudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/cppst…...
我爱学算法之——滑动窗口攻克子数组和子串难题(下)
这几道题可以说是有一点难度的,但是掌握方法以后可以说非常简单了; 一、找到字符串中所有字母异位词 题目解析 题目给定了两个字符串s和p,让我们在s中找到p的异位词的字串,并且返回这些字串的索引 **异位词:**简单来说…...
leaflet 之 获取中国某个行政区的经纬度边界(latLngBounds)
思路 在json文件中获取下面的四个点 组成东北,西南两组 { “southwest”: { “lat”: 35.950, “lng”: 120.000 },//西南方 “northeast”: { “lat”: 36.200, “lng”: 120.300 }//东北方 } 最西点经度(minLng) 最东点经度(maxLng&#x…...
鸢尾花分类的6种机器学习方法综合分析与实现
鸢尾花分类的6种机器学习方法综合分析与实现 首先我们来看一下对应的实验结果。 数据准备与环境配置 在开始机器学习项目前,首先需要准备编程环境和加载数据。以下代码导入必要的库并加载鸢尾花数据集: import numpy as np import pandas as pd impo…...
基于李永乐线性代数基础的行列式的起源于理解
起源于解方程组的过程 对于解一个二元方程组,很自然的会通过加减消元,变成下面这样 对于三元方程组,也是一样: 这一大长串,是A*x1b1这个形式时,A的值 人们为了方便记忆x未知数前这一大坨相乘后相加减的数…...
MacOs java环境配置+maven环境配置踩坑实录
oracl官网下载jdk 1.8的安装包 注意可能需要注册!!! 下载链接:下载地址点击 注意晚上就不要下载了 报错400 !!! 1.点击安装嘛 2.配置环境变量 export JAVA_HOME/Library/Java/Java…...
LeetCode 3272.统计好整数的数目:枚举+排列组合+哈希表
【LetMeFly】3272.统计好整数的数目:枚举排列组合哈希表 力扣题目链接:https://leetcode.cn/problems/find-the-count-of-good-integers/ 给你两个 正 整数 n 和 k 。 如果一个整数 x 满足以下条件,那么它被称为 k 回文 整数 。 x 是一个…...
蓝桥杯嵌入式历年省赛客观题
一.第十五届客观题 第十四届省赛 十三届 十二届...
RFID 在制造业的深度应用与未来趋势
一、引言 制造业作为国民经济的核心支柱,正面临着全球供应链重构、个性化需求激增、成本压力加剧等多重挑战。RFID(射频识别)技术以其非接触式自动识别、数据实时传输、环境适应性强等特性,成为推动制造业数字化转型的关键引擎。…...
spring--声明式事务
声明式事务 1、回顾事务 要么都成功,要么都失败! 事务在项目开发中,十分重要,涉及数据的一致性问题 确保完整性和一致性 事务ACID: 原子性:事务是原子性操作,由一系列动作组成,…...
java爬虫案例
以下是一个简单的Java爬虫案例,使用了 Jsoup 和 Apache HttpClient 两个常用的库来实现网页内容的爬取和解析。这个案例会演示如何获取网页的HTML内容、解析HTML并提取所需数据。 示例:使用Jsoup爬取网页内容 1. 添加依赖 在项目中添加以下依赖ÿ…...
博途 TIA Portal之1200做主站与有意思的板子做MODBUS_RTU通讯
做为博途的硬件,1200和1500本体都不具有串口通讯功能,只能使用扩展板或是通讯模块完成。 其中1200使用CB1241或CM1241进行串口通讯,本文将使用CM1241进行演示。 1、硬件介绍 1200的PLC一台,有意思的板子(以下简单4D板)一台。 其中1200带扩展模块CM1241 RS232;4D板使…...
01_核心系统下的技术原理解析
15年前,基本上国内的核心系统被C垄断,基本上是IBM的那套东西,场景也是比价复杂,这里不再赘述,TPS太过于庞大,技术上确实比较复杂。为此我这里抛砖引玉,说下对应的支付系统: &#x…...
【力扣hot100题】(092)最长回文串
有点难度,一开始想到的两种方法都不对,花了不少时间。 先说之前的方法: ① 遍历每个点,每个点向外扩张,如果左等于右就一直扩展直到不等。 这个方法可是可以,但我没有考虑到两个相同字母也是回文串的情况…...
第一期:[特殊字符] 深入理解MyBatis[特殊字符]从JDBC到MyBatis——持久层开发的转折点[特殊字符]
前言 🌟 在软件开发的过程中,持久层(或数据访问层)是与数据库进行交互的关键部分。早期,开发者通常使用 JDBC(Java Database Connectivity)来实现与数据库的连接与操作。虽然 JDBC 在一定程度上…...
指针的进阶2
六、函数指针数组 字符指针数组 - 存放字符指针的数组 char* arr[10] 整型指针数组 - 存放整型指针的数组 int* arr[10] 函数指针数组 - 存放函数指针的数组 void my_strlen() {} int main() {//指针数组char* ch[5];int arr[10] {0};//pa是是数组指针int (*pa)[10] &…...
Java学习——day28(Java并发工具类与线程池)
文章目录 1. 并发工具类简介1.1 ExecutorService1.2 Callable 和 Future1.3 Executors 工具类1.4 线程池优势 2. 实践:线程池执行任务并收集结果示例2.1 示例代码 3. 代码详解3.1 线程池的创建3.2 定义任务列表3.3 提交任务并收集 Future3.4 获取任务执行结果3.5 关…...
2021第十二届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 1、空间-(题解)-字节单位转换 2、卡片-(题解)-可以不用当组合来写,思维题 3、直…...
【数据结构】之二叉树
二叉树是我们在数据结构中学到的第一个非线性结构,是后续学习更为复杂的树、图结构的基础。本文整理了二叉树的概念定义、基本操作、遍历算法、伪代码与代码实现以及实例说明,方便大家随时查找对应。 一、定义与基本术语 二叉树是一种树形结构…...
电感、互感器、变压器和磁珠综合对比——《器件手册--电感/线圈/变压器/磁珠篇》
三、电感/线圈/变压器/磁珠 名称 定义 特点...
CLIP中的Zero-Shot Learning原理
CLIP(Contrastive Language-Image Pretraining)是一种由OpenAI提出的多模态模型,它通过对比学习的方式同时学习图像和文本的表示,并且能在多种任务中进行零样本学习(Zero-Shot Learning)。CLIP模型的核心创…...
基于 Redis 实现一套动态配置中心 DCC 服务与反射基础知识讲解
目录 动态配置中心核心价值 轻量级 Redis 方案与 ZooKeeper 的对比分析 为什么选择自定义 Redis 方案? 1. 技术决策背景 一、活动降级拦截 1. 定义与作用 2. 实现原理 二、活动切量拦截 1. 定义与作用 2. 实现原理 三、两者的核心区别 四、实际应用案例 1. 电商大促…...
vue 前端遇到问题 样式不展示
vue 前端遇到问题 样式不展示 先看接口返回有数据没 如果有数据看下 是不是 输入赋值给其他 字段 没有赋值上导致报错 所以页面没展示数据...
基于 Spring Boot + Vue 的 [业务场景] 管理系统设计与实现
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
2025蓝桥杯JavaB组
说明 博主自己水平有限,而且答案也不一定对,下面代码和思路仅作分享。我只把我考场上做了的写出来了,有什么问题欢迎评论区交流。 A:逃离高塔 思路: 由于有了去年的经验,所以一上来我就是找规律…...
HDF5文件格式:数据类型与读写功能详解
HDF5文件格式:数据类型与读写功能详解 HDF5简介 HDF5(Hierarchical Data Format version 5)是一种用于存储和管理大量科学数据的文件格式和库。它由美国国家高级计算应用中心(NCSA)开发,具有以下特点&…...
探索 Python 的 functools 模块:缓存、属性缓存与 LRU 缓存
李升伟 编译 Python 的 functools 模块是函数式编程爱好者的宝库,提供了许多工具来提升代码的效率和优雅性。本文将深入探讨三个强大的函数——cache、cached_property 和 lru_cache,它们通过存储昂贵计算的结果来优化性能。无论是加速递归算法还是简化…...
缓存与数据库一致性:从问题到解决方案全解析
一、⼀致性问题的由来:为什么会不一致? 我们先从现实例子出发,来看为什么会出现一致性问题: 📦 场景举例:电商下单业务 用户提交订单 → 服务写入数据库订单表;同时更新缓存(比如用…...
【android bluetooth 框架分析 02】【Module详解 2】【gd_shim_module 模块介绍】
1. 背景 上一章节 我们介绍了 module_t 的 大体框架 ,本节内容我们就选择 我们的 gd_shim_module 模块为例子,具体剖析一下,它里面的逻辑。 static const char GD_SHIM_MODULE[] "gd_shim_module";// system/main/shim/shim.cc …...
dbt:新一代数据转换工具
dbt(Data Build Tool)一款专为数据分析和工程师设计的开源工具,专注于 ETL/ELT 流程的数据转换(Transform)环节,帮助用户以高效、可维护的方式将原始数据转换为适合分析的数据模型。 用户只需要编写查询&am…...