JVM深入理解
目录
JVM介绍:
解释:
特点:
整体构成:
执行过程:
运行时数据区:
Java堆剖析:
堆内存区域划分
为什么要分代呢?
内存分配:
新生区与老年区配置比例:
分代收集思想 Minor GC、Major GC、Full GC:
堆空间的参数设置 :
方法区:
方法区大小:
垃圾回收:
垃圾回收:
GC主要干什么?
垃圾回收相关算法:
垃圾标记阶段算法
对象的 finalization 机制 :
垃圾回收阶段算法:
标记-复制算法 :
标记-清除算法:
标记-压缩算法:
内存泄漏:
内存溢出:
Stop the World:
JVM常见问题以及决解方法:
1. 内存溢出(OutOfMemoryError):
2. JVM 启动慢或性能瓶颈:
3. 线程问题(死锁、线程过多):
4.内存泄漏(Memory Leak):
5.JVM 启动失败(JVM Crash):
JVM介绍:
解释:
Java虚拟机,Java的所有程序都会在这个虚拟机上执行。
特点:
1. 一次编译到处运行
2.自动内存管理
3.自动垃圾回收
整体构成:
- 类加载器(ClassLoader)
- 运行时数据区(Runtime Data Area)
- 执行引擎(Execution Engine)
- 本地库接口(Native Interface)
执行过程:
1. java 代码转换成字节码(class 文件)
2. jvm 首先需要把字节码通过一定的方式 类加载器(ClassLoader) 把文件加载到内存中的运行时数据区(Runtime Data Area)
3. 而字节码文件是 jvm 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 执行引擎(Execution Engine) 将字节码翻译成底层系统指令再交由CPU 去执行,而这个过程中需要调用其他语言的接口 本地库接口(Native Interface) 来实现整个程序的功能。
通常所说的 JVM 组成指的是 运行时数据区(Runtime Data Area) ,因为通常需要调试分析的区域就是“运行时数据区”,或者更具体的来说就是“运行时数据区”里面的 Heap(堆)模块。
接下来我将直接介绍运行时数据区:
运行时数据区:
- 程序计数器(Program Counter Register)
程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。
- Java 虚拟机栈(Java Virtual Machine Stacks)
描述的是 Java 方法执行的内存模型,每个方法在执行的同时都会创建一个线帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每个方法从调用直至执行完成的过程,都对应着一个线帧在虚拟机栈中入栈到出栈的过程。
- 本地方法栈(Native Method Stack)
与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的。
- Java 堆(Java Heap)
是 Java 虚拟机中内存最大的一块,是被所有线程共享的,在虚拟机启动时候创建,Java 堆唯一的目的就是存放对象实例,几乎所有的对象实例都在这里分配内存.
- 方法区(Methed Area)
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。方法区是很重要的系统资源,是硬盘和 CPU 的中间桥梁,承载着操作系统和应用程序的实时运行.
线程间共享:堆,方法区. 线程私有:程序计数器,栈,本地方法栈.
Java堆剖析:
- 堆在jvm中只存在一个实例,它被所有线程所共享。
- 堆可以设置大小Xms(堆的起始大小)-----Xmx(堆的最大值),但一般设置起始值和最大值相等,这样就可以减少GC(垃圾回收)后的内存程序分配,可以提高效率。
- 堆可以是在物理上不连续的空间,但在逻辑上是连续的。
- 方法结束后,堆中的对象会马上失效,但是不会马上被移除,只有GC后才会移除。
- 堆是GC(垃圾回收器)重点回收的区域。
- 所有对象实例都在运行时分配到堆上。
堆内存区域划分
Java8 及之后堆内存分为 :新生区(新生代)+老年区(老年代)
新生区分为 Eden(伊甸园)区和 Survivor(幸存者)区
为什么要分代呢?
将对象根据存活概率进行分类,对存活时间长的对象,放到固定区,从而减少扫描垃圾时间及 GC 频率。
针对分类进行不同的垃圾回收算法,对算法扬长避短。
内存分配:
- new的对象会被放到新生区的Eden区,该区域有大小限制。
- 当Eden区满了后,又有新的对象要被创建,这时候就会触发GC,对Eden区进行垃圾回收,将没有被引用的对象进行回收,这时候就为新的对象清理出新的空间。
- 这时候如果没有被GC回收的,会被放入到Survivor0区当中。
- 当下一次触发垃圾回收时,Survivor0区当中没有被清理的对象会被移动到Survivor1区当中,每次都会保证他们2个当中有一个幸存者区是空的。
- 再次经历垃圾回收,剩余的对象又会被从Survivor1区当放入到Survivor0区当中。
- 那什么时候去养老去呢?这个我们是可以通过-XX:MaxTenuringThreshold=<N>参数设置的,默认是15次垃圾回收后,对象头当中有4位数据对GC年龄进行保存,1111,所有默认是15次。
- 当老年区是相对很悠闲的,当老年区满了后会再次触发垃圾回收,如果回收后还是满的话,就会产生 OOM 异常. Java.lang.OutOfMemoryError:Java heap space。内存溢出。
新生区与老年区配置比例:
配置新生代与老年代在堆结构的占比(一般不会调)
默认**-XX:NewRatio**=2,表示新生代占 1,老年代占 2,新生代占整个堆的 1/3
可以修改**-XX:NewRatio**=4,表示新生代占 1,老年代占 4,新生代占整个堆的 1/5
当发现在整个项目中,生命周期长的对象偏多,那么就可以通过调整老年代的大小,来进行调优。
分代收集思想 Minor GC、Major GC、Full GC:
JVM在GC时,并非是每次都新生区的老年区一起回收,更多的是对新生区进行回收,针对 HotSpot VM 的实现,它里面的 GC 按照回收区域又分为两大类型:一种是部分收集,一种是整堆收集。
部分收集,不是整个Java堆的收集:分为:老年区收集,新生区(Eden,S0,S1)收集 。
整堆收集:对整个Java堆和方法区的垃圾进行收集。 整堆收集的情况分为:system.gc;不足时;老年区空间不足时;方法区空间不足时;开发期间应该避免整堆收集。
堆空间的参数设置 :
-XX:+PrintFlagsInitial 查看所有参数的默认初始值
-XX:+PrintFlagsFinal 查看所有参数的最终值(修改后的值)
-Xms 初始堆空间内存(默认为物理内存的 1/64)
-Xmx 最大堆空间内存(默认为物理内存的 1/4)
-Xmn 设置新生代的大小(初始值及最大值)
-XX:NewRatio 配置新生代与老年代在堆结构的占比
-XX:SurvivorRatio 设置新生代中 Eden 和 S0/S1 空间比例
-XX:MaxTenuringTreshold 设置新生代垃圾的最大年龄
XX:+PrintGCDetails 输出详细的 GC 处理日志
方法区:
方法区用来保存类,如果系统定义了太多的类,导致方法区溢出, 虚拟机同样会抛出内存溢出的错误。
方法区大小:
- 方法区大小也是不一定是固定的,可以设置大小。
- 他的大小可以由-XX:MetaspaceSize 和 -XX:MaxMataspaceSize 指定。
- 默认值依赖于平台,windows 下,-XXMetaspaceSize 是 21MB。
- -XX:MaxMetaspaceSize 的值是-1,最大值默认为无限制。
- 而-XX:MetaspaceSize 初始值是 21M 也称为高水位线 一旦触及就会触发 Full GC。
- 为了避免频繁的Full GC,我们可以把-XX:MetaspaceSize 初始值设置大一点。
垃圾回收:
方法区的垃圾收集主要回收两部分内容:运行时常量池中废弃的常量和不再使用的类型。
废弃常量:没有任何对象引用它。
废弃类:
- 该类的所有实例被回收。
- 该类的类加载器被回收。
- 该类对象没有在任何地方被引用。
垃圾回收:
垃圾是指没有被任何引用指向的对象,如果不对垃圾进行清理,那么垃圾就会一直占用内存空间,直到应用结束,导致其他对象使用不到内存空间,甚至内存溢出。
GC主要干什么?
它将不被使用到的对象释放,也可以清理内存里的记录碎片,将所有的对象移动到堆的一段。
垃圾回收相关算法:
垃圾标记阶段算法
- 垃圾标记阶段算法:
那些不再被使用到的对象就被标记为垃圾,只有标记为垃圾对象,在GC阶段才会被回收。
标记垃圾对象的算法有2种:引用计数算法和可达性分析算法。
* 引用计数算法
每个对象都有一个引用计数器属性,只要对象被引用1次,计数器就会+1。但会增加存储空间的消耗,并且每次计数都会增加时间的消耗,最重要的是,如果2个对象相互引用,形成循环的话,是无法处理的。
* 可达性分析算法
可达性分析算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效地解决在引用计数算法中循环引用的问题,防止内存泄漏的发生。
基本思路如下:
1. 从根"GCRoots”开始,从上至下的搜索被根对象连接到目标对象是否可达 。
2. 使用可达性分析算法后,目标内存中的存活对象都会被根直接或间接连接着,搜索走过的路径成为引用链。
3.没有被引用链相连的就是不可达的,标记为垃圾对象。
”GCRoots“可以由:如:方法区中所有类的静态成员变量(包括静态字段); 常量池中的字符串常量、数字常量; 当前活动的线程在执行过程中可能会引用其他对象,因此活动线程可以作为 GC Roots; 被同步锁 synchronized 持有的对象; 基 本 数 据 类 型 对 应 的 Class 对 象 , 一 些 常 驻 的 异 常 对 象 ( 如 : NullPointerException、OutofMemoryError)。
对象的 finalization 机制 :
Java提供对象终止机制,它是对象销毁之前的自定义处理逻辑。对象销毁之前终会先调用对象的finalize()方法,每个finalize()方法只能被调用一次。
finalize()方法它允许被子类重写,一般是用来释放资源、清理工作,比如关闭文件,套接字,数据库连接等。
为此,定义虚拟机中的对象可能的三种状态 。如下:
- 可触及状态:从根节点可触及
- 可复活状态:对象的所有引用都被释放,但在finalize()方法中可能被复活
- 不可触及状态:对象的 finalize()被调用,并且没有复活,那么就会进入不可触及状态。
上面三种状态,当finalize()存在进行区分,只有不可复活状态才会被回收。
例:判断一个对象A是否被回收,至少需要判断2次:
- 判断根节点无法触及对象,标记为一次。
- 判断对象的finalize()方法,有没有必要执行:
①对象的finalize()方法没有被重写,或者finalize()方法已经被执行了,虚拟机认为没有必要执行,A就被判定为不可触及状态
②对象的finalize()方法被重写,并且还没有被执行,会被加入到finalizer队列当中去等待执行finalize()方法,当执行finalize()方法时,如果与任何对象建立联系,那么A对象就会被移除“即将回收”集合。当下次这个情况,finalize()方法不会被再次调用,而是会直接判定为不可触及状态。
垃圾回收阶段算法:
标记-复制算法 :
它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。
优点:
- 没有标记和清除阶段,运行简单。
- 复制过去后保证空间的连续性,不会出现“碎片”问。
缺点:
- 需要2倍的内存空间。
应用场景:
一般用在新生代当中,因为新生代中垃圾对象很多,需要复制的对象相对较少,这样效率较高。
标记-清除算法:
执行过程
当堆中的有效内存空间被耗尽的时候,然后进行这项工作.
标记:在这个阶段,JVM会遍历所有的对象,标记那些被根对象(GC Root)可达的对象。
清除:在标记阶段完成后,JVM会遍历堆中的所有对象,清除那些未被标记的对象。未被标记的对象意味着它们不再被任何根对象引用,因此可以回收它们的内存。
标记-压缩算法:
第一阶段和标记清除算法一样,从根节点开始标记所有被引用对象
第二阶段将所有的存活对象压缩到内存的一端,按顺序排放。之后,清理边界外所有的空间。
优点:
- 消除了复制算法当中,内存减半的高额代价。
- 消除了标记-清除算法当中,内存区域分散的缺点,我们需要给新对象分配内存时,JVM 只需要持有一个内存的起始地址即可。
缺点:
- 移动过程中,需要全程暂停用户应用程序。即:STW
- 移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址
内存泄漏:
内存溢出是指程序在运行过程中请求的内存超过了JVM可用内存的限制,导致无法为新的对象分配内存。JVM会抛出 OutOfMemoryError
错误,表示堆内存或其他区域的内存不足,无法继续分配。
内存溢出:
内存泄漏是指程序中已经不再使用的对象由于某些原因,仍然持有引用,导致这些对象无法被垃圾回收器回收,从而造成内存资源的浪费。虽然程序的运行没有超出可用内存的限制,但由于内存被不断占用,最终可能导致系统性能下降,甚至内存溢出。
例:
- Threadlocal:
ThreadLocal
在某些情况下会导致内存泄漏,尤其是当线程池中的线程没有被正确清除时,ThreadLocal
的数据不会被回收。 - 一些提供 close()的资源未关闭导致内存泄漏
数据库连接 dataSourse.getConnection(),网络连接 socket 和 io 连接必须手动 close,否则是不能被回收的。
Stop the World:
指的是 GC 事件发生过程中,会产生应用程序的停顿。停顿产生时整个应用程序线程都会被暂停,没有任何响应,有点像卡死的感觉,这个停顿称为 STW。
可达性分析算法中枚举根节点(GC Roots)会导致所有 Java 执行线程停顿:
- 分析工作必须在一个能确保一致性的快照中进行
JVM常见问题以及决解方法:
1. 内存溢出(OutOfMemoryError):
解决方法:
- 使用
-Xms
和-Xmx
设置堆内存的初始值和最大值,确保堆内存足够大。 - 启用 GC日志(
-Xlog:gc*
),查看GC频率和停顿时间,了解垃圾回收的情况。 - 分析内存泄漏:可以使用
jmap
和 Heap Dump 分析工具来识别没有被垃圾回收的对象,检查是否有不再使用的对象被错误地保留引用。 - 检查 JVM 配置:合理配置堆内存,避免频繁 Full GC。适当调整 新生代 和 老年代 的比例(如
-XX:NewRatio
)。
2. JVM 启动慢或性能瓶颈:
- 分析启动参数:使用合适的 JVM启动参数,比如
-XX:+UseG1GC
、-Xms
、-Xmx
,确保堆内存设置合理。 -
类加载问题:应用启动时大量的类加载可能会拖慢启动速度。可以通过调整类加载器、类缓存等方式优化类加载速度。
-
代码优化:使用合适的数据结构和算法,减少不必要的计算,优化程序逻辑。
3. 线程问题(死锁、线程过多):
- 死锁通常表现为两个或多个线程互相等待对方释放锁。分析线程转储中的锁信息,找出死锁源。
- 检查线程池配置:确保线程池大小和队列容量合适,避免线程池溢出。可以调整
ThreadPoolExecutor
的核心线程数、最大线程数等参数。
4.内存泄漏(Memory Leak):
- Heap Dump 分析:在内存消耗过多时,生成 Heap Dump 文件,并使用 MAT 或 VisualVM 等工具分析内存使用情况,找出占用内存的对象。
- Threadlocal在线程池的情况下数据没有被清理;数据库连接,socket,io等没有close。
5.JVM 启动失败(JVM Crash):
- 内存配置问题:确保内存配置合理,过大的堆内存或直接内存可能导致 JVM 崩溃。
- JVM版本兼容性问题:确认使用的 JVM 版本与操作系统、硬件架构等兼容,确保没有已知的 JVM bug。
- 查看 Crash Log:JVM 崩溃时,通常会生成 hs_err_pid.log 文件,查看其中的错误堆栈信息,查找崩溃的原因。
相关文章:
JVM深入理解
目录 JVM介绍: 解释: 特点: 整体构成: 执行过程: 运行时数据区: Java堆剖析: 堆内存区域划分 为什么要分代呢? 内存分配: 新生区与老年区配置比例:…...
DeepSeek 开放平台无法充值 改用其他平台API调用DeepSeek-chat模型方法
近几天DeepSeek开放平台无法充值目前已经关闭状态,大家都是忙着接入DeepSeek模型 ,很多人想使用DeepSeek怎么办? 当然还有改用其他平台API调用方法,本文以本站的提供chatgpt系统为例,如何修改DeepSeek-chat模型API接口…...
ImportError: cannot import name ‘FixtureDef‘ from ‘pytest‘
错误信息表明 pytest 在尝试导入 FixtureDef 时出现了问题。通常是由于 pytest 版本不兼容 或 插件版本冲突 引起的。以下是详细的排查步骤和解决方案: 1. 检查 pytest 版本 首先,确认当前安装的 pytest 版本。某些插件可能需要特定版本的 pytest 才能…...
懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制)
1.合集懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制):https://www.bilibili.com/video/BV1M6rdYEEog/ 备注: 1.本地离线卡密采用最安全的非对称加解密技术,设备id采用最安全多重混合加密不可逆技术生成&…...
Rust编程语言入门教程 (六)变量与可变性
Rust 系列 🎀Rust编程语言入门教程(一)安装Rust🚪 🎀Rust编程语言入门教程(二)hello_world🚪 🎀Rust编程语言入门教程(三) Hello Cargo…...
ArcGis和Super Map
1.ArcGIS ArcGIS 是美国环境系统研究所(ESRI)开发的一系列地理信息系统(GIS)软件产品的总称,它提供了一套全面的工具和服务,可用于采集、存储、分析、管理和展示地理数据,在众多领域都有广泛的…...
POI优化Excel录入
57000单词原始录入时间258S 核心代码: List<Word> wordBookList ExcelUtil.getReader(file.getInputStream()).readAll(Word.class);if (!CollectionUtil.isEmpty(wordBookList)) {for (Word word : wordBookList) {//逐条向数据库中插入单词wordMapper.insert(word);}…...
Zookeeper和Kafka的依赖关系
Zookeeper 和 Kafka 是紧密相关的,它们在功能上相互协作,共同为分布式系统提供支持,以下是它们的关系具体介绍: Kafka 依赖 Zookeeper 进行元数据管理 主题信息存储:Kafka 中的主题(Topic)相关信息,如主题的名称、分区数量、副本分布等都存储在 Zookeeper 中。当 Kafk…...
驱动开发、移植
一、任务明确:把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作, sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…...
RT-Thread+STM32L475VET6实现红外遥控实验
文章目录 前言一、板载资源介绍二、具体步骤1. 确定红外接收头引脚编号2. 下载infrared软件包3. 配置infrared软件包4. 打开STM32CubeMX进行相关配置4.1 使用外部高速时钟,并修改时钟树4.2 打开定时器16(定时器根据自己需求调整)4.3 打开串口4.4 生成工程 5. 打开HW…...
分布式大语言模型服务引擎vLLM论文解读
论文地址:Efficient Memory Management for Large Language Model Serving with PagedAttention 摘要 大语言模型(LLMs)的高吞吐量服务需要一次对足够多的请求进行批处理。然而,现有系统面临困境,因为每个请求的键值…...
Bio-ORACLE数据分享[decade 2010-2020] [Surface layers]
Bio-ORACLE数据分享[decade 2010-2020] [Surface layers] 文章目录 Bio-ORACLE数据分享[decade 2010-2020] [Surface layers]前言一、文件分享(主要)二、相关代码(选看)总结 Bio-ORACLE数据分享[decade 2010-2020] [Surface layer…...
MySQL六大日志的功能介绍。
前言 首先,MySQL的日志应该包括二进制日志(Binary Log)、错误日志(Error Log)、查询日志(General Query Log)、慢查询日志(Slow Query Log)、重做日志(Redo …...
ChatGPT客户端无法在微软应用商店下载的解决方法
最近网页端的GPT4o只会用how can I assist you 回复了,查了一下发现是类似IP封锁/模型降级等等问题,总之解决方法就是下载客户端。客户端需要通过微软应用商店下载,但是下载时总会出现如下情况: 1.区域和语言没有设置为美国/英语导…...
数仓搭建(hive):DWS层(服务数据层)
DWS层示例: 搭建日主题宽表 需求 维度 步骤 在hive中建数据库dws >>建表 CREATE DATABASE if NOT EXISTS DWS; 建表sql CREATE TABLE yp_dws.dws_sale_daycount( --维度 city_id string COMMENT 城市id, city_name string COMMENT 城市name, trade_area_id string COMME…...
Ollama+DeepSeek+Open-WebUi
环境准备 Docker Ollama Open-WebUi Ollama 下载地址:Ollama docker安装ollama docker run -d \ -v /data/ollama/data:/root/.ollama \ -p 11434:11434 \ --name ollama ollama/ollama 下载模型 Ollama模型仓库 # 示例:安装deepseek-r1:7b doc…...
【笔记】LLM|Ubuntu22服务器极简本地部署DeepSeek+联网使用方式
2025/02/18说明:2月18日~2月20日是2024年度博客之星投票时间,走过路过可以帮忙点点投票吗?我想要前一百的实体证书,经过我严密的计算只要再拿到60票就稳了。一人可能会有多票,Thanks♪(・ω・)&am…...
FreeSwitch中mod_dptools和mod_easyroute两个模块及应用场景
FreeSWITCH 中的 mod_dptools 和 mod_easyroute 是两个功能不同的模块,分别服务于呼叫控制和动态路由场景。以下是详细介绍: mod_dptools 功能概述 mod_dptools(Dialplan Tools)是 FreeSWITCH 最核心的模块之一,提供了…...
【Java】泛型与集合篇 —— Set 接口
目录 Set 接口及实现类HashSet 类特点内部实现构造方法LinkedHashSet 类基本概念特点构造方法常用方法适用场景用 Set 对象实现集合运算TreeSet 类特性构造方法常用方法注意事项对象顺序自然排序定制排序注意事项Set 接口及实现类 HashSet 类 HashSet 是 Java 集合框架中 Set…...
DeepSeek 助力 Vue 开发:打造丝滑的右键菜单(RightClickMenu)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
数据结构与算法面试专题——堆排序
完全二叉树 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 设计目标:完全二叉树的设计目标是高效地利用存储空间,同时便于进行层次遍历和数组存储。它的结构使得每个节点的子节点都可以通过简…...
【Mysql】索引
【Mysql】索引 一、索引的简介二、索引结构2.1 Hash2.2 二叉搜索树2.3 B树2.4 B树 三、索引分类3.1 主键索引3.2 普通索引3.3 唯一索引3.4 全文索引3.5 聚集索引3.6 非聚集索引3.7 索引覆盖 四、使用索引4.1 自动创建索引4.2 手动创建索引4.2.1 主键索引4.2.2 唯一索引4.2.3 普…...
qt的下载安装详细介绍
下载 我们可以在国内的镜像网站上下载qt安装包,按需下载: 我的需求是在windows上运行,x64的qt5.15.2,所以我下载的是qt-unified-windows-x64-4.6.0-online.exe 下载完成之后,我们来到存放该exe文件的目录,打开命令窗…...
Eclipse插件开发六:使用Web前端技术开发AI助手页面
之前的过程中,我们都不怎么熟悉Eclipse的哪些API,样式也没发怎么去修改,现在我们要修改为用html的方式来编写. 准备一个AI助手聊天页面的html.css,js代码 效果如下所示。 1.快速demo 1.1.准备前端代码 确保准备的前端代码可以在浏览器正常…...
Jackson使用
Jackson 是一个功能强大的 JSON 处理库,除了基本的序列化和反序列化功能外,它还提供了许多其他功能,以满足不同的需求。以下是一些常用的高级功能: 0.普通序列化反序列化 序列化 import com.fasterxml.jackson.databind.ObjectM…...
Maven——Maven开发经验总结(1)
摘要 本文总结了 Maven 开发中的多个关键经验,包括如何根据版本号决定推送到 releases 或 snapshots 仓库,如何在构建过程中跳过测试,父项目如何控制子项目依赖版本,父项目依赖是否能传递到子项目,如何跳过 Maven dep…...
MyBatis-Plus之通用枚举
MyBatis-Plus之通用枚举 前言 MyBatis-Plus中提供了通用枚举,简单来说就是将数据库中的某一字段的代替的含义转换成真实的含义将数据展示给用户,用户在存储时也会将真实值转换成代替的数字存入到数据库中。举个例子:用户性别在数据库中存储…...
React通用登录/注销功能实现方案(基于shadcn/ui)
React通用登录/注销功能实现方案(基于shadcn/ui) 一、功能需求分析二、通用功能封装1. 通用登录表单组件2. 认证Hook封装 三、功能使用示例1. 登录页面实现2. 用户菜单实现 四、路由保护实现五、方案优势 一、功能需求分析 需要实现以下核心功能&#x…...
AI工具篇:利用DeepSeek+Kimi 辅助生成综述汇报PPT
随着科研和学术报告需求的增加,如何高效地准备一份结构清晰、内容充实的PPT已成为许多研究者的挑战。 传统的PPT制作过程繁琐,需要大量文献收集、数据分析和设计工作,而AI工具能够帮助提升效率,减少重复劳动。 本文将介绍如何使用…...
审计级别未启用扩展模式导致查询 DBA_AUDIT_TRAIL 时 SQL_TEXT 列为空
如果查询 DBA_AUDIT_TRAIL 时发现 SQL_TEXT 列为空,但其他字段(如 OS_USERNAME、USERNAME、TIMESTAMP 等)有数据,可能是由于以下原因之一。以下是可能的原因及解决方法: 1. 审计级别未启用扩展模式 默认情况下&#x…...
HTTP 和RESTful API 基础,答疑
一文搞懂RESTful API - bigsai - 博客园 1. API 路径 开头必须 /,表示绝对路径,不支持 . 或 ..(相对路径)。API 结尾 / 通常不需要,但部分框架会自动处理 / → 无 /。 ✅ 推荐 GET /api/v1/products # 资源集合…...
手写简易RPC(实践版)
首先了解rpc rpc-远程过程调用,openFeign,Dubbo都可以算作rpc,以微服务来具体说明,就是在本地不需要去发送请求,通过rpc框架,像调用本地方法一样调用其他服务的方法,本质上还是要经过网络&…...
Day6 25/2/19 WED
【一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)】https://www.bilibili.com/video/BV13g41157hK?p4&v…...
【DL】浅谈深度学习中的知识蒸馏 | 输出层知识蒸馏
目录 一 核心概念与背景 二 输出层知识蒸馏 1 教师模型训练 2 软标签生成(Soft Targets) 3 学生模型训练 三 扩展 1 有效性分析 2 关键影响因素 3 变体 一 核心概念与背景 知识蒸馏(Knowledge Distillation, KD)是一种模…...
机器学习PCA和LDA
主成分分析(PCA, Principal Component Analysis)和线性判别分析(LDA, Linear Discriminant Analysis)是两种常用的降维方法,它们虽然都用于数据降维,但核心思想和应用场景不同。 PCA(主成分分析…...
tcp协议连接,和传输数据
1、连接 这个是通用的 2、传送数据 当连接建立后,客户端和服务器都可以主动发送数据,分别如下 1》客户端先发送数据 这里是单向的,服务器没有对客户端的数据内容进行应答,只是单纯的对报文应答ack 2》服务器先发送数据...
【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示
异常问题: 这个是在新版的pycharm中出现的,出现的问题,点击view后不全部显示,而是以...折叠显示 在setting中这么设置一下就好了: 解决办法: https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…...
Java基础——代理模式
代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 一、代理模式的主要作用 控制访问:通…...
解锁机器学习核心算法|主成分分析(PCA):降维的魔法棒
一、引言 在机器学习的庞大算法体系中,有十种算法被广泛认为是最具代表性和实用性的,它们犹如机器学习领域的 “十大神器”,各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森林、K - 近邻算法、K - 平均算法、支持向…...
sql注入漏洞
目录 一、SQL注入概述 例子背景 正常情况下的查询 SQL注入攻击 利用优先级进行攻击 二、解决SQL注入 使用PreparedStatement接口 步骤和方法 1. 创建PreparedStatement对象 2. 向占位符传入值 3. 执行SQL语句 示例 总结 SQL 注入是一种常见的网络攻击手段。通俗来…...
spring微服务+dubbo框架,某一服务启动时提示多个bean存在
在java的springboot项目中使用DubboService的注解的实现类中,在引用本模块的类时,使用的DubboRefrence注解,在启动项目时报错,提示该类需要以一个bean对象,但是存在了两个,把DubboRefrence的注解改成Autowi…...
React useState 和 useEffect 使用坑点注意总结
React Hooks 使用注意事项 Area: Hooks Date: February 10, 2025 Important: 🌟🌟🌟 React Hooks 注意事项 要点: useState 的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染而更新。useEffect 可…...
使用rknn进行yolo11-pose部署
文章目录 概要生成ONNX生成RKNN实测效果概要 使用 RKNN 进行 YOLOv11 Pose 部署的必要性在于,RKNN 能将 YOLOv11 Pose 模型转化为适合 Rockchip 硬件平台(如 RV1109、RV1126)执行的格式,充分利用其 AI 加速功能,显著提高推理速度和效率。此外,RKNN 提供模型优化(如量化…...
开源语音克隆项目 OpenVoice V2 本地部署
#本机环境 WIN11 I5 GPU 4060ti 16G 内存 32G #开始 git clone https://github.com/myshell-ai/OpenVoice.git conda create -n opvenv python3.9 -y conda activate opvenv pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/…...
YOLOv12从入门到入土(含结构图)
论文链接:https://arxiv.org/abs/2502.12524 代码链接:https://github.com/sunsmarterjie/yolov12 文章摘要: 长期以来,增强YOLO框架的网络架构一直至关重要,但一直专注于基于cnn的改进,尽管注意力机制在建…...
8.【线性代数】——求解Ax=b
八 求解Axb 1. 解Axb求特解 x p x_p xp求特解 x n x_n xn所有解 2. Axb什么时候有解3. A m ∗ n A_{m * n} Am∗n不同秩的Axb解分析3.1 列满秩 rn<m3.2 行满秩 rm<n3.3 rmn3.4 r<m 且 r < n3.5 综述 1. 解Axb 求解 { x 1 2 x 2 2 x 3 2 x 4 b 1 2 x 1…...
【Quest开发】全身跟踪
软件:Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件:Meta Quest3 最终效果:能像meta的操作室沉浸场景一样根据头盔移动来推断用户姿势,实现走路、蹲下、手势匹配等功能 需要借助UnityMovement这个包 GitHub …...
Spring Boot 示例项目:从零开始构建 Web 应用
一、项目概述 本文档将指导您通过一个示例项目,了解如何使用 Spring Boot 框架构建一个简单的 Web 应用程序。该项目涵盖了从数据模型定义到控制器、服务层以及数据访问层的完整开发流程,帮助您快速掌握 Spring Boot 的基本使用方法。 二、项目结构 1. 项目模块 本示例项…...
Windows 启动 SSH 服务报错 1067
Windows 启动 SSH 服务报错 1067 一、原本安装的 Windows 自带的 SSH 服务 按 Windows 键 -> 设置 -> 系统 -> 可选功能 在 添加的功能 查看是否安装了 OpenSSH 服务 一开始 执行 net start sshd 是可以正常启动的 并且其他机器也可以通过 ssh 访问 这个电脑 但是有…...
【AI战略思考15】我对做自媒体视频博主的初步探索和一些思考
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 导言 因为自己找工作可能没那么快和顺利,事实是比我之前想象的要难很多,所以这几天探索了下自己能否尝试做自媒体或者视频博主来尝试赚点钱,如果做…...