JVM(Java虚拟机)详解
目录
1 JVM执行流程
2 JVM运行时数据区(内存布局)
2.1 堆
2.2 栈
2.3 方法区
2.4 程序计数器
2.5 Java和运行时数据区相关的异常
3 JVM类加载(Class Loading)
3.1 加载Loading
3.2 连接Linking
3.2.1 验证Verification
3.2.2 准备Preparation
3.2.3 解析Resolution
3.3 初始化Initialization
3.4 双亲委派模型
4 JVM垃圾回收机制(GC)
4.1 回收的目标
4.2 判断对象是否死亡算法
4.2.1 引用计数
4.2.2 可达性分析
4.3 垃圾回收算法
4.3.1 标记-清除法
4.3.2 复制算法
4.3.3 标记-整理法
4.3.4 分代回收算法
5 JVM内存模型(JMM)
1 JVM执行流程
在IDEA点击运行,首先把java代码编译(javac)成字节码(.class文件),JVM通过类加载器(ClassLoader)把字节码文件加载到内存中运行时数据区(Runtime Data Area),在该区域进行变量、对象、方法、执行指令的构造。
字节码文件是JVM的一套指令集规范,并不能直接交个操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine)将字节码翻译成底层系统指令再交由CPU去执行,而这个过程中需要调用其他语言(C++)的接口,即本地库接口(Native Interface)来实现整个程序的功能。
2 JVM运行时数据区(内存布局)
运行时数据区主要包含4个部分:堆、栈、方法区和程序计数器。
2.1 堆
堆是存放对象的区域,线程共享堆区域。
堆分为两个区域:新生代和老生代,新生代放新建的对象,当经过一定GC(垃圾回收)次数之后还存活的对象会放入老生代。新生代还有3个区域:一个Eden+两个Survivor(S0和S1)。
垃圾回收的时候会将Eden中存活的对象放到一个未使用的Survivor中,并把当前的Eden和正在使用的Survivor清除掉。
2.2 栈
JVM的栈原来是有两个区域:Java虚拟机栈和本地方法栈。Java虚拟机栈是给Java代码使用的;本地方法栈是给本地方法使用的。在Java1.8后,JVM把这两个栈合并。
栈中存放局部变量和方法之间的调用关系(不存储方法内容),属于线程私有区域(一个线程对应一个栈)。
注意:局部变量和成员变量的区分。局部变量是方法中创建的变量,存储在栈中。成员变量是对象的属性表示的变量,存储在堆中(属于对象的一部分)。
2.3 方法区
方法区用来存储被虚拟机加载的类对象、常量、静态变量,线程共享该区域。
类对象包含类的信息,即编译后的代码,包含类名、继承关系、实现关系、属性(类型、名称、访问权限)、方法(名称、访问权限、参数、返回值、方法内容(也就是转换后的指令)。
在HotSpot虚拟机(默认实现JVM的定义的版本)的实现中,在JDK 7时此区域叫做永久代(PermGen),JDK 8中叫做元空间(Metaspace)。
注意:区分局部变量、成员变量和静态变量。
比如:
class A{int num;static int count;}int main(){A a = new A();}
在这个代码中,成员变量num存储在堆。a属于局部变量,存储在栈。a引用所指向的对象A存储在堆。而count是静态变量,属于类对象,存储在方法区。
2.4 程序计数器
程序计数器用来记录当前线程执行到代码的行号,属于线程私有区域。和线程调度上下文(环境)的记录和恢复相关。
2.5 Java和运行时数据区相关的异常
(1)OutOfMemoryError:Java heap space:堆溢出。解决时关注对象是否实例化的次数过多。
(2)StackOverflowError:栈溢出。解决时关注是否函数出现多次调用,比如循环递归。
3 JVM类加载(Class Loading)
JVM类加载过程大致分为加载、连接和初始化三个阶段。
3.1 加载Loading
编译后的class文件存储在磁盘上,加载就是找到class文件、读取文件内容、在内存构造类对象、再把数据填入类对象中一系列过程。
3.2 连接Linking
3.2.1 验证Verification
验证阶段确保Class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。
验证的选项:文件格式验证、字节码验证、符号引用验证。
3.2.2 准备Preparation
准备阶段是正式为类中定义的变量(即静态变量,static修饰的变量)分配内存并设置类变量初始值(int类型赋值为0,自己定义的变量时赋的值不在这个阶段,而是在初始化阶段)的阶段。
3.2.3 解析Resolution
解析阶段是JVM将常量池内的符号引用替换为直接引用(编译时只知道某个地方应该用常量池的某个常量,用一个符号占用该位置表示。解析时,把这个符号引用替换成常量池某个常量的真实的内存地址)的过程,也就是初始化常量的过程。
3.3 初始化Initialization
初始化阶段,JVM真正开始执行类中编写的Java程序代码,将主导权移交给应用程序。初始化阶段就是执行类的构造器方法的过程,针对静态变量实现初始化(初始化为开发人员给变量赋的值),执行静态代码块,同时如果某个类的父类没有加载,就要去加载父类。
3.4 双亲委派模型
双亲委派模型描述了一个类加载器收到类加载请求时由哪个类加载器负责的问题。
JVM一共存在4种类加载器,分别是BootStrapClassLoader、ExtensionClassLoader、ApplicationClassLoader和自定义的类加载器,这里不讨论自定义的类加载器(如果有就位于ApplicationClassLoader的下一级)。
当有待加载的类时,类加载器开始运行,从ApplicationClassLoader开始,每个类加载器首先不进行类加载,而是把任务委派给父亲让他先尝试加载,最终会把类加载请求发给BootStrapClassLoader。
BootStrapClassLoader首先会从标准库中扫描是否有待加载的class文件,如果有就由其负责类加载。如果没有就由其孩子来尝试进行类加载。如果所有的类加载器都没有找到class文件,就会抛出ClassNotFoundException的异常。
注意:双亲委派模型的好处。最大的好处是可以让程序员自定义的类不会把Java标准库中的类给覆盖了,因为即使写了一个类名为String,根据双亲委派模型,该类被加载首先会在rt.jar中查找,就找到了由BootStrapClassLoader来进行类加载,也就是仍然优先加载标准库的类而不是自己写的类。
是否自定义的类加载器一定要遵循双亲委派模型?不一定,可以遵循也可以不遵循。比如Tomcat加载webapps的一些类的时候自定义了类加载器,并没有遵循双亲委派模型。
4 JVM垃圾回收机制(GC)
当申请的内存空间不进行释放,就有可能出现内存泄露问题,即内存越用越少,最终没有内存空间可用。而开发人员手动释放难免保证不出纰漏,因此据需要垃圾回收机制定时自动回收。
4.1 回收的目标
垃圾回收的目标主要是堆区域,即回收不在使用的对象(死亡状态)。为什么不回收其他区域的内存呢?
程序计数器每个线程有一个独立的空间,线程销毁时一起跟着就被销毁了,因此不需要垃圾回收。
栈区域主要就是局部变量,当局部变量出了作用域,也就可以被回收了,因此它的回收时间明确,也不需要回收。
方法区主要存储类对象,类对象被类加载一次就不再加载了,且几乎不会被类卸载,因此需要回收的时机并不多,因此也没有那么需求垃圾回收机制。
注意:垃圾回收的单位是对象而不是字节。在堆的区域划分中,有3类:正在使用的内存、使用过不再使用的内存和从未被使用的内存。因此即使一个对象只有其中一个成员变量仍被使用,其他成员使用过不再使用,此时也不是回收的目标,只有整个对象都不再使用,才会被垃圾回收。
4.2 判断对象是否死亡算法
4.2.1 引用计数
引用计数就是给每个对象增加一个引用计数器,每有一个引用变量引用对象,计数器就+1,每有一个引用对象的引用被销毁,计数器就-1。当计数器为0时,对象就会被垃圾回收。
但是引用计数有一些弊端:
1.多线程环境下,对象被多个线程引用,就会存在线程安全问题。
2.对于空间占用小的对象,如果数量很多,就会引来不小的内存开销(1kb(大对象)+2字节(引用计数器) VS 2字节(小对象)+2字节(引用计数器))。
3.存在循环引用问题(最大的缺点)。假设存在类:
class Test{Test t = null;}int main(){Test a = new Test();Test b = new Test();a.t = b;b.t = a;a = null;b = null;// 销毁a和b}
刚创建引用a和b并实例化Test对象时,a引用的Test对象地址是0x100,引用计数1;b引用的Test对象地址是0x200,引用计数1。当执行a.t = b和b.t = a后,两个对象的引用计数变为2。但是当销毁引用a和b后,两个Test对象引用计数都-1,此时没有引用变量再指向两个Test对象,但两个对象其中的成员属性都互相引用,造成循环引用,此时引用计数器无法变成0,也就无法被垃圾回收。
注意:引用计数在Python中被使用,但是在JVM中,由于以上弊端没有使用该算法。
4.2.2 可达性分析
特殊变量作为起点(GCRoot),从起点出发,沿引用链访问对象,如果可以访问到,则该对象是可达的(表示仍被引用,是存活的)。如果不可以被访问到,则该对象是不可达的(表示没有被引用,应该被回收)。
可以作为起点(GCRoot)的对象:
1.局部变量表中的引用(栈中的局部变量)。
2.常量池中的对象(方法区)。
3.静态引用类型的成员(方法区)。
可达性分析的优点:1.没有使用额外的空间(引用计数器)2.没有循环引用问题,因为如果没有引用能访问到循环引用的对象,即不可达,也会被垃圾回收。
4.3 垃圾回收算法
4.3.1 标记-清除法
经过可达性分析,把要回收的对象标记,垃圾回收时把所有带标记的对象回收。
缺点是会产生许多内存碎片,即被释放的区域如果想要存储一个更大的对象,就无法利用该空间(有空闲空间却无法用)。
4.3.2 复制算法
把内存空间分为两份连续的空间,每次只使用其中一份,当垃圾回收时,把存活的对象复制到另一份未使用的区域,然后清空当前使用区域的所有对象。
解决了标记-清除法的内存碎片问题,但是引入新的问题:空间利用率太低。
4.3.3 标记-整理法
类似顺序表一样,每次垃圾回收后,会把所有还存活的对象进行整理,即把所有存活对象全移动到一起。
解决了复制算法空间利用率低的问题,但是缺点是移动操作开销很大。
4.3.4 分代回收算法
引入概念对象的年龄:对象经过垃圾回收算法扫描的轮次。比如当对象经过3轮GC算法,仍然没有被回收,对象年龄就为3。
把堆区域划分新生代区域和老年代区域,对象的年龄小的在新生代区存储,年龄大的在老年代区存储。
新生代区域具体分为:一个Eden(伊甸区)+两个Survivor(幸存者区S0和S1)。由于新生代区每次垃圾回收绝大部分对象都会死去,只有少部分对象存活,因此使用复制算法,并且幸存区不会很大。老年代区对象年龄大,经常被使用,且满足条件的对象少,因此使用标记-整理法不会有很大的开销。
分代回收算法执行流程如下:
1.新创建的对象在伊甸区,绝大部分对象会在一轮GC后被回收,存活的对象复制到幸存区1。
2.幸存区1和伊甸区再经过一轮GC后,仍然存活的对象复制到幸存区2。
3.此后,如果对象的年龄仍未达到设定的轮次,就在幸存区1和幸存区2之间反复复制(总有一个幸存区是空的)。
4.如果对象的年龄到达设定的轮次,就存储在老年代区,此后使用标记-整理法进行GC(频率就比较低了)。
5.如果创建的对象很大,来回复制开销也很大,因此会在创建之初就被存储在老年代区。
分代回收算法就是对不同的区域使用不同的算法,充分利用各种算法的优点,避免缺点,从而具有较好的性能,因此分代回收算法是JVM使用的GC算法。
5 JVM内存模型(JMM)
这部分内容在多线程就已经讲过了:
多线程—线程安全原理https://blog.csdn.net/sniper_fandc/article/details/146420990?fromshare=blogdetail&sharetype=blogdetail&sharerId=146420990&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link
相关文章:
JVM(Java虚拟机)详解
目录 1 JVM执行流程 2 JVM运行时数据区(内存布局) 2.1 堆 2.2 栈 2.3 方法区 2.4 程序计数器 2.5 Java和运行时数据区相关的异常 3 JVM类加载(Class Loading) 3.1 加载Loading 3.2 连接Linking 3.2.1 验证Verification…...
Vue3 + TypeScript,使用provide提供只读的响应式数据的详细分析与解决方法
原始无类型写法(不报错) typescript const applySampleTableData ref<ApplySample[]>([]); const applySampleListSymbol Symbol("applySampleList"); provide(applySampleListSymbol, readonly(applySampleTableData)); 类型推断&a…...
深入理解 BLE PHY 模式:1M、2M 与 Coded 的演进与应用
随着蓝牙技术不断演进,BLE(Bluetooth Low Energy)在物联网、可穿戴设备、智能家居等领域的应用愈发广泛。BLE 中的 PHY(Physical Layer,物理层)是决定无线传输速率、覆盖范围和功耗的核心因素。本文将以浅显易懂的语言,结合示意图和代码示例,系统梳理 BLE 三种 PHY 模式…...
人工智能与机器学习:二元分类决策树构建指南
引言 在人工智能与机器学习的领域里,算法犹如智慧的钥匙,开启着数据洞察的大门。决策树作为其中一颗璀璨的明珠,以其独特的非线性处理能力和可解释性备受瞩目。今天,让我们跟随作者的脚步,深入探究如何构建一个用于二…...
Ubuntu下软件运行常见异常退出问题汇总分析
软件在Ubuntu下运行时,可能会遇到各种异常退出情况,常见可分为以下几点: 目录 一、系统资源耗尽导致退出 二、权限导致无法运行 三、找不到依赖的动态库 四、编译可执行文件时,动态库所引用的头文件与动态库不匹配 一、系统资…...
机器学习漏洞大汇总——利用机器学习服务
在本节中,我们将展示机器学习框架中存在的漏洞,这些漏洞会直接处理模型工件,或者通过工件存储或模型注册表的凭证来处理。利用此类漏洞,攻击者可以在企业系统内部进行非常强大的横向移动,从而劫持被利用的模型注册表中的机器学习模型。 WANDB Weave 目录遍历 - CVE-2024-…...
类的六个默认成员函数
如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认…...
精益数据分析(21/126):剖析创业增长引擎与精益画布指标
精益数据分析(21/126):剖析创业增长引擎与精益画布指标 大家好!在创业和数据分析的探索道路上,我一直希望能和大家携手共进,共同学习。今天,我们继续深入研读《精益数据分析》,剖析…...
SAIL-RK3588协作机器人运动控制器技术方案
一、核心能力与政策适配 政策合规性 满足工信部《智能机器人重点技术攻关指南》要求,支持 EtherCAT主站协议(符合IEC 61158标准),助力企业申报工业机器人研发专项补贴(最高300万元/项目)核心板…...
手搓箱图并输出异常值(MATLAB)
看下需求 想要复刻这种箱图,咱们直接开始手搓 %% 可修改 % 生成模拟数据(假设5个用户群体的发帖数) data {randn(100,1)*10 30, ... % 核心用户randn(200,1)*5 10, ... % 边缘用户randn(150,1)*8 20, ... % 积极社交用户randn(8…...
Java:XML被自动转义
在Java中处理XML响应被自动转义的问题时,需结合XML规范及工具特性进行针对性处理。以下是常见原因及解决方案的总结: 一、XML自动转义的原因 字符安全性处理 XML中的保留字符(如 <、>、&)会被自动转义为实体&a…...
Day-3 应急响应实战
应急响应实战一:Web入侵与数据泄露分析 1. Web入侵核心原理 漏洞利用路径 未授权访问:弱口令(如空密码/默认口令)、目录遍历漏洞代码注入攻击:JSP/ASP木马、PHP一句话木马(利用eval($_POST[cmd])&…...
【软件设计师】模拟题一
以下是 10道软考-软件设计师模拟试题,涵盖高频考点和易错点,附带答案和解析: 一、软件工程 1. 在软件开发生命周期中,瀑布模型的主要特点是( ) A. 强调快速原型迭代 B. 阶段间有明…...
每日一练(4~24):互质的数【省模拟赛】
算法:暴力枚举 问题描述 如果两个整数 a, b 除了 1 以外,没有其它的公约数,则称整数 a 与 b 互质。 请问,与 2024 互质的数(包括 1)中,第 2024 小的是多少? 答案提交 这是一道结…...
金融软件测试有哪些注意事项?专业第三方软件测试服务机构分享
在现代金融行业中,软件系统的稳定性和安全性直接关系到资金的安全和业务的正常运转。金融软件因涉及庞大的资金流和敏感的个人及交易信息,对软件测试提出了更高的要求,那么金融软件在进行测试时有哪些注意事项呢?卓码软件测评作为专业的第三…...
关于QT信号、槽、槽函数的讲解
也是好久没有发帖子了,最近博主主要还是在边学QT边完成任务,所以进度很慢,但确实在这几天对于QT自身槽和信号这类特殊的机制有了一定简单的理解,所以还是想记录下来,如果有初学者看到帖子对他有一定的帮助,…...
算法训练营第三十天 | 动态规划 (三)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、01背包问题理论基础(一)动态规划五部曲确定dp数组以及下标的含义确定递推公式初始化dp数组确定遍历顺序 二、01背包问题理论基础&#…...
Vue开发网站会有“#”原因是前端路由使用了 Hash 模式
前言 网站链接中出现 #(井号)是因为你的前端路由使用了 Hash 模式(hash mode),这是一种前端框架(如 Vue.js、React 等)中常用的路由策略。 为什么有 # 比如 https://www.zimeinew.com/#/order…...
SpringBootTest报错
Unable to find a SpringBootConfiguration, you need to use ContextConfiguration or … 解决方案:在SpringTest注解中添加属性(classes )填写启动类 如我的启动类是MainApplication.class javax.websocket.server.ServerContainer no…...
【质量管理】现代TRIZ(萃智)理论概述
一、什么是TRIZ理论 TRIZ理论,即发明问题解决理论(Teoriya Resheniya Izobreatatelskikh Zadatch),是由前苏联发明家根里奇阿奇舒勒(Genrich S. Altshuller)于1946年创立的。它是一门基于知识的、面向人的发明问题解决系统化方法学。TRIZ理论通过研究大量的专利,总结出技…...
前端面经-JS篇(四)--回调地狱、promise异步编程、Proxy 与 Reflect 、模块化
一、回调地狱 回调地狱(Callback Hell),也称为回调地狱,是指在 JavaScript 中处理多个嵌套的异步回调函数时,代码结构变得非常难以阅读和维护的现象。 为什么会出现回调地狱? 回调地狱通常出现在需要执行…...
【oql】spark thriftserver内存溢出,使用oql查询导致oom的sql
eclipse memory analyzer (mat)软件内的OQL实现查询内促信息。 帮助信息:软件Help/Help Contents/Querying Heap Objects (OQL) 就是查询SparkExecuteStatementOperation 的statement 字段。 select objects s.statement from org.apache.spark.sql.hive.thriftser…...
算法设计与分析(基础)
问题列表 一、 算法的定义与特征,算法设计的基本步骤二、 算法分析的目的是什么?如何评价算法,如何度量算法的复杂性?三、 递归算法、分治法、贪婪法、动态规划法、回溯法的基本思想方法。四、 同一个问题,如TSP&#…...
爬虫学习——使用HTTP服务代理、redis使用、通过Scrapy实现分布式爬取
一、使用HTTP服务代理 由于网络环境、网站对用户的访问速度的限制等原因,使得爬取过程会出现IP被封禁,故使用代理可提高爬取速度。在Scrapy中提供了一个HttpProxyMiddleware专门用于进行爬虫代理设置。在使用该代理进行爬取操作时,需要先在ba…...
机器学习中的特征存储是什么?我需要一个吗?
本质上,特征存储是一个专用存储库,用于系统地存储和排列特征,主要用于数据科学家训练模型,并帮助已训练模型的应用程序进行预测。它是一个关键的聚合点,人们可以在此构建或修改从各种数据源提取的特征集合。此外,它还支持从这些特征组中创建和增强新的数据集,以满足处于…...
【C语言】C语言中的联合体与枚举类型
前言 在C语言中,联合体(union)和枚举(enum)是两种非常实用但又常被忽视的自定义数据类型。它们在内存管理、代码可读性以及程序设计的灵活性方面都有着独特的优势。今天,我们就来深入探讨一下联合体和枚举…...
Golang编程拒绝类型不安全
button-chen/containertypesafe-go: 使用泛型包装标准库的容器 list、ring、heap、sync.Pool 和 sync.Map,实现类型安全 简介 在 Go 中,标准库提供了多种容器类型,如 list、ring、heap、sync.Pool 和 sync.Map。然而,这些容器默认…...
炼锌废渣提取钴工艺流程
炼锌废渣中提取钴的工艺流程通常结合湿法冶金技术,针对废渣中钴与锌、铁、铜等金属的复杂共生特性,通过预处理、浸出、除杂、钴富集及提纯等步骤实现钴的高效回收。以下是典型工艺流程的详细说明: 一、预处理 炼锌废渣(如锌浸出…...
Restful接口学习
一、为什么RESTful接口是数据开发的核心枢纽? 在数据驱动的时代,RESTful接口如同数据高速公路上的收费站,承担着数据交换的核心职责。数据工程师每天需要面对: 异构系统间的数据交互(Hadoop集群 ↔ 业务系统…...
仿真每日一练 | ABAQUS应力松弛
应力松弛是弹性材料在应力作用下产生微塑性变形,并且逐渐积累,在保持应变或者位移不变的前提下,表现为应力逐渐下降的现象。今天介绍一个ABAQUS中应力松弛的相关案例,模型如下所示: 图1 模型认识 回顾一下ABAQUS的有限…...
智能电网第4期 | 电力设备全连接组网方案:从有线到无线无缝融合
随着新型电力系统建设的加速推进,电力设备通信网络正面临前所未有的挑战与机遇。在变电站自动化、输电线路监测、配电房智能化等场景中,传统通信方案已难以满足日益增长的连接需求: 环境复杂性:变电站强电磁干扰环境下需保障微秒级…...
Python 面向对象练习
不多bb了,直接上代码吧。 from pprint import pprint class Course:total_course []def __init__(self,name,id):self.name nameself.id idself.is_select FalseCourse.total_course.append(self)def __repr__(self):return (f"{__class__.__name__}("f"学…...
无感字符编码原址转换术——系统内存(Mermaid文本图表版/DeepSeek)
安全便捷无依赖,不学就会无感觉。 笔记模板由python脚本于2025-04-24 20:00:05创建,本篇笔记适合正在研究字符串编码制式的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 P…...
机器学习--线性回归模型
阅读本文之前,可以读一读下面这篇文章:终于有人把线性回归讲明白了 0、引言 线性回归作为统计学与机器学习的入门算法,以其简洁优雅的数学表达和直观的可解释性,在数据分析领域占据重要地位。这个诞生于19世纪的经典算法…...
HTML应用指南:利用GET请求获取微博签到位置信息
在当今数字化时代,社交媒体平台已成为人们日常生活中不可或缺的一部分。作为中国最受欢迎的社交平台之一,微博不仅为用户提供了一个分享信息、表达观点的空间,还通过其丰富的功能如签到服务,让用户能够记录自己生活中的点点滴滴。…...
如何检测Python项目哪些依赖库没有使用
要检测Python项目中哪些依赖库未被使用,可以采用以下方法: 1. 使用静态分析工具 vulture:静态分析工具,检测未使用的代码和导入 pip install vulture vulture your_project/pyflakes:检查未使用的导入语句 pip ins…...
数据仓库建设全解析!
目录 一、数据仓库建设的重要性 1. 整合企业数据资源 2. 支持企业决策制定 3. 提升企业竞争力 二、数据仓库建设的前期准备 1. 明确业务需求 2. 评估数据源 3. 制定项目计划 三、数据仓库建设的具体流程 1.需求分析 2.架构设计 3.数据建模 4.ETL 开发 5.…...
magic-api连接达梦数据库
引入依赖 然后手写驱动 <dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.1.193</version></dependency> jdbc:dm://127.0.0.1:5236?schemaSALES...
向量检索新选择:FastGPT + OceanBase,快速构建RAG
随着人工智能的快速发展,RAG(Retrieval-Augmented Generation,检索增强生成)技术日益受到关注。向量数据库作为 RAG 系统的核心基础设施,堪称 RAG 的“记忆中枢”,其性能直接关系到大模型生成内容的精准度与…...
WHAT - 区分 Git PR 和 MR
文章目录 PR(Pull Request)MR(Merge Request)相同点总结 git pr 和 git mr 本质上都是「合并请求」的意思,但它们对应的是不同的平台术语。 PR(Pull Request) 平台:GitHub、Bitbuc…...
Axure复选框组件的深度定制:实现自定义大小、颜色与全选功能
在产品设计中,复选框作为用户与界面交互的重要元素,其灵活性直接影响到用户体验。本文将介绍如何利用Axure RP工具,通过高级技巧实现复选框组件的自定义大小、颜色调整,以及全选功能的集成,为产品原型设计增添更多可能…...
Datawhale AI春训营——用AI帮助老人点餐
详细内容见官网链接:用AI帮助老人点餐-活动详情 | Datawhale...
两段文本比对,高亮出差异部分
用法一:computed <div class"card" v-if"showFlag"><div class"info">*红色背景为已删除内容,绿色背景为新增内容</div><el-form-item label"与上季度比对:"><div class"comp…...
uniapp 仿小红书轮播图效果
通过对小红书的轮播图分析,可得出以下总结: 1.单张图片时容器根据图片像素定高 2.多图时轮播图容器高度以首图为锚点 3.比首图长则固高左右留白 4.比首图短则固宽上下留白 代码如下: <template><view> <!--轮播--><s…...
审计效率升级!快速匹配Excel报表项目对应的Word附注序号
财务审计报告一般包括:封面、报告正文、财务报表(Excel工作簿)以及对应的财务报表附注(Word文档)、事务所营业执照以及注册会计师证件。 在审计报告出具阶段,为各报表项目填充对应的Word附注序号ÿ…...
Python 中 `r` 前缀:字符串处理的“防转义利器”
# Python 中 r 前缀:字符串处理的“防转义利器” 在 Python 编程过程中,处理字符串时经常会遇到反斜杠 \ 带来的转义问题,而 r 前缀的出现有效解决了这一困扰。它不仅能处理反斜杠的转义,还在多种场景下发挥着重要作用。接下来&a…...
1️⃣6️⃣three.js_光源
16、光源 3D虚拟工厂在线体验 在 Three.js 中,环境光(AmbientLight)、点光源(PointLight)、平行光(DirectionalLight)、 聚光灯(SpotLight)、半球光(Hemisph…...
AD16如何执行DRC检测
AD16如何执行DRC检测 DRC检测主要用来查看走线是否出现通断,以及是否出现短路。 1)、点击“Tools”---“Design Rule Check…” 2)、全部勾选 3)、勾选“Electrical”中的“Batch”选项,参与DRC检测 4)、勾选“Routing”中的“Batch”选项,…...
PostgreSQL性能优化实用技巧
PostgreSQL的性能优化需从索引设计、查询调优、参数配置、硬件资源等多维度入手。以下为实战中验证有效的优化策略,适用于高并发、大数据量等场 一、索引优化:精准加速查询 1.选择正确的索引类型 BRIN索引:对按时间或数值顺…...
Vue3 ref与props
ref 属性 与 props 一、核心概念对比 特性ref (标签属性)props作用对象DOM 元素/组件实例组件间数据传递数据流向父组件访问子组件/DOM父组件 → 子组件响应性直接操作对象单向数据流(只读)使用场景获取 DOM/调用子组件方法组件参数传递Vue3 变化不再自…...