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

JVM方法区核心技术解析:从方法区到执行引擎

方法区

方法区的内部结构

在经典方法区设计中,主要存储以下核心数据内容:

一、类型信息


方法区维护的类型信息包含以下要素:

  1. 类全称标识
  • 类名称(含完整包路径)
  • 直接父类的完全限定名(包含完整包路径)
  • 实现的直接接口完全限定名列表
  • 类访问修饰符(public/final/abstract等)

二、字段信息


每个字段的元数据包含:

  • 字段访问修饰符(public/private/protected等)
  • 字段数据类型(基础类型/对象引用)
  • 字段名称标识符

三、方法元数据


每个方法存储的详细信息包含:

  • 方法名称
  • 返回类型(包含void)
  • 参数列表类型顺序
  • 访问修饰符(synchronized/native等)
  • 字节码指令集
  • 操作数栈深度
  • 局部变量表容量
  • 异常处理表(catch块位置信息)

四、类变量存储

非final静态变量
  • 类加载阶段初始化
  • 允许运行时修改
  • 作为类实例共享的存储区域
全局常量(static final)
  • 编译期完成赋值
  • 不可修改的常量池数据
  • 独立于类实例存在

字节码常量池与运行时常量池的关系

█ 存储位置的差异
  • 字节码常量池(Constant Pool)​​:存在于编译后的.class文件中,属于静态存储结构
  • 运行时常量池(Runtime Constant Pool)​​:位于JVM方法区(Java 8+的元空间),是动态运行时数据结构
█ 常量池存在的必要性

通过索引复用机制解决以下问题:

  • 减少重复数据的存储(如重复字符串字面量)
  • 压缩字节码体积(平均缩小40%+)
  • 统一管理符号引用(避免硬编码内存地址)
█ 常量池内容详解

.class文件常量池存储:

  • 字面量(Literal):数值、文本字符串(如"Hello")、声明为final的常量
  • 符号引用(Symbolic References)

运行时常量区
 

运行时常量池(Runtime Constant Pool)是《Java虚拟机规范》中定义的方法区(Method Area)的核心组成部分。每个类或接口在加载后,其常量池表中的内容会被映射到运行时常量池中。

在Class文件结构中,常量池表(Constant Pool Table)存储了编译期生成的字面量(Literal)、类与接口的全限定名、字段与方法的符号引用等信息。当类加载器完成类的装载过程后,这些静态的常量数据会被动态加载到运行时常量池中,形成运行时的数据结构。

运行时常量池的内存分配具有以下特性:

  1. 动态扩展能力:虽然规范允许通过-XX:MaxMetaspaceSize(JDK8+)或历史版本的-XX:MaxPermSize参数设置元空间/永久代的最大值,但当创建新类型(如动态代理类)或接口时,若内存申请超过JVM允许的容量上限,将会抛出OutOfMemoryError异常。

  2. 符号引用解析机制:运行时常量池中存储的符号引用(Symbolic References)包含了类、方法、字段的间接定位信息。在类加载的解析(Resolution)阶段,虚拟机会将这些符号引用转换为具体的内存地址(直接引用),这种延迟绑定的特性是实现Java动态扩展能力的重要基础。

HotSpot方法区的演进

一、方法区的版本演进路径


(1)JDK 1.6及之前版本
■ 永久代(PermGen)作为方法区的实现
■ 存储内容:类元数据、静态变量、运行时常量池(含字符串常量池)

(2)JDK 1.7版本
■ 永久代开始逐步解体
■ 字符串常量池迁移至Java堆
■ 静态变量保留在永久代

(3)JDK 1.8+版本
■ 永久代完全废弃
■ 元空间(Metaspace)成为新方法区实现
■ 存储内容:类元信息、字段描述、方法字节码、常量池(除字符串)
■ 静态变量和字符串常量池永久迁移至Java堆

二、永久代消亡的技术动因

内存管理瓶颈
■ 固定内存分配导致空间震荡:动态类加载机制容易引发内存溢出
■ 堆内存挤压效应:永久代与堆内存共享JVM进程空间,大尺寸永久代设置会压缩可用堆空间
■ Full GC触发频繁:永久代内存回收依赖老年代GC,容易导致不可预测的应用程序停顿

JDK7将StringTable从永久代迁移至堆内存的核心原因在于内存管理机制的优化。永久代作为方法区的具体实现,其内存回收机制严重依赖Full GC的触发条件——只有当老年代或永久代自身内存不足时才会执行。这种低频回收机制与字符串常量池的动态特性存在根本矛盾:

  1. 高频使用场景:字符串常量池(StringTable)承载着大量运行时生成的字符串对象(包括字面量和intern操作产生的对象),具有较高的内存分配频率

  2. 内存刚性限制:永久代内存空间固定且无法动态扩展,当应用程序大量使用String.intern()或加载海量类时,极易引发java.lang.OutOfMemoryError: PermGen space异常

  3. 回收效率失衡:Full GC的低触发频率无法有效应对字符串常量池可能产生的短期对象潮汐现象,导致无效内存无法及时释放

方法区的垃圾回收机制解析

在Java虚拟机体系结构中,方法区的内存回收机制具有其特殊性。根据JVM规范,方法区的垃圾回收并非强制要求事项,其具体实现完全依赖于虚拟机厂商的设计策略。以HotSpot虚拟机为例,虽然其实现了方法区的回收机制,但实际运行中该区域的回收效率往往难以达到理想状态,尤其在类型信息回收方面存在显著的技术挑战。值得注意的是,当应用场景涉及大量动态类生成(如动态代理、脚本语言支持等)时,方法区的内存压力会急剧增大,这使得内存回收机制成为必须重点关注的性能优化点。

方法区的回收主要包含两大核心部分:

一、常量池回收机制
常量池的回收机制与堆内存中的对象回收存在相似性。当某个常量(无论是字面量还是符号引用)失去所有引用关联,即不再被任何类、方法或字段所依赖时,该常量即进入可回收状态。

二、类型卸载机制
类元数据的回收则需满足更为复杂的条件集合:
1. 引用断绝条件:目标类及其所有派生类在Java堆中不存在任何活动实例,同时在方法区不存在该类被加载的静态引用
2. 类加载器条件:加载该类的类加载器实例本身已被成功回收,这一条件在存在复杂类加载器层级时往往难以达成
3. 类型关联条件:对应java.lang.Class对象不存在任何活跃引用,包括反射机制产生的引用
4. 参数制约条件:即使满足上述基础条件,仍需考虑虚拟机启动参数(如-XX:+ClassUnloading)的设置状态

随着现代Java技术的发展,特别是在模块化系统、动态语言支持等场景下,自定义类加载器的使用呈现爆发式增长。这种技术演进使得类型卸载的需求变得愈发迫切,应用程序在长时间运行过程中容易因类元数据堆积导致元空间(Metaspace)内存溢出,这使得优化方法区回收机制成为提升JVM稳定性的关键环节。

Java虚拟机内存结构总结

线程私有内存区域:

  1. 程序计数器(Program Counter Register)
    • 记录当前线程执行字节码指令的地址
  2. 本地方法栈(Native Method Stack)
    • 服务于Native方法的调用执行
  3. 虚拟机栈(Java Virtual Machine Stack)
    • 包含四个核心组件:
      • 操作数栈(Operand Stack) - 执行字节码指令的工作区
      • 局部变量表(Local Variables) - 存储方法参数和局部变量
      • 动态链接(Dynamic Linking) - 连接方法区运行时常量池的符号引用
      • 方法返回值 - 处理方法的返回操作

方法区(Method Area):

  • 存储类型信息(Class结构)
  • 保存方法信息(字节码、访问标志等)
  • 包含域信息(字段名称、类型、访问修饰符)
  • 维护运行时常量池(Runtime Constant Pool)

堆内存(Heap):

  1. 新生代(Young Generation)
    • 伊甸园区(Eden Space) - 对象初次分配区域
    • 幸存者区(Survivor Space) - 包含两个等大的From和To空间
  2. 老年代(Old Generation/Tenured)
    • 存储长期存活对象

Java对象实例化机制解析

对象创建方式

  1. new关键字
    最基础的实例化方式,通过new ClassName()直接调用构造函数创建对象。

  2. 反射机制

    • Class.newInstance()
      要求类必须有无参构造器且访问权限为public,JDK9+已标记为过时方法
    • Constructor.newInstance()
      支持任意参数类型的构造器调用,更灵活的反射实例化方式
  3. 对象克隆
    通过实现Cloneable接口并重写clone()方法,基于已有对象进行复制(浅拷贝)

  4. 反序列化
    通过ObjectInputStream序列化的二进制数据还原为内存对象

  5. 第三方工具
    如Objenesis库可绕过构造器直接实例化对象,适用于特殊场景的类初始化

对象创建流程(HotSpot实现)

1. 类加载检查

  • 加载​:将类的字节码载入方法区,创建Class对象
  • 链接​:包含验证、准备(静态变量零值初始化)、解析(符号引用转直接引用)
  • 初始化​:执行类构造器<clinit>(),完成静态变量显式赋值和静态代码块执行

2. 内存分配策略

  • 指针碰撞(Bump the Pointer)​
    适用于规整内存布局,通过移动指针划分内存空间
  • 空闲列表(Free List)​
    处理碎片化内存,维护可用内存块记录进行分配

3. 并发控制机制

  • CAS+失败重试​:保证指针更新操作的原子性
  • TLAB(Thread-Local Allocation Buffer)​
    为每个线程预分配独立内存区域,避免直接竞争 Eden 区空间

4. 内存空间初始化

  • 零值初始化​:将分配到的堆内存置为默认值(如int=0,引用=null)
  • 对象头设置​:
    • Mark Word:存储哈希码、锁状态、GC年龄等运行时数据
    • Klass Pointer:指向方法区的类型信息

5. 对象构造初始化

  1. 字段默认值初始化 
  2. 显式赋值/代码块初始化 
  3. 构造函数初始化
    通过执行<init>方法完成对象完整初始化逻辑

关键区别:零值初始化保证对象字段有确定初始状态,构造器初始化实现业务逻辑要求的对象状态

对象的内存布局

一、对象头(Header)
由运行时元数据类型指针构成,每个对象必须包含的核心数据:

  1. 运行时元数据(Mark Word)

    • 哈希码(HashCode):并非物理地址,而是JVM生成的逻辑标识
    • GC分代年龄(4bit,最大值15触发晋升)
    • 锁状态标志
    • 线程持有锁指针
    • 偏向锁时间戳
  2. 类型指针(Klass Pointer)

    • 指向方法区中的类元数据
    • 开启指针压缩时(-XX:+UseCompressedOops)

二、实例数据(Instance Data)
存储对象实际字段信息,遵循以下规则:

  1. 基本类型优先分配(long/double > int/float > short/char > byte/boolean)
  2. 父类字段优先于子类字段
  3. HotSpot支持字段重排优化(默认开启-XX:+CompactFields)
    • 允许子类字段插入父类字段的内存空隙
    • 减少内存碎片,提升空间利用率

三、对齐填充(Padding)

  1. 保证对象大小为8字节的整数倍
  2. 满足CPU内存对齐访问要求(64位架构需要8字节对齐)
  3. 填充字节不存储有效数据

对象的访问定位

JVM通过栈帧对象引用访问对象实例的机制分析

在Java虚拟机运行时环境中,栈帧中的对象引用本质上存储着指向堆内存的物理地址信息。JVM通过这个地址访问堆内存中的对象实例数据,其具体实现存在两种经典的内存访问模型:

一、句柄访问模式(二级间接寻址)

  1. 内存结构设计
  • 在堆内存中维护独立的句柄池(Handle Pool)
  • 每个句柄结构包含两个指针:
    ① 实例数据指针:指向堆中实际对象实例数据
    ② 类型数据指针:指向方法区的类元信息
  1. 访问路径示例
    栈帧引用 → 句柄地址 → 实例数据指针 → 对象字段数据
                   ↘ 类型指针 → 方法区元数据

  2. 设计优势

  • 对象移动时(如GC复制算法)仅需更新句柄池中的实例指针
  • 引用稳定性:栈帧引用存储的句柄地址保持固定

二、直接指针模式(一级直接寻址)

  1. 内存结构设计
  • 对象头直接包含类型指针(Klass Pointer)
  • 对象实例数据连续存储在堆内存中
  1. 访问路径示例
    栈帧引用 → 对象地址 → 直接访问实例数据
                 ↘ 对象头类型指针 → 方法区元数据

  2. 性能优势对比

  • 访问路径缩短:实例变量访问减少一次指针跳转
  • 内存局部性优化:对象头与实例数据连续存储提高缓存命中率

三、JVM实现选择与优化策略
主流JVM(如HotSpot)采用直接指针方案,主要基于以下设计考量:

  1. 性能优先原则:对象访问属于高频操作,直接寻址节约约30%的指针解析开销
  2. 内存优化策略:省去句柄池空间开销(通常占堆内存3-5%)

直接内存


直接内存是Java虚拟机规范未明确划分的独立内存区域,不属于运行时数据区的组成部分。该区域位于Java堆之外,可直接访问操作系统的本地内存空间。

在传统I/O操作场景中,JVM需要将数据从堆内存复制到操作系统内核缓冲区才能进行磁盘操作。直接缓冲区(Direct Buffer)通过Native堆内存分配,允许应用程序直接通过本地内存完成I/O操作,消除了数据复制产生的性能损耗。

关键特性:

  1. 内存分配不受-Xmx参数限制,但可通过-XX:MaxDirectMemorySize显式设定上限(默认值与堆内存最大值相同)
  2. 高频I/O场景性能优势显著,尤其适用于NIO(New Input/Output)库中的Channel/Buffer操作
  3. 内存溢出时抛出OutOfMemoryError,其实际容量受物理内存与操作系统限制

执行引擎


概述

虚拟机作为软件实现的计算机体系结构,其执行机制与物理机存在本质差异。物理机的执行引擎直接构建于硬件层面;而虚拟机的执行引擎则是通过软件模拟的指令处理系统,具备解析和执行物理机无法直接识别的中间代码(如JVM字节码)的能力。

核心职能

作为Java程序与底层系统的适配层,执行引擎承担着关键的代码转换职责:

  1. 输入处理:接收符合JVM规范的Class文件二进制流,解析其中包含的字节码指令集
  2. 指令转换:将平台无关的字节码指令动态转换为目标操作系统可执行的本地机器指令
  3. 系统对接:通过统一的接口规范,确保转换后的机器指令能够在不同宿主操作系统上正确执行

执行流程

  1. 指令获取:通过程序计数器(PC寄存器)定位下一条待执行字节码的存储位置
  2. 内存访问:根据执行需要访问运行时数据区,包括:
    • 堆内存:操作对象实例数据
    • 方法区:获取类型元数据和常量池信息
    • 对象头:解析对象的运行时类型信息

规范兼容性

所有符合JVM规范的实现均遵循统一的输入输出标准:

  • 输入规范:严格遵循Class文件格式的字节码流
  • 输出规范:符合目标平台的机器指令
    这种标准化设计保证了Java程序"一次编译,到处运行"的跨平台特性。

Java代码编译和执行过程

解释器

解释器是一种按照预设规则逐行翻译字节码的程序,它通过实时解析字节码指令并转换为本地机器能直接执行的机器指令。

JIT(Just-In-Time)编译器

JIT编译器是Java虚拟机在运行时采用的优化技术,它通过动态分析代码执行频率,将高频使用的"热点代码"(HotSpot Code)直接编译为本地机器指令

这种结合编译与解释的双重特性,使得Java既能保持"一次编写,到处运行"的跨平台优势,又能通过运行时编译获得接近原生代码的执行效率。

解释器与JIT编译器的协同机制:
在程序执行体系中,解释器采用逐行翻译执行机制,其执行效率相对较低,而JIT(即时)编译器通过预编译技术能实现更高效的运行速度。这种架构下仍保留解释器的核心价值体现在两个方面:1)解释器具备即时响应特性,支持代码分段执行而无需完整编译;2)在程序初始化阶段,解释器率先启动保障快速响应,待JIT编译器完成编译优化后,系统将无缝切换到编译后的高效代码执行。

服务端发布中的热机态管理策略:
服务器部署场景中通常采用分批次发布机制,其核心技术依据在于服务器状态承载能力的动态关系。处于热机状态(warm state)的服务实例经过JIT优化和资源预热后,其请求处理能力显著高于冷机状态(cold state)的新启动实例。若在服务启动初期直接承载全量生产流量,极易因资源未充分预热导致性能瓶颈,进而引发服务雪崩效应。

JVM编译体系与热点代码探测机制

一、编译子系统

  1. 前端编译器
    负责将Java源代码编译为JVM可识别的字节码文件(.class文件),典型代表为javac编译器。

  2. 即时编译器(JIT Compiler)
    作为运行时编译器,包含两个主要模块:

  • 后端编译器:将字节码动态编译为本地机器指令
  • 优化编译器:对热点代码进行深度优化编译
  1. 静态提前编译器(AOT Compilation)
    直接将Java代码编译为机器指令的技术(如GraalVM Native Image),通过减少运行时编译开销提升启动速度,可能成为未来JVM发展的重要方向。

二、热点代码识别机制
(一) 判定标准

  • 高频执行方法:相同方法多次调用的累计
  • 热循环体:循环代码块的反复执行(包括嵌套循环)

(二) 探测技术

  1. 方法调用计数器
  • 统计方法调用次数(包含递归调用)
  • 阈值控制参数:-XX:CompileThreshold(默认值1500-10000,取决于JVM模式)
  • 热度衰减机制:采用半衰周期统计法(默认10秒周期),防止历史低频调用占用编译资源
  1. 回边计数器
  • 统计循环体执行次数(检测到跳转指令时触发计数)
  • 采用基于循环次数的绝对阈值判断(例如10700次)

相关文章:

JVM方法区核心技术解析:从方法区到执行引擎

方法区 方法区的内部结构 在经典方法区设计中&#xff0c;主要存储以下核心数据内容&#xff1a; 一、类型信息 方法区维护的类型信息包含以下要素&#xff1a; 类全称标识 类名称&#xff08;含完整包路径&#xff09;直接父类的完全限定名&#xff08;包含完整包路径&am…...

AIbase推出全球MCP Server集合平台 收录超12万个MCP服务器客户端

2025年&#xff0c;AI领域迎来了一项重要的技术进展——MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;的广泛应用。全球MCP Server集合平台AIbase(https://mcp.aibase.cn/)应运而生&#xff0c;为AI开发者提供了一站式的MCP服务器和客户端整合…...

Python训练打卡Day22

复习日&#xff1a; 1.标准化数据&#xff08;聚类前通常需要标准化&#xff09; scaler StandardScaler() X_scaled scaler.fit_transform(X) StandardScaler() &#xff1a;这部分代码调用了 StandardScaler 类的构造函数。在Python中&#xff0c;当你在类名后面加上括号…...

【ALINX 实战笔记】FPGA 大神 Adam Taylor 使用 ChipScope 调试 AMD Versal 设计

本篇文章来自 FPGA 大神、Ardiuvo & Hackster.IO 知名博主 Adam Taylor。在这里感谢 Adam Taylor 对 ALINX 产品的关注与使用。为了让文章更易阅读&#xff0c;我们在原文的基础上作了一些灵活的调整。原文链接已贴在文章底部&#xff0c;欢迎大家在评论区友好互动。 在上篇…...

【数据结构入门训练DAY-35】棋盘问题

本次训练聚焦于使用深度优先搜索&#xff08;DFS&#xff09;算法解决棋盘上的棋子摆放问题。题目要求在一个可能不规则的nn棋盘上摆放k个棋子&#xff0c;且任意两个棋子不能位于同一行或同一列。输入包括棋盘大小n和棋子数k&#xff0c;以及棋盘的形状&#xff08;用#表示可放…...

张 提示词优化(相似计算模式)深度学习中的损失函数优化技巧

失函数的解释 损失函数代码解析 loss = -F.log_softmax(logits[...

Elasticsearch 常用语法手册

&#x1f9f0; Elasticsearch 常用语法手册 &#x1f4da; 目录 索引操作文档操作查询操作聚合查询健康与状态查看常见问题与注意事项 &#x1f539; 索引操作 查询全部索引 GET _search创建索引 PUT /es_db创建索引并设置分片数和副本数 PUT /es_db {"settings&quo…...

华宇TAS应用中间件与亿信华辰多款软件产品完成兼容互认证

近日&#xff0c;华宇TAS应用中间件与亿信华辰多款产品成功通过兼容互认证测试&#xff0c;双方产品在功能协同、性能优化及高可用性等维度实现全面适配&#xff0c;将为用户提供更加稳定、高效、安全的国产化解决方案。 此次认证也标志着华宇在国产化生态适配领域再添重要里程…...

AI大模型从0到1记录学习numpy pandas day24

第 1 章 环境搭建 1.1 Anaconda 1.1.1 什么是Anaconda Anaconda官网地址&#xff1a;https://www.anaconda.com/ 简单来说&#xff0c;Anaconda Python 包和环境管理器&#xff08;Conda&#xff09; 常用库 集成工具。它适合那些需要快速搭建数据科学或机器学习开发环境的用…...

开源GPU架构RISC-V VCIX的深度学习潜力测试:从RTL仿真到MNIST实战

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、开篇&#xff1a;AI芯片架构演变的三重挑战 &#xff08;引述TPUv4采用RISC-V的行业案…...

VirtualiSurg使用SenseGlove触觉手套开发XR手术培训体验

虚拟现实和虚拟现实触觉 作为一个领先的培训平台&#xff0c;VirtualiSurg自2017年以来一直利用扩展现实(XR)和触觉技术&#xff0c;为全球医疗保健行业提供个性化的数据驱动学习解决方案。它们使医疗专业人员能够协作学习和培训&#xff0c;提高他们的技能&#xff0c;让他们…...

AbstractErrorController简介-笔记

1. AbstractErrorController简介 org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController 是 Spring Boot 提供的一个用于处理 HTTP 错误&#xff08;如 404、500 等&#xff09;的抽象类&#xff0c;用于自定义错误响应的逻辑。它是 Spring Boot…...

next.js实现项目搭建

一、创建 Next.js 项目的步骤 1、安装 npx create-next-applatest # 或 yarn create next-app # 或 pnpm create next-app 按照交互式提示配置你的项目&#xff1a; 输入项目名称 选择是否使用 TypeScript 选择是否启用 ESLint 选择是否启用 Tailwind CSS 选择是否使用 s…...

使用GoLang版MySQLDiff对比表结构

概述 下载地址&#xff1a; https://github.com/camry/mysqldiff/ 编译安装 git clone https://github.com/camry/mysqldiff.git go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPRIVATE*.corp.example.com go build .\mysqldiff.go执行对比 ./mysqldiff --sourc…...

git工具使用详细教程-------命令行和图形化工具

下载 git下载地址&#xff1a;https://git-scm.com/downloads TortoiseGit&#xff08;图形化工具&#xff09;下载地址&#xff1a;https://tortoisegit.org/download/ 认识git结构 工作区&#xff1a;存放代码的地方 暂存区&#xff1a;临时存储&#xff0c;将工作区的代码…...

失控的产品

大部分程序员很难有机会做一个新的产品&#xff0c;绝大多时候去一家新公司也都是在旧产品上修修补补。 笔者还是很幸运得到了开发新品的机会&#xff0c;从2023年开始做&#xff0c;中间经历了许多磕磕碰碰。 有的小伙伴从中离开&#xff0c;偶尔又加入1~2个人&#xff0c;但…...

区块链blog1__合作与信任

&#x1f342;我们的世界 &#x1f33f;不是孤立的&#xff0c;而是网络化的 如果是单独孤立的系统&#xff0c;无需共识&#xff0c;而我们的社会是网络结构&#xff0c;即结点间不是孤立的 &#x1f33f;网络化的原因 而目前并未发现这样的理想孤立系统&#xff0c;即现实中…...

ES常识9:如何实现同义词映射(搜索)

在 Elasticsearch&#xff08;ES&#xff09;中实现同义词映射&#xff08;如“美丽”和“漂亮”&#xff09;&#xff0c;核心是通过 同义词过滤器&#xff08;Synonym Token Filter&#xff09; 在分词阶段将同义词扩展或替换为统一词项&#xff0c;从而让搜索时输入任意一个…...

aws 实践创建policy + Role

今天Cyber 通过image 来创建EC2 的时候,要添加policy, 虽然是administrator 的role, 参考Cyber 提供的link: Imageshttps://docs.cyberark.com/pam-self-hosted/14.2/en/content/pas%20cloud/images.htm#Bring 1 Step1:...

兰亭妙微B端UI设计:融合多元风格,点亮品牌魅力

在B端产品市场&#xff0c;独特的品牌形象是企业脱颖而出的关键。兰亭妙微专注于B端UI设计&#xff0c;通过融合多元风格&#xff0c;为企业点亮品牌魅力&#xff0c;助力品牌价值提升。 兰亭妙微主创团队源自清华&#xff0c;历经多年沉淀&#xff0c;积累了丰富的设计经验。…...

高项-逻辑数据模型

逻辑数据模型的核心理解 1. 定义与特点 逻辑数据模型&#xff08;Logical Data Model, LDM&#xff09;&#xff1a; 是一种抽象的数据结构设计&#xff0c;用于描述业务实体&#xff08;如客户、订单&#xff09;及其关系&#xff08;如“客户下单”&#xff09;&#xff0c…...

Aquatone安装与使用

前言:aquatone工具获取网页截图,在资产收集的时候&#xff0c;对于网站可以起到快速浏览 michenriksen/aquatone: A Tool for Domain Flyovershttps://github.com/michenriksen/aquatone 任务一 安装chromium sudo apt install chromiumchromium -h 任务二 下载aquatone Relea…...

解读RTOS 第八篇 · 内核源码解读:以 FreeRTOS 为例

1. 引言 FreeRTOS 作为最流行的嵌入式实时操作系统之一,其内核源码简洁且功能完善。通过剖析其关键模块(任务管理、调度器、队列、内存管理和移植层),不仅能够更深入地理解 RTOS 的运行机制,还能掌握根据项目需求进行内核定制与优化的能力。本章将带你以 FreeRTOS 10.x 版…...

6、登录功能后端开发

6、登录功能后端开发 https://xiaoxueblog.com/ai/%E7%99%BB%E5%BD%95%E5%8A%9F%E8%83%BD%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91.html 1、新建用户表SQL脚本 -- CREATE DATABASE aicloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;-- 创建用户表 drop table if exi…...

「彻底卸载 Quay 容器仓库」:干净移除服务、镜像与配置的全流程指南

文章目录 &#x1f9f9; 第一步&#xff1a;停止并禁用 systemd 服务&#x1f6ae; 第二步&#xff1a;移除 Podman 容器与相关资源1. 删除 quay-app 容器2. 删除镜像&#xff08;如果你想彻底清理&#xff09;3. 删除挂载卷&#xff08;比如 SQLite 存储&#xff09; &#x1…...

C++从入门到实战(十五)String(上)介绍STL与String的关系,为什么有string类,String有什么用

C从入门到实战&#xff08;十五&#xff09;String&#xff08;上&#xff09; 前言一、STL与String的关系1. STL 是什么&#xff1f;2. String 是什么&#xff1f;3. String 与 STL 的关系 二、为什么有string类&#xff0c;有什么用1. 为什么需要 string 类&#xff1f;2. st…...

【Python 正则表达式】

Python 正则表达式通过 re 模块实现模式匹配&#xff0c;是文本处理的核心工具。以下是系统化指南&#xff0c;包含语法详解和实战案例&#xff1a; 一、正则基础语法 1. 元字符速查表 符号含义示例匹配结果.任意字符&#xff08;除换行符&#xff09;r"a.c"“abc”…...

【MySQL】第四弹——表的CRUD进阶(二)数据库设计

文章目录 &#x1f31f;范式&#x1f31f;表的设计&#x1f4ab;第一范式 1NF&#x1fa90;反例&#x1fa90;正例 &#x1f4ab;第二范式 2NF&#x1fa90;反例&#x1fa90;正例 &#x1f4ab;第三范式 3NF&#x1fa90;反例&#x1fa90;正例 &#x1f4ab;表的设计方法&…...

Unity基础学习(十五)核心系统——音效系统

目录 一、关于音频文件的导入相关 二、音频源组件Audio Source 三、Audio Listener的介绍 四、关于播放音乐的方式 五、麦克风输入相关 Microphone 类方法与属性总览​ 1. Start 方法​ ​2. End 方法​ ​3. IsRecording 方法​ ​4. GetPosition 方法​ ​5. devic…...

计算机视觉----常见卷积汇总

普通卷积   普通卷积大家应该都比较熟悉了&#xff0c;如果不熟悉的话&#xff0c;可以参考我之前的博客&#xff0c;或者去网上自行百度。这里主要想补充两个知识点。一&#xff1a;卷积核参数量怎么算&#xff1f; 二&#xff1a;如何高效的并行运算卷积滑窗&#xff1f; …...

【人工智能-agent】--Dify+Mysql+Echarts搭建了一个能“听懂”人话的数据可视化助手!

Echarts官网&#xff1a;https://echarts.apache.org/zh/index.html ECharts 是一个由百度团队开发的、基于 JavaScript 的开源可视化图表库&#xff0c;它提供了丰富的图表类型和强大的交互功能&#xff0c;能够帮助开发者轻松创建专业级的数据可视化应用。 核心特点 丰富的图…...

【专栏启动】开篇:为什么是 Django + Vue3?测试平台的技术选型与架构蓝图

【专栏启动】开篇&#xff1a;为什么是 Django Vue3&#xff1f;测试平台的技术选型与架构蓝图 前言一、为什么是 Django Vue3&#xff1f;二、测试平台的架构设计蓝图三、测试平台模块功能概述 结语 前言 一个高效、稳定、易用的测试平台&#xff0c;不仅能够帮助团队提升测…...

Rust 学习笔记:关于 Vector 的练习题

Rust 学习笔记&#xff1a;关于 Vector 的练习题 Rust 学习笔记&#xff1a;关于 Vector 的练习题哪个调用会报错&#xff1f;以下代码能否通过编译&#xff1f;若能&#xff0c;输出是&#xff1f;以下代码能否通过编译&#xff1f;若能&#xff0c;输出是&#xff1f;以下代码…...

Modbus TCP转Profinet网关:数字化工厂异构网络融合的核心枢纽

在现代工业生产中&#xff0c;随着智能制造和工业互联网的不断发展&#xff0c;数字化工厂成为了制造业升级的重要方向。数字化工厂的核心在于实现设备、数据和人的互联互通&#xff0c;而这其中&#xff0c;通信协议扮演着至关重要的角色。今天&#xff0c;我们就来探讨开疆智…...

精益数据分析(62/126):从客户访谈评分到市场规模估算——移情阶段的实战进阶

精益数据分析&#xff08;62/126&#xff09;&#xff1a;从客户访谈评分到市场规模估算——移情阶段的实战进阶 在创业的移情阶段&#xff0c;科学评估用户需求与市场潜力是决定产品方向的关键。今天&#xff0c;我们结合Cloud9 IDE的实战经验与《精益数据分析》的方法论&…...

各类开发教程资料推荐,Java / python /golang /js等

更多资源在文末&#x1f447;&#x1f447;&#x1f447;&#x1f447;&#x1f447;&#x1f447;&#x1f447;&#x1f447;&#x1f447; 1. 入门首选&#xff08;易学且应用广&#xff09; Python 特点&#xff1a;语法简洁、易读&#xff0c;社区资源丰富。 用途&#…...

现代健康养生小贴士

在忙碌的现代生活中&#xff0c;掌握一些简单实用的健康养生技巧&#xff0c;能轻松为身体 “充电”&#xff0c;提升生活质量。以下从饮食、运动、作息等方面&#xff0c;为你带来科学易执行的养生建议。 一、饮食&#xff1a;吃对食物&#xff0c;为健康加分 早餐要吃好&am…...

每日一道leetcode(新学数据结构版)

208. 实现 Trie (前缀树) - 力扣&#xff08;LeetCode&#xff09; 题目 Trie&#xff08;发音类似 "try"&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动…...

ChromaDB 向量库优化技巧实战

chroma 一步步使用 安装 # 安装chromadb pip install chromadb,sentence_transformers# 不启动服务会出现sock.connect(sa)TimeoutError: timed out chroma run服务启动后&#xff0c;您将看到类似以下输出&#xff1a; 建立连接 部署完成后&#xff0c;需要建立与Chroma服…...

全国各地区经纬度数据(包含省、市、县)

全国各地区经纬度数据&#xff08;包含省、市、县&#xff09; 1、指标&#xff1a;行政区划代码、省份、城市、经度、纬度 2、来源&#xff1a;高德地图 3、用途&#xff1a;可用于空间相关研究 4、下载链接&#xff1a; 全国各地区经纬度数据&#xff08;包含省、市、县…...

记录一下seata后端数据库由mariadb10切换到mysql8遇到的SQLException问题

文章目录 前言一、问题记录二、参考帖子三、记录store.db.driverClassName 前言 记录一下seata后端数据库由mariadb10切换到mysql8遇到的SQLException问题。 一、问题记录 17:39:23.709 ERROR --- [ionPool-Create-1134013833] com.alibaba.druid.pool.DruidDataSource : …...

【Python 面向对象】

Python 的面向对象编程&#xff08;OOP&#xff09;通过类&#xff08;Class&#xff09;和对象&#xff08;Object&#xff09;实现代码结构化&#xff0c;支持封装、继承和多态三大特性。以下是系统化指南&#xff1a; 一、类与对象基础 1. 定义类 class Dog:# 类属性&…...

软考软件评测师——计算机组成与体系结构

目录 计算机寻址方式详解与对比分析 一、立即寻址 二、直接寻址 三、间接寻址 四、寄存器寻址 五、寄存器间接寻址 六、变址寻址 七、基址寻址 八、相对寻址 九、综合对比分析 计算机寻址方式详解与对比分析 一、立即寻址 核心概念 指令操作码后直接携带操作数值&a…...

宝元LNC数控数据采集方式、跨平台采集通讯方案介绍

文章目录 采集效果图通讯方案介绍技术名词解释技术细节小结 采集效果图 通讯方案介绍 老版本宝元&#xff1a;必须走TCP通讯&#xff0c;如LNC568A系列 今天主要介绍新版本的宝元&#xff0c;如采用M6800控制器的5800系列系统等 新版本宝元通讯方式&#xff1a; ①sdk通讯&…...

ZFile与Cpolar技术结合实现远程数据实时访问与集中管理的可行性分析

文章目录 前言1.关于ZFile2.本地部署ZFile3.ZFile本地访问测试4.ZFile的配置5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定ZFile公网地址 前言 在信息爆炸的年代&#xff0c;每个现代人都在数字浪潮中扮演着独特的角色。不论是商务精英、影像创作者还是学术达人&…...

JS手写代码篇---手写 Object.create

JS手写代码篇 在做手写题的时候&#xff0c;我们要思考两个问题 这个代码的作用是什么能够实现的效果是什么样子 1. 手写 Object.create 思路&#xff1a;创造一个对象&#xff0c;类似于Object.create()方法>将obj作为原型 // 手写 Object.create function create (ob…...

homeassistant安装

这里写自定义目录标题 homeassistant安装&#xff08;windows&#xff09;安装virtual boxhaos下载haos安装docker镜像地址更换安装File editor安装hacs安装Xiaomi Miot Auto问题排查 homeassistant安装&#xff08;windows&#xff09; 安装virtual box 百度搜索virtual box…...

Pythonnet - 实现.NET Core和Python进行混合编程

1 安装Pythonnet包 2...

C++23 新特性:ranges::contains 与 ranges::contains_subrange

文章目录 ranges::containsranges::contains_subrange编译器支持总结 C23 标准带来了许多令人兴奋的新特性&#xff0c;其中就包括了 ranges::contains 和 ranges::contains_subrange 这两个算法。这两个算法由提案 P2302R4 提出&#xff0c;它们为 C 程序员提供了更加丰富和…...

(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)

目录 前言&#xff1a; 源代码&#xff1a; product.h product.c fileio.h fileio.c main.c 代码解析&#xff1a; 一、程序结构概述 二、product.c 函数详解 1. 初始化商品列表 Init_products 2. 添加商品 add_product 3. 显示商品 display_products 4. 修改商品 mo…...