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

Java虚拟机JVM知识点(已完结)

JVM内存模型

介绍下内存模型

根据JDK8的规范,我们的JVM内存模型可以拆分为:程序计数器、Java虚拟机栈、堆、元空间、本地方法栈,还有一部分叫直接内存,属于操作系统的本地内存,也是可以直接操作的。

详细解释一下

  • 程序计数器:可以看作是当前线程所执行的字节码的行号指示器,用于存储当前线程正在执行的Java方法的JVM指令地址。
  • Java虚拟机栈:每个线程都有一个独立的Java虚拟机栈,生命周期和线程相同。每个方法在执行时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等,可能抛出OOM和StackOverflowError异常。
  • 本地方法栈:与Java虚拟机栈类型,主要为虚拟机使用到的Native方法服务,在HotSpot虚拟机中和Java虚拟机栈合二为一。本地方法执行时也会创建栈帧,同样也可以抛出OOM和StackOverflowError异常。
  • 方法区(元空间):在JDK8以后的版本中,方法区被元空间取代,使用本地内存。用于存储已被虚拟机加载的类信息、常量、静态变量等数据。虽然方法区被描述为堆堆逻辑部分。方法区可以选择不进行垃圾回收。同样可以抛出OOM和StackOverflowError异常。
  • Java堆:在JVM最大的一个部分,被所有线程所共享,当虚拟机启动时,用于存放所有的对象实例。从垃圾回收的角度,分为新生代和老年代,新生代分为伊甸区(Eden)和幸存区(Survivor分为From Survivor和To Survivor),如果在堆中没有内存完成实例分配,并且堆也无法扩展时会OOM。
  • 运行时常量池:是方法的一部分,用于存放编译期间生成的各种字面量和符号引用,具有动态性。
  • 直接内存:不属于JVM运行时数据区的一部分,通过NIO引入,是一种堆外内存,可以显著提高i/o性能。

JVM内存模型中堆和栈的区别

  • 用途:栈主要用于存储局部变量、方法参数的调用、方法返回地址以及一些临时数据。每当一个方法被调用,就会创建一个栈帧,用于存储方法的信息,方法执行完毕,栈帧也会被移除。堆用于存储对象的实例,当你使用new去创建一个对象时,对象实例就会在上面分配空间。
  • 生命周期:栈中的数据具有确定的生命周期,当一个方法结束调用时,其对应的帧栈就会被移除,栈中存储的局部变量也就会消失。堆中的对象没有固定的生命周期,闲置对象会在垃圾回收机制下被回收。
  • 存取速度:栈的存取速度比堆快,因为栈遵循先进后出FIFO的原则,操作简单快速。堆的存取速度较慢,因为对象在对上分配和回收需要更多的时间,垃圾回收机制也会影响性能。
  • 存储空间:栈的空间相对较小,且较为固定,由操作系统管理。当栈溢出时,通常因为递归过深或者局部变量过大。堆的空间较大,动态扩展,由JVM管理,堆溢出通常由于创建了太多的大对象未及时收回。
  • 可见性:栈中的数据对线程是私有的,每个线程有自己的栈空间。堆中的数据对线程是共享的,所有线程都可以访问堆上的对象。

栈中存储的到底是指针还是对象

在JVM内存模型中,栈主要用于管理线程的局部变量和方法的上下文调用,而堆是粗处所有类的实例和数组。

当我们在讨论存储时,实际上栈中存储的是方法执行时的基本数据类型和对象的引用,这里注意是对象的引用,不是对象本体,指向堆中对象的实例。

堆分为哪几部分呢

  • 新生代:新生代分为Eden伊甸区和幸存区。在伊甸区中,大多数新创建的对象都会放在这里,Eden区相对较少,当Eden区满时,会触发一个Minor GC(轻GC)。在幸存区中,通常分为两个大小相等的部分,每次Minor GC时,存活下来的对象会被移动到其中的一个幸存区,以继续他们的生命周期。
  • 老年代:存放过一次或多次Minor GC仍存活的对象会被移动到老年代。老年代的生命周期较长,因此Full GC发生频率较低,但是执行时间比Minor GC长,老年代空间比新生代长。
  • 元空间:从Java8开始,永久代被元空间取代,用于存储类的元信息,如类的结构信息等。元空间不在堆红,而是使用了本地内存,解决了永久代OOM的问题。
  • 大对象区:在某些JVM实现中引入了大对象区,指需要大量连续的内存空间的对象,如大数组,这类对象直接放在老年代,避免年轻代的晋升而导致内存碎片化。

方法区的执行过程

  • 解析方法调用:JVM会根据方法的符号引用找到实际方法地址。
  • 栈帧创建:在调用一个方法前,JVM会在当前线程的Java虚拟机栈中为该方法分配一个新的栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口信息。
  • 执行方法:执行方法内的字节码命令,涉及的操作可能包括局部变量的读写等操作。
  • 返回处理:方法执行完毕后,可能会返回一个结果给调用者,并清理当前栈帧,恢复调用者的执行环境。

String保存在那里?

String是包存在字符串常量池中,不同于其他对象,他的值是不可变的,可以被多个引用共享。

引用类型有哪些?有什么区别

  • 强引用类型:是代码中普遍的赋值方式,比如A a = new A();这样的发过誓。强引用关联的对象,永远不会被垃圾回收器回收。
  • 软引用类型:可以用SoftReference来描述,指的是那些有用但是不是必须要的对象。系统在发生内存溢出前会针对这样的对象进行回收。
  • 弱引用:可以用WeakReference来描述,他的强度比软引用低,弱引用的对象下一次GC的时候一定会被回收,不管内存是否足够。
  • 虚引用:幻影引用,是最弱的引用关系,他必须和ReferenceQueue一起使用,当GC发生时,虚引用也会被回收。可以用虚引用来管理堆外内存。

弱引用了解吗?举例说明

Java中的弱引用是一种引用类型,他不会阻止一个对象被垃圾回收。

  • 缓存系统:弱引用常用来实现缓存,特别是当希望缓存项能够在内存压力下自动释放时。如果缓存的大小不受控制,可能会导致内存溢出。使用弱引用来维护缓存,可以让JVM在需要更多内存的时候自动清理这些对象。
  • 对象池:在对象池中,弱引用可以用来管理那些暂时不用的对象。当对象不再被强引用时,他可以被垃圾回收,释放内存。
  • 避免内存泄漏:当一个对象不应该被长期引用时,使用弱引用可以防止该对象被意外的保留,避免的潜在的内存泄漏。

内存泄漏和内存溢出的理解

内存泄露:内存泄露通常是在程序运行中不再使用的对象仍然被引用,从而无法被垃圾回收器回收,从而导致可用内存逐渐变少,虽然在Java中,垃圾回收机制会自动回收不再引用的对象,但是仍有对象不会被回收,最终导致程序内存不断增加。

导致内存泄漏的原因

  • 静态集合:使用静态的数据结构存储对象,且没有清理。
  • 事件监听:未取消对事件的监听,导致对象被持续引用
  • 线程:未停止的线程可能持有对象的引用,无法被回收

内存溢出:内存溢出指的是Java虚拟机在申请内存时,无法找到足够的内存,最终引发OOM。

内存溢出主要原因

  • 大量对象创建:程序中不断创建大量对象,超出JVM堆的限制。
  • 持久引用:大型数据结构长时间持有对象的引用,导致内存积累
  • 递归调用:深度递归导致栈溢出

JVM内存结构中有哪几种内存溢出的情况

  • 堆内存溢出:当出现OOM时,就是堆内存溢出了,原因是代码中可能存在大对象分配。或者发生了内存泄漏,导致多次GC之后,仍无法找到一个合适的空间存放当前对象。
  • 栈内存溢出:如果我们写一个程序不断的递归调用,而且没有退出条件,就回导致不断的进行压栈。类似于这种情况会JVM会抛出:SOF。如果JVM试图扩展栈空间失败,则直接报出OOM。
  • 元空间溢出:出现这个异常是系统的代码非常多或者引用了过多的第三方包或者通过动态代码加载类的操作,导致元空间内存被压满
  • 直接内存溢出:在使用ByteBuffer会使用到,很多JavaNIO的框架(Neety和Vert.x)被封装为其他的方法会抛出OOM。

类初始化和加载

创建对象的过程

  1. 类加载检查:虚拟机收到一条new指令时,首先将去检查这个指令的参数能否在常量池中定位到一个类的符号引用。并检查这个符号引用代表的类是否被加载、解析和初始化过。如果没有则必须先进行相应的类加载工程。
  2. 分配内存:在类加载检查过程后,接下来虚拟机将为新生代分配内存。对象所需的内存大小在类加载后方可确定,将对象所需要的空间从Java堆中划分出来。
  3. 初始化零值:内存分配完成后,虚拟机需要将分配到的内存空间初始化为0值,这一步保证了对象的实例字段在Java中可以不赋值就可以直接使用,程序能够能访问到这些字段的数据类型所对应的零值。
  4. 进行必要设置(对象头):初始化零值完成之后,虚拟机需要对对象进行必要的设置。也就是初始化对象头。
  5. 执行init方法:在上面工作完成后,在JVM看来,一个对象已经执行完毕了。但是在程序看来,才刚刚开始。需要根据程序设计者的思路来初始化对象。

对象生命周期

  • 创建:对象通过关键字new在堆内存中被初始化,构造函数被调用,对象内存空间被分配。
  • 使用:对象被引用并执行相应操作。
  • 销毁:当对象部呗引用时,通过垃圾回收机制自动回收对象所占用的内存空间。

类加载器都有哪些

  • 启动类加载器:这是最顶层的加载器,负责加载Java的核心库,是使用C++编写的,是JVM的一部分,启动类加载器无法被Java程序直接引用。
  • 扩展类加载器:他是Java语言实现的,继承自ClassLoader类,负责加载Java扩展目录下的jar包和类库,扩展类加载器由启动类加载器加载,并且父加载器就是启动类加载器。
  • 系统类加载器:这也是Java语言实现的,负责加载用户类路径上的指定类库,是我们平时编写Java默认使用的加载器。
  • 自定义类加载器:用户定制的类加载器。

这些类加载器之间的关系形成了双亲委派模型,核心思想是当一个类加载器收到类加载请求时,首先不去自己尝试加载这个类,而是把这个请求委派给副加载器去完成,每一层都是如此,因此所加载请求最终都应该传送到顶层加载器中。

双亲委派到作用

  • 保证类的唯一性:通过委托机制,保证每一个加载请求都会传递到启动类加载器,避免不同的加载器加载相同的类,保证了Java核心库的一致性
  • 保证安全性:防止不可信的类假冒核心类。因为都会被委托到顶层的启动类加载器。
  • 隔离和层次划分:双亲委派模型支持不同层次的类加载器服务于不用的类的加载请求。
  • 简化加载流程:通过委派,大部分类能够被正确的类加载器加载,减少了每个加载器需要处理类的数量,简化加载过程。

讲一下类加载的过程

  • 加载:通过类的全限定名获取到类的.class文件的二进制字节流,将二进制字节流所代表的静态存储结构转化为方法区运行时的数据结构,在内存中生成一个代表该类的Java.lang.Class对象,作为方法区这个类的各种入口。
  • 连接:
    • 验证:验证这个类的字节流内所包含的信息是否符合当前虚拟机要求。
    • 准备:将静态资源赋0值
    • 解析:将符号引用直接替换为直接引用
  • 初始化:初始化是整个类加载过程中的最后一个阶段,初始化阶段简单来说执行构造器方法们要注意这个构造器不是开发者写的,是编译器生成的。
  • 使用类或者对象
  • 卸载:当一个类的所有实例都被回收,也就是Java堆中不存在该类的任何实例,加载类的ClassLoader已经被回收。类对应的Java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射获取对象。

垃圾回收

什么是Java中的内存回收。如何触发垃圾回收

垃圾回收是一种自动管理内存的机制,他负责自动释放不再被程序引用的对象所占用的内存,这种机制减少了内存泄漏和内存管理错误的可能性。

  • 内存不足时释放:当JVM检测到内存不足时,无法为新的对象分配内存时,会自动触发垃圾回收。
  • 手动请求:虽然垃圾回收是自动的,开发者可以通过调用System.gc()或者其他方法进行垃圾回收。不过这只是一个建议,并不能保证立即执行。
  • JVM参数:启动Java应用可以通过调整JVM参数来进行垃圾回收行为。比如:-Xmx、-Xms。
  • 对象数量或者使用达到阈值:垃圾回收内部实现了一些策略,以监控对象的创建和使用。

判断垃圾的方法

在Java中判断对象是否为垃圾(即不被引用,可以被垃圾回收器回收),主要依据两种垃圾回收算法来实现:引用计数法和可达性算法。

引用计数法

  • 原理:为每个对象分配一个引用计数器,每当有一个地方引用它时,计数器加一,当引用失效时,计数器减1,当计数器为0,对象不再被任何变量引用,可以被回收。
  • 缺点:有循环引用的问题,当两个对象循环引用时,两个对象此时的引用计数都为1,谁也不放谁,就会导致对象无法被回收。

可达性分析算法

Java虚拟机主要采用这种算法来判断对象是否为垃圾。

原理:从一组称为GC Roots(垃圾收集根)的对象出发,向下追溯他们的引用对象,以及这些对象引用的其他对象,以此类推,如果一个对象的GC Roote没有任何引用连接,那么这个对象就被认为是垃圾对象,可以被回收。

垃圾回收算法

  • 标记清除法:标记清除法,分为标记+清除两个部分,首先通过可达性分析标记出所有需要回收的对象,然后再直接清除。标记清除法有两个缺点,第一个是效率比较低,标记和清除的效率都比较低,再就是收集零散空间的垃圾会产生大量磁盘碎片,可能会造成申请大内存时直接OOM的问题。
  • 复制算法:为了解决内存碎片的问题,出现了复制算法。复制算法的原理是将内存分为两框,每次申请内存时都使用其中一块,当内存不够时,将这一块内存中所有存活的复制到另一块上,然后再将这一块直接清空,但是也带来新的问题,当需要分配超大连续内存时会导致直接OOM。
  • 标记整理算法:标记使用可达性算法记录出要被回收的垃圾,但是先不清除,先将存活的对象移到另一端,然后再清理剩余部分。
  • 分代回收算法:分代回收是将内存划分为新生代和老年代。分配对象的依据是对象的生命周期,或者是经历过GC的次数。对象创建时一般是在新生代创建内存,当经历一定次数的GC后仍然存活会移动到老年代。

MinorGC(Young GC)和majorGC和Full GC的区别

YoungGC

  • 只针对年轻代进行回收,包括伊甸区和两个幸存区。
  • 当伊甸区空间不足时就会出发一次YoungGC,并将存活的对象移动到幸存区。
  • 通常发生的特别频繁,因为年轻代中对象的生命周期很短,回收效率高。

MajorGC

  • 针对老年代进行回收,但不一定只回收老年代
  • 当老年代空间不足时,或者系统检测到年轻代对象晋升过快,可能出发MajorGC

Full GC

对整个堆内存进行回收。

  • 直接调用System.gc()或Runtime.getRuntime().gc() 方法时,虽然不能保证立即执行,但JVM会尝试执行Full gc
  • Minor GC时,如果存活的对象无法全部放入老年代,或者老年代空间不足以容纳存活的对象,则会出发Full GC,对堆内存进行回收。
  • 当永久代或元空间空间不足时,出发FullGC

Full GC是最昂贵的操作,它需要停止所有工作线程,遍历整个堆内存来查找和回收不再使用的对象,因此尽量减少使用Full GC。

相关文章:

Java虚拟机JVM知识点(已完结)

JVM内存模型 介绍下内存模型 根据JDK8的规范,我们的JVM内存模型可以拆分为:程序计数器、Java虚拟机栈、堆、元空间、本地方法栈,还有一部分叫直接内存,属于操作系统的本地内存,也是可以直接操作的。 详细解释一下 程…...

ffuf:一款高效灵活的Web模糊测试利器

在网络安全领域,模糊测试(Fuzzing)是一种强大的技术,用于发现系统中的隐藏功能、潜在漏洞或未公开资源。而在Web渗透测试中,ffuf(Fast Fuzzing Tool)凭借其高效性、灵活性和强大的自定义能力&am…...

深入理解二叉树、B树与B+树:原理、应用与实现

文章目录 引言一、二叉树:基础而强大的结构基本概念特性分析Java实现应用场景 二、B树:适合外存的多路平衡树基本概念关键特性查询流程示例Java简化实现典型应用 三、B树:数据库索引的首选核心改进优势分析范围查询示例Java简化实现实际应用 …...

NLP高频面试题(二十八)——Reward model是如何训练的,怎么训练一个比较好的Reward model

在强化学习领域,**奖励模型(Reward Model)是关键组件之一,旨在通过预测特定行为或输出的奖励值,指导智能体的学习方向。特别是在基于人类反馈的强化学习(RLHF)**中,奖励模型通过整合…...

基础算法篇(3)(蓝桥杯常考点)-图论

前言 这期是蓝桥杯常考点的最后一章了,其中的dijkstra算法更是蓝桥杯中的高频考点 图的基本相关概念 有向图和无向图 自环和重边 稠密图和稀疏图 对于不带权的图,一条路径的路径长度是指该路径上各边权值的总和 对于带权的图,一条路径长度时…...

【力扣hot100题】(017)矩阵置零

还是挺简单的&#xff0c;使用哈希表记录需要置换的行列即可&#xff0c;这样就可以避免重复节省时间。 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {unordered_set<int> row;unordered_set<int> line;for(int i0;i&l…...

量子退火与机器学习(2):少量实验即可找到新材料,黑盒优化➕量子退火

使用量子退火和因子分解机设计新材料 这篇文章是东京大学的一位博士生的毕业论文中的主要贡献。 结合了黑盒优化和量子退火&#xff0c;是融合的非常好的一篇文章&#xff0c;在此分享给大家。 https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.2.0133…...

Ubuntu 系统上完全卸载 CasaOS

以下是在 Ubuntu 系统上完全卸载 CasaOS 的详细步骤 一.卸载验证 二.卸载步骤 1.停止并禁用 CasaOS 服务 # 停止 CasaOS 核心服务 sudo systemctl stop casaos.service# 禁用开机自启 sudo systemctl disable casaos.service# 确认服务状态&#xff08;应显示 inactive&…...

Flutter敏感词过滤实战:基于AC自动机的高效解决方案

Flutter敏感词过滤实战&#xff1a;基于AC自动机的高效解决方案 在社交、直播、论坛等UGC场景中&#xff0c;敏感词过滤是保障平台安全的关键防线。本文将深入解析基于AC自动机的Flutter敏感词过滤实现方案&#xff0c;通过原理剖析实战代码性能对比&#xff0c;带你打造毫秒级…...

Java Spring Boot 与前端结合打造图书管理系统:技术剖析与实现

目录 运行展示引言系统整体架构后端技术实现后端代码文件前端代码文件1. 项目启动与配置2. 实体类设计3. 控制器设计4. 异常处理 前端技术实现1. 页面布局与样式2. 交互逻辑 系统功能亮点1. 分页功能2. 搜索与筛选功能3. 图书操作功能 总结 运行展示 引言 本文将详细剖析一个基…...

高精度加减乘除 + R 格式

蓝桥账户中心 高精度核心思路&#xff1a;使用vector存储每一位数&#xff0c;倒序存储&#xff0c;即数组从低到高存储的是个位数。 注意减法、乘法、除法都需要去掉前导零 加法&#xff1a; vector<int> add(vector<int> &A, vector<int> &B) …...

鸿蒙编译构建-多目标产物

此文章内容兼容API12&#xff0c;使用harmony next应用开发 前置概念介绍 1&#xff0c;配置文件介绍&#xff1a; build-profile.json5&#xff1a;modules字段&#xff0c;用于记录工程下的模块信息&#xff0c;主要包含模块名称、模块的源码路径以及模块的 target 信息oh-…...

从零开始:Windows 系统中 PowerShell 配置 FFmpeg 的详细步骤

在Windows系统中不想每次都 cd 到FFmpeg目录中应用&#xff0c;现在可以通过PowerShell在任意目录下应用了。 PowerShell 基础概念 跨平台脚本工具 PowerShell 是微软开发的命令行外壳和脚本语言&#xff0c;支持 Windows、Linux 和 macOS 系统。其核心优势在于面向对象的操作…...

Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?

Spring Boot 支持多种日志框架&#xff0c;以下是详细介绍&#xff1a; 支持的日志框架 Logback Logback 是 Log4j 创始人设计的另一个开源日志组件&#xff0c;作为 Log4j 的改良版本&#xff0c;它具有更快的执行速度、更丰富的配置选项以及更好的性能。Logback 分为三个模块…...

【STM32单片机】#4 OLED调试外部中断

主要参考学习资料&#xff1a; B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装&#xff1a;STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 实验&…...

[7-02-02].第15节:生产经验 - 消费者相关操作

Kafka笔记大纲 五、生产经验——分区的分配以及再平衡: 4.1.生产经验——分区的分配以及再平衡 4.2.参数&#xff1a; 5.4.1 Range 以及再平衡...

cmd命令查看电脑的CPU、内存、存储量

目录 获取计算机硬件的相关信息的命令分别的功能结果展示结果说明获取计算机硬件的相关信息的命令 wmic cpu get name wmic memorychip get capacity wmic diskdrive get model,size,mediaType分别的功能 获取计算机中央处理器(CPU)的名称 获取计算机内存(RAM)芯片的容量…...

# OpenCV实现人脸与微笑检测:从图像到视频的实战应用

OpenCV实现人脸与微笑检测&#xff1a;从图像到视频的实战应用 在计算机视觉领域&#xff0c;人脸检测和微笑检测是两个非常有趣且实用的任务。它们广泛应用于智能监控、社交媒体分析、人机交互等多个场景。本文将通过两个代码示例&#xff0c;详细介绍如何使用OpenCV实现人脸…...

k8s EmptyDir(空目录)详解

1. 定义与特性 emptyDir 是 Kubernetes 中一种临时存储卷类型&#xff0c;其生命周期与 Pod 完全绑定。当 Pod 被创建时&#xff0c;emptyDir 会在节点上生成一个空目录&#xff1b;当 Pod 被删除时&#xff0c;该目录及其数据会被永久清除。它主要用于同一 Pod 内多个容器间的…...

学习笔记—数据结构—二叉树(链式)

目录 二叉树&#xff08;链式&#xff09; 概念 结构 初始化 遍历 前序遍历 中序遍历 后序遍历 层序遍历 结点个数 叶子结点个数 第k层结点个数 深度/高度 查找值为x的结点 销毁 判断是否为完整二叉树 总结 头文件Tree.h Tree.c 测试文件test.c 补充文件Qu…...

STM32单片机的桌面宠物机器人(基于HAL库)

效果 基于STM32单片机的桌面宠物机器人 概要 语音模块&#xff1a;ASR PRO&#xff0c;通过天问block软件烧录语音指令 主控芯片&#xff1a;STM32F103C8T6 使用HAL库 屏幕&#xff1a;0.96寸OLED屏&#xff0c;用来显示表情 4个舵机&#xff0c;用来当作四只腿 底部一个面…...

ctf-web:命令注入 -- Cyber Apocalypse CTF 2025 月光的低语 Whispers of the Moonbeam

在瓦莱丽亚繁华的首都中心&#xff0c;Moonbeam Tavern 是一个热闹的耳语、赌注和非法交易的中心。在醉酒顾客的笑声和酒杯的叮当声下&#xff0c;据说这家酒馆不仅提供麦芽酒和欢乐——它是间谍、小偷和那些忠于马拉卡事业的人的秘密聚会场所。 护卫队了解到&#xff0c;在月光…...

如何自动化同义词并使用我们的 Synonyms API 进行上传

作者&#xff1a;来自 Elastic Andre Luiz 了解如何使用 LLM 来自动识别和生成同义词&#xff0c; 使术语可以通过程序方式加载到 Elasticsearch 同义词 API 中。 提高搜索结果的质量对于提供高效的用户体验至关重要。优化搜索的一种方法是通过同义词自动扩展查询词。这样可以更…...

HCIA—— 31 HTTP的报文、请求响应报文、方法、URI和URL

学习目标&#xff1a; HTTP的报文、请求响应报文、方法、URI和URL 学习内容&#xff1a; HTTP报文——请求报文和响应报文&#xff1b;HTTP报文结构HTTP的---请求报文首部和响应报文首部方法URI和URL 目录 1.HTTP报文 1)HTTP的报文——请求报文和响应报文 HTTP协议的请求和响…...

第五十三章 Spring之假如让你来写Boot——环境篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...

Spring Boot 整合 RabbitMQ:注解声明队列与交换机详解

RabbitMQ 作为一款高性能的消息中间件&#xff0c;在分布式系统中广泛应用。Spring Boot 通过 spring-boot-starter-amqp 提供了对 RabbitMQ 的无缝集成&#xff0c;开发者可以借助注解快速声明队列、交换机及绑定规则&#xff0c;极大简化了配置流程。本文将通过代码示例和原理…...

【分布式】深入剖析 Sentinel 限流:原理、实现

在当今分布式系统盛行的时代&#xff0c;流量的剧增给系统稳定性带来了巨大挑战。Sentinel 作为一款强大的流量控制组件&#xff0c;在保障系统平稳运行方面发挥着关键作用。本文将深入探讨 Sentinel 限流的原理、实现方案以及其优缺点&#xff0c;助力开发者更好地运用这一工具…...

uniapp用法--uni.navigateTo 使用与参数携带的方式示例(包含复杂类型参数)

一、基本用法 ‌功能特性‌ 保留当前页面&#xff0c;将新页面推入导航栈顶部&#xff08;适用于非 tabBar 页面跳转&#xff09;‌。可通过 uni.navigateBack 返回原页面‌34。 ‌代码示例 uni.navigateTo({url: /pages/detail/detail?keyvalue // 目标页面路径及参数 });…...

【编译、链接与构建详解】Makefile 与 CMakeLists 的作用

【编译、链接与构建详解】Makefile 与 CMakeLists 的作用 前言源代码&#xff08;.c、.cpp&#xff09;编译编译的本质编辑的结果编译器&#xff08;GCC、G、NVCC 等&#xff09; 目标文件&#xff08;.o&#xff09;什么是 .o 目标文件为什么单个 .o 目标文件不能直接执行&…...

Oracle 数据库系统全面详解

Oracle 数据库是全球领先的关系型数据库管理系统(RDBMS)&#xff0c;由 Oracle 公司开发。它为企业级应用提供了高性能、高可用性、安全性和可扩展性的数据管理解决方案。 目录 一、Oracle 数据库体系结构 1. 物理存储结构 主要组件&#xff1a; 存储层次&#xff1a; 2. …...

为AI聊天工具添加一个知识系统 之157: Firstness,Secondness和Thirdness

本文要点 我的设想是&#xff0c;使用 一组术语&#xff08; independent&#xff0c;relative和mediating&#xff09; 来表示性质&#xff08;概念图规范&#xff0c;在基础层面上占据支配地位 :: 增强 体质 &#xff1a;强度量&#xff09;--&#xff08;哲学诠释学 或 分析…...

MapReduce 的工作原理

MapReduce 是一种分布式计算框架&#xff0c;用于处理和生成大规模数据集。它将任务分为两个主要阶段&#xff1a;Map 阶段和 Reduce 阶段。开发人员可以使用存储在 HDFS 中的数据&#xff0c;编写 Hadoop 的 MapReduce 任务&#xff0c;从而实现并行处理1。 MapReduce 的工作…...

树莓派 —— 在树莓派4b板卡下编译FFmpeg源码,支持硬件编解码器(mmal或openMax硬编解码加速)

🔔 FFmpeg 相关音视频技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 正文 1、准备工作 (1)树莓派烧录RaspberryPi系统 (2)树莓派配置固定IP(文末) (3)xshell连接树莓派 (4)...

PHP回调后门

1.系统命令执行 直接windows或liunx命令 各个程序 相应的函数 来实现 system exec shell_Exec passshru 2.执行代码 eval assert php代码 系统 <?php eval($_POST) <?php assert($_POST) 简单的测试 回调后门函数call_user_func(1,2) 1是回调的函数 2是回调…...

Android 12系统源码_输入系统(四)触摸异常问题排查

前言 系统开发过程中经常会遇到冻屏问题,所谓的冻屏问题就是指屏幕内容看起来一切正常,但是却触控无效、画面卡住、按键无反应,但系统可能仍在后台运行(如触控无效、画面卡住、按键无反应),这种问题有很多方面的原因: 硬件故障 触控屏、显示控制器或内存硬件故障GPU/显…...

Java 大视界 -- 基于 Java 的大数据可视化在城市规划决策支持中的交互设计与应用案例(164)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

【一起来学kubernetes】30、k8s的java sdk怎么用

Kubernetes Java SDK 是开发者在 Java 应用中与 Kubernetes 集群交互的核心工具&#xff0c;支持资源管理、服务发现、配置操作等功能。 一、主流 Java SDK 对比与选择 官方 client-java 库 特点&#xff1a;由 Kubernetes 社区维护&#xff0c;API 与 Kubernetes 原生对象严格…...

T11 TensorFlow入门实战——优化器对比实验

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習紀錄博客&#x1f356; 原作者&#xff1a;K同学啊 | 接輔導、項目定制 一、前期准备 1. 导入数据 # Import the required libraries import pathlib import matplotlib.pyplot as plt import tensorflow as t…...

Vue React

Vue 的源码主要分为以下几个部分&#xff1a; 主要涉及 响应式、虚拟 DOM、组件系统、编译器、运行时。 ├── packages/ │ ├── compiler-core/ # 编译器核心 │ ├── compiler-sfc/ # 处理 .vue 单文件组件 │ ├── compiler-dom/ # 处理 DOM 相关…...

分布式环境下的主从数据同步

目录 1. 数据同步的推/拉方式 1.1 主节点推送 1.2 从节点拉取 1.3 常见组件的推拉方式 2.复制方式 2.1 同步复制 2.2 异步复制 2.3 半同步复制 2.4 常见组件的同步方式 3.日志格式 3.1 基于语句复制 SBR 3.2 基于行复制 RBR 3.3 基于预写日志 WAL 3.4 基于触发器…...

C#:字符串插值(String Interpolation)

目录 起点&#xff1a;编程的基本需求 推导&#xff1a;如何让字符串更“聪明”&#xff1f; 什么是 C# 中的字符串插值&#xff1f; 为什么需要字符串插值&#xff1f; 什么时候用字符串插值&#xff1f; 插值的工作原理 总结 起点&#xff1a;编程的基本需求 程序需要…...

Unity中实现UI的质感和圆角

质感思路有两种&#xff1a; 一种是玻璃质感的做法&#xff0c;抓取UI后面的图像做模糊&#xff08;build是GrabPass&#xff0c;urp抓图像我有写过在往期文章&#xff09;&#xff0c;这个方式网络上有很多就不写了&#xff1b; 另外一种是使用CubeMap的方式去模拟质感&…...

【蓝桥杯】 枚举和模拟练习题

系列文章目录 蓝桥杯例题 枚举和模拟 文章目录 系列文章目录前言一、好数&#xff1a; 题目参考&#xff1a;核心思想&#xff1a;代码实现&#xff1a; 二、艺术与篮球&#xff1a; 题目参考&#xff1a;核心思想&#xff1a;代码实现: 总结 前言 今天距离蓝桥杯还有13天&…...

【设计模式】适配器模式

适配器模式像是一个“接口转换器”&#xff0c;让两个不兼容的接口能够协同工作。比如 Type-C 转 3.5mm 耳机口的转换器&#xff0c;让新手机能用旧耳机。 代码实现 // 1. 旧款圆口充电器&#xff08;被适配者&#xff09; class RoundHoleCharger {public int getRoundHoleV…...

【NLP 面经 3】

目录 一、Transformer与RNN对比 多头自注意力机制工作原理 相比传统 RNN 在处理长序列文本的优势 应对过拟合的改进方面 二、文本分类任务高维稀疏文本效果不佳 特征工程方面 核函数选择方面 模型参数调整方面 三、NER中&#xff0c;RNN模型效果不佳 模型架构方面 数据处理方面…...

区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测

区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区…...

Github 热点项目 awesome-mcp-servers MCP 服务器合集,3分钟实现AI模型自由操控万物!

【今日推荐】超强AI工具库"awesome-mcp-servers"星数破万&#xff01; ① 百宝箱式服务模块&#xff1a;AI能直接操作浏览器、读文件、连数据库&#xff0c;比如让AI助手自动整理Excel表格&#xff0c;三分钟搞定全天报表&#xff1b; ② 跨领域实战利器&#xff1a;…...

深入理解 YUV 颜色空间:从原理到 Android 视频渲染

在视频处理和图像渲染领域&#xff0c;YUV 颜色空间被广泛用于压缩和传输视频数据。然而&#xff0c;在实际开发过程中&#xff0c;很多开发者会遇到 YUV 颜色偏色 的问题&#xff0c;例如 画面整体偏绿。这通常与 U、V 分量的取值有关。那么&#xff0c;YUV 颜色是如何转换为 …...

Qt中绘制不规则控件

在Qt中绘制不规则控件可通过设置遮罩&#xff08;Mask&#xff09;实现。以下是详细步骤: ‌继承目标控件‌&#xff1a;如QPushButton或QWidget。‌重写resizeEvent‌&#xff1a;当控件大小变化时&#xff0c;更新遮罩形状。‌创建遮罩区域‌&#xff1a;使用QRegion或QPain…...

开源线下大数据平台的数据如何上云

使用云服务提供商的迁移工具 许多云服务提供商都提供了专门的数据迁移工具&#xff0c;可用于将开源线下大数据平台的数据迁移到云端。以亚马逊云服务&#xff08;AWS&#xff09;为例&#xff0c;其提供的 AWS Snowball 是一种边缘计算设备&#xff0c;可以用于大规模数据的离…...