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

JVM内存模型深度解剖:分代策略、元空间与GC调优实战

堆是Java虚拟机(JVM)内存管理的核心区域,其物理存储可能分散于不同内存页,但逻辑上被视为连续的线性空间。作为JVM启动时创建的第一个内存区域,堆承载着几乎所有的对象实例和数组对象(极少数通过逃逸分析优化至栈上分配的除外)。

内存细分

Java 7及之前版本

内存结构​:新生代(Young Generation)、老年代(Old Generation)、永久代(PermGen)


Java 8及之后版本

内存结构​:新生代(Young Generation)、老年代(Old Generation)、元空间(Metaspace)

新生代和老年代

一、堆内存基础参数
  1. ​-Xms
    设置堆内存初始分配大小。建议与-Xmx保持一致,避免运行时堆容量动态调整带来的性能损耗。

    示例:-Xms4g 表示初始分配4GB堆内存。
  2. ​-Xmx
    定义堆内存最大可扩展阈值。


二、堆内存代际划分

堆内存分为新生代(Young Generation)​老年代(Old Generation)​,采用分代回收策略优化性能:

  • 新生代​:存放短生命周期对象(约80%对象在此区域被回收)。
  • 老年代​:存放长期存活对象(部分对象生命周期与JVM进程一致)。

代际比例控制

  • ​-XX:NewRatio
    定义老年代与新生代的内存比例(默认值2:1)。例如,-XX:NewRatio=3表示老年代占75%,新生代占25%。
    调优建议:短生命周期对象多的应用可增大新生代比例,减少老年代GC压力。

三、新生代内部结构

新生代进一步细分为三个区域:

  1. Eden区
    新创建对象默认分配至此区域。
  2. Survivor区(From/To)​
    存放Eden区GC后存活的对象,两个Survivor区交替使用。

Survivor区比例控制

  • ​-XX:SurvivorRatio
    定义Eden区与单个Survivor区的比例(默认8:1:1)。例如,Eden区占80%,每个Survivor区占10%。

四、新生代独立配置
  • ​-Xmn
    直接指定新生代内存大小(覆盖-XX:NewRatio配置)。例如,-Xmn2g强制新生代占2GB,老年代占剩余堆空间。
    注意事项:需确保总堆内存(-Xmx)足够容纳新生代与老年代之和。

对象分配过程

新创建的对象通常分配在Eden区。当Eden区空间不足时,会触发Minor GC​(新生代垃圾回收),此时:

  1. 回收未被引用的对象(即垃圾对象)
  2. 将存活对象复制到Survivor From区(S0)​
  3. 清空Eden区

当Eden区再次空间不足时​:

  1. 触发第二次Minor GC
  2. 回收Eden区和Survivor From区(S0)的存活对象
  3. 将存活对象复制到Survivor To区(S1)​
  4. 清空Eden区和Survivor From区(S0)

后续空间不足时的处理​:

  1. 第三次Eden区不足时触发Minor GC
  2. 回收Eden区和Survivor To区(S1)的存活对象
  3. 将存活对象复制回Survivor From区(S0)
  4. 清空Eden区和Survivor To区(S1)

Survivor区的角色轮换​:

  • Survivor From和To区通过复制算法实现角色互换
  • 空闲的Survivor区作为目标区(To区)
  • 存活对象通过Eden区+当前From区→To区的方式转移

对象晋升机制​:

  • 每次Minor GC后,存活对象的年龄(经历GC次数)+1
  • 当年龄达到​-XX:MaxTenuringThreshold​(默认15)时
  • 对象晋升至老年代(Tenured Generation)​

内存区域特性​:

区域回收频率主要算法典型问题
新生代高频复制算法Eden区快速填满
老年代低频标记-清除/整理Full GC导致应用停顿
元空间极低频无(直接分配)类元数据溢出(OOM)

对象内存分配遵循以下流程:

  1. 内存分配优先级

    • 应用程序首先尝试在Eden区分配对象
    • 若Eden区空间充足则直接完成分配
    • 当Eden区空间不足时触发Minor GC
  2. Young Generation回收机制

    • 执行Minor GC时,存活对象会从Eden区和From Survivor区复制到To Survivor区
    • 若对象年龄超过晋升阈值(默认15次),则直接晋升至老年代
    • 若To Survivor区空间不足,存活对象将直接晋升至老年代
  3. 老年代分配策略

    • 经过Minor GC后仍需分配的对象将尝试进入老年代
    • 若老年代空间充足则完成分配
    • 老年代空间不足时触发Major GC(Full GC)
  4. 容错机制

    • Major GC执行后若仍无法满足内存需求,则抛出OutOfMemoryError

垃圾回收器分类与触发机制详解

一、垃圾回收器分类体系
部分回收器类型


(1) 新生代回收器(Minor GC)

  • 回收范围:Eden区+S0/S1 Survivor区
  • 典型场景:Eden区满时触发,采用复制算法

(2) 老年代回收器(Major GC)

  • 回收范围:老年代完整空间
  • 触发条件:晋升对象超过老年代剩余空间

(3) 混合回收器(Mixed GC)

  • 回收范围:新生代+部分老年代

整堆回收器(Full GC)
  • 回收范围:新生代+老年代+元空间
二、触发机制深度解析
垃圾回收器触发机制详解

一、新生代回收器(Minor GC)触发条件

  1. 核心触发条件

    • 伊甸区空间耗尽​:当Eden区100%被占满时强制触发
  2. 执行过程特性

    • 采用复制算法​:将存活对象从Eden+From区复制到To区
    • 空间交换机制​:复制完成后,Eden和From区清空,To区变为新的From区
    • 强制STW​:整个回收过程会暂停所有应用线程(Stop The World)
  3. 特殊场景

    • 分配担保失败​:若Survivor区无法容纳存活对象,且老年代剩余空间不足晋升总量时触发Full GC

二、老年代回收器(Major GC)触发条件

直接触发条件

  • 老年代空间不足​:对象从Survivor区晋升时发现老年代剩余空间不足
  • 显式内存分配失败​:大对象(如数组)直接申请老年代空间失败

三、Full GC触发条件

  1. 堆内存危机

    • 老年代空间不足
    • 元空间/方法区溢出
  2. 空间分配异常

    • Eden转老年代失败​:Minor GC时Survivor区无法容纳存活对象,且老年代剩余空间 < 待转移对象大小
    • 跨代对象过大
  3. 主动触发机制

    • System.gc()调用

为什么要对堆内存进行分代?不分代是否无法工作?​

对堆内存进行分代的核心目的是优化垃圾回收(GC)性能。虽然理论上堆内存可以不分代运作,但分代策略通过生命周期差异化管理显著提升了效率。根据统计,70%-99%的对象属于临时对象​(即"朝生夕死"),若每次GC都需要全堆扫描,将产生巨大的性能损耗。

实践验证
主流JVM(如HotSpot)均采用分代策略,其设计验证了理论优势:

  • 98%的GC时间集中在新生代回收(Minor GC)
  • 老年代GC频率可控制在每小时1次以内(取决于应用特性)

为对象分配内存:TLAB

为什么需要TLAB?

在多线程环境下,对象内存分配可能引发线程安全问题(如多个线程同时操作同一内存区域)。若通过全局加锁机制保证线程安全,会显著降低内存分配效率。TLAB(Thread-Local Allocation Buffer)通过为每个线程划分独立的内存区域,实现无锁化分配,​减少线程竞争并提升吞吐量

什么是TLAB?

TLAB是JVM针对堆内存(Eden区)​设计的一种快速分配策略,其核心目标是优化多线程环境下的对象分配效率。

TLAB的工作机制
  1. 分配优先级​:对象分配首选当前线程的TLAB空间。
  2. 空间管理​:
    • 默认占Eden区1%空间,通过-XX:TLABWasteTargetPercent调节目标占比。
  3. 失败处理​:TLAB分配失败时,需对Eden区加锁并进行GC或大对象分配。

JVM堆空间核心参数详解

  1. ​-XX:+PrintFlagsInitial
    打印所有JVM参数的初始默认值。

  2. ​-XX:+PrintFlagsFinal
    显示所有参数的最终生效值(包含通过命令行或配置文件修改后的值),。

  3. ​-Xmx
    设置堆空间最大内存(如-Xmx4g)。建议与-Xms设为相同值,避免堆内存动态扩展引发的性能波动。若物理内存充足,最大堆不超过系统可用内存的80%。

  4. ​-Xmn
    指定新生代固定大小(如-Xmn2g)。官方推荐值为堆空间的1/3到1/2,过大会压缩老年代空间,增加Full GC频率;过小则导致频繁Minor GC。动态调整场景建议改用-XX:NewRatio

  5. ​-XX:NewRatio
    老年代与新生代比例(默认-XX:NewRatio=2即1:2)。设置为4时,新生代占堆1/5,老年代4/5。与-Xmn冲突时以-Xmn优先。

  6. ​-Xms
    堆初始内存(如-Xms4g)。生产环境建议等于-Xmx,消除堆扩容引发的停顿。突发流量场景可预留扩容空间,如-Xms2g -Xmx4g

  7. ​-XX:MaxTenuringThreshold
    对象晋升老年代的年龄阈值(默认15)。若设为10,对象在Survivor区经历10次GC后进入老年代。调低可加速回收短期对象,但可能引发过早晋升;调高会增加Survivor区压力

  8. ​-XX:SurvivorRatio
    控制Eden区与单个Survivor区的比例(默认-XX:SurvivorRatio=8即Eden:S0:S1=8:1:1)。设置为4时,Eden:S0:S1=4:1:1。建议根据对象存活率调整,高存活率应用可增大Survivor

  9. ​-XX:HandlePromotionFailure
    JDK 6 Update 24(小版本)后已废弃。原用于担保失败时强制Full GC。

逃逸分析与对象分配策略

一、对象分配的选择演进

传统认知中,Java对象均在堆内存分配。随着JIT编译器与逃逸分析技术成熟,​栈上分配标量替换打破了这一绝对性,使得对象分配策略呈现更精细化特征。


二、逃逸分析技术原理
  1. 核心机制
    通过动态作用域分析判断对象生命周期:

    • 未逃逸对象​:作用域严格限定在方法内部(未通过参数传递、返回值或成员变量暴露)
    • 逃逸对象​:发生方法逃逸(跨方法引用)或线程逃逸(多线程可见性)
  2. 技术优势
    识别未逃逸对象后,可触发三级优化:

    • 栈上分配​:对象随栈帧出栈自动销毁,规避堆内存分配与GC开销
    • 同步消除​:单线程访问对象时移除无必要的同步锁
    • 标量替换​:将聚合对象拆解为基本类型变量(标量),直接在栈/寄存器分配

三、优化策略实现细节
  1. 栈上分配条件

    • 对象大小需适配栈容量(通常限制在几十KB)
    • HotSpot实际通过标量替换模拟栈分配,未直接实现物理栈分配
  2. 同步锁消除案例

    void method() {Object lock = new Object(); synchronized(lock) { // 锁对象未逃逸,同步块被JIT移除System.out.println(lock);}
    }
  3. 标量替换过程
    原始代码:

    User user = new User(25);
    int age = user.age;

    优化后等效:

    int age = 25; // 直接使用基本类型

四、技术局限性
  1. 成熟度限制
    逃逸分析自1999年论文提出至今仍存在局限:

    • 分析过程消耗CPU资源,可能抵消优化收益
    • 极端场景下若无逃逸对象,分析成为冗余操作
  2. 堆分配主导地位
    因HotSpot未完全实现物理栈分配,且字符串常量池(JDK7+)、TLAB机制仍依赖堆空间,当前对象分配仍以堆为主。


五、开发实践建议
  1. 作用域最小化

    • 优先使用局部变量而非成员变量
    • 避免通过返回值暴露内部对象(采用不可变拷贝)
  2. 参数配置建议

    -XX:+DoEscapeAnalysis  # 开启逃逸分析(默认启用)
    -XX:+EliminateAllocations # 启用标量替换 

结论

逃逸分析为JVM提供了一种"条件式堆外分配"能力,但受技术成熟度与实现策略影响,现阶段「对象全量堆分配」的认知仍需作为基础原则。

方法区

Java运行时数据区结构解析

内存区域划分

Java虚拟机运行时数据区可分为线程私有线程共享两大类别:

线程私有区域

  • 虚拟机栈(Java Virtual Machine Stack)​
    存储方法调用的栈帧(局部变量表、操作数栈等),深度超过限制时抛出StackOverflowError
  • 本地方法栈(Native Method Stack)​
    服务于Native方法调用,异常机制同虚拟机栈。
  • 程序计数器(Program Counter Register)​
    记录当前线程执行的字节码指令地址,无内存溢出问题。

线程共享区域

  • 堆(Heap)​
    存放对象实例,内存不足时抛出OutOfMemoryError
  • 方法区(Method Area)​
    存储类结构信息(类型、字段、方法等),部分虚拟机实现可能在此区域抛出OutOfMemoryError
内存交互示例

以代码User user = new User();为例:

  1. 方法区​:加载User.class的类元数据(如字段描述、方法字节码等)。
  2. 虚拟机栈​:声明user局部变量,存储指向堆对象的引用。
  3. ​:分配User实例对象内存空间,内含指向方法区类元数据的指针。

方法区与堆的关系及特性

根据Java虚拟机规范定义,方法区在逻辑层面上属于堆的一部分,允许执行部分垃圾回收行为,但回收条件通常较为严格且触发频率较低。值得注意的是,在HotSpot虚拟机的具体实现中,方法区被独立划分为"非堆(Non-Heap)"内存空间,这使得它在物理存储层面与堆形成了明确的分隔。

核心特性解析:

  1. 内存共享机制
    方法区与堆同属于线程共享的内存区域

  2. 物理空间特性
    两者的物理内存分配均不要求绝对连续性

  3. 容量管理机制
    当存储的对象元数据或类信息超过预设阈值时,方法区会遵循与堆相似的内存扩展策略:根据虚拟机配置选择是否自动扩容。当内存耗尽时将触发特定异常:

  • JDK7及更早版本:抛出永久代(PermGen)内存溢出的OutOfMemoryError
  • JDK8及后续版本:抛出元空间(Metaspace)内存溢出的OutOfMemoryError

设置方法区内存参数

-XX:MetaspaceSize 设置元空间的初始内存阈值
-XX:MaxMetaspaceSize设置元空间的最大内存上限

平台依赖说明:
不同平台默认值存在差异,在Windows 64位环境下,默认初始值为21M(实际为20.8MB四舍五入),最大值为-1表示无限制(允许使用全部可用系统内存)。

GC触发机制:
当元空间内存使用达到MetaspaceSize设定值时,会触发Full GC进行元数据回收。该阈值被称为初始高水位线(High Water Mark)。

水位线动态调整规则:

  1. 若Full GC后回收空间不足,JVM会自动提升高水位线(不超过MaxMetaspaceSize)
  2. 若回收大量空间(如类加载器被卸载),高水位线会适当降低

与永久代的差异:
永久代(Java 8前)要求显式设置最大空间(-XX:MaxPermSize),而元空间采用更智能的自动扩容机制。建议生产环境始终设置MaxMetaspaceSize防止内存泄漏导致系统崩溃。

相关文章:

JVM内存模型深度解剖:分代策略、元空间与GC调优实战

堆 堆是Java虚拟机&#xff08;JVM&#xff09;内存管理的核心区域&#xff0c;其物理存储可能分散于不同内存页&#xff0c;但逻辑上被视为连续的线性空间。作为JVM启动时创建的第一个内存区域&#xff0c;堆承载着几乎所有的对象实例和数组对象&#xff08;极少数通过逃逸分…...

Unity_JK框架【1】 框架导入 对象池示例 (资源管理底层)

一、JK框架介绍 主要功能系统&#xff1a; 对象池系统&#xff1a;重复利用GameObject或普通class实例&#xff0c;并且支持设置对象池容量 事件系统&#xff1a;解耦工具&#xff0c;不需要持有引用来进行函数的调用 资源系统 Resources版本&#xff1a;关联对象池进行资源…...

JDK 发展历史及其版本特性

JDK&#xff08;Java Development Kit&#xff0c;Java开发工具包&#xff09;是用于开发Java应用程序的核心工具之一。它由Oracle&#xff08;最初由Sun Microsystems&#xff09;提供&#xff0c;包含了Java编译器、Java运行环境&#xff08;JRE&#xff09;、Java标准类库等…...

B站视频下载到电脑的方法总结

将B站&#xff08;哔哩哔哩&#xff09;视频下载到电脑的方法有多种&#xff0c;以下是几种常见且有效的方法&#xff0c;分为 官方工具 和 第三方工具 两类&#xff1a; 一、官方方法&#xff08;B站客户端或功能&#xff09; 哔哩哔哩客户端&#xff08;UWP/PC版&#xff09;…...

2025 后端自学UNIAPP【项目实战:旅游项目】2、安装下载引用前端UI框架:uview-plus

1、uview-plus官网地址&#xff0c;有详细介绍&#xff0c;感兴趣的可以深入了解学习 介绍 | uview-plus - 全面兼容nvue/鸿蒙/uni-app-x的uni-app生态框架 - uni-app UI框架 2、Hbuilder X 方式安装下载引入uview-plus ①进入该网址&#xff0c;点击 下载插件并导入Hbuild…...

Vue 的双向绑定原理,Vue2 和 Vue3 双向绑定原理的区别

Vue 的双向绑定原理&#xff0c;Vue2 和 Vue3 双向绑定原理的区别 Vue 的双向绑定&#xff08;Two-way Data Binding&#xff09;是其核心特性之一&#xff0c;其本质是通过数据劫持结合发布-订阅模式实现的。以下是 Vue2 和 Vue3 在双向绑定原理上的区别和演进&#xff1a; 文…...

RAG_Techniques:探索GitHub热门RAG技术开源项目

RAG_Techniques&#xff1a;探索GitHub热门RAG技术开源项目 引言项目概述RAG技术简介与重要性核心功能详解1. 分类清晰的技术体系2. 前沿技术解析3. 评估工具与方法 安装和使用教程应用场景和实际价值企业知识库和文档检索教育和研究辅助个性化内容推荐 结论 引言 在当今AI领域…...

Java高频面试之并发编程-12

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;详细说说java的内存模型 Java内存模型&#xff08;Java Memory Model, JMM&#xff09;是Java多线程编程的核心&#…...

多线程系列五:面试中常考的单例模式

1.设计模式 在了解单例模式之前我们先要了解设计模式&#xff1a; 设计模式是一种软性规定&#xff0c;遵守了设计模式&#xff0c;代码的下限就被兜住了&#xff0c;类似于棋谱&#xff0c;是大佬设计出来的&#xff0c;让小白程序员也能写出好的代码 设计模式有很多种&#x…...

音视频之H.265/HEVC编解码并处理

H.265/HEVC系列文章&#xff1a; 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...

Python入门(一)

目录 一、Python数据类型 1.字面量 2.注释 3.变量 4.数据类型 二、 运算符 1.数据类型之间的相互转换 2 算数运算符 3、逻辑运算符 三、判断语句 if 四、循环 1、while循环 2、for循环 2.1 for...else... 五、格式化字符串 1.字符串 1.1创建字符串的方式&…...

2025年01月09日德美医疗前端面试

目录 vue2 的双向绑定的原理vue3 的双向绑定原理vue 的生命周期vue 子组件为何不能修改父组件的值js delete 删除数组的某一个值会怎么样vue 和 react 的 diff 算法什么是闭包原型链this指向 vue2 的双向绑定的原理 以下是 Vue 2 双向绑定的原理&#xff1a; 1. 核心概念 …...

02 mysql 管理(Windows版)

一、启动及关闭 MySQL 服务器 1.1 通过 “服务” 管理工具 winr打开运行&#xff0c;输入services.msc 找到MySQL80&#xff0c;这个是我们在安装mysql的时候给的服务的名称&#xff0c;具体见文章mysql 安装 右键选择启动或者停止。 1.2 通过命令提示符 1.2.1 关闭命令…...

开发搭载OneNet平台的物联网数据收发APP的设计与实现

一、开发环境与工具准备 工具安装 下载HBuilderX开发版(推荐使用开发版以避免插件兼容性问题)安装Node.js和npm(用于依赖管理及打包)配置Android Studio(本地打包需集成离线SDK)项目初始化 创建uni-app项目,选择“默认模板”或“空白模板”安装必要的UI库(如uView或Van…...

ntdll!LdrpInitializeProcess函数分析之Peb->Ldr和全局变量ntdll!PebLdr的关系

代码部分A&#xff1a; PEB_LDR_DATA PebLdr; //全局变量ntdll!PebLdr NTSTATUS LdrpInitializeProcess ( IN PCONTEXT Context OPTIONAL, IN PVOID SystemDllBase ) { 代码部分B&#xff1a; // // Figure out process name. // Teb NtCurrentTeb…...

如何开始使用 Blender:Blender 3D 初学者指南和简介 怎么下载格式模型

Blender 是一个强大的 3D 创作套件&#xff0c;为动画、视觉效果、艺术等提供了一系列功能。无论您是初学者还是经验丰富的艺术家&#xff0c;Blender 都提供了一个免费的开源平台来释放您的创造力。凭借其内置的视频序列编辑器&#xff0c;Blender 还提供基本的编辑功能&#…...

Nginx安全防护与HTTPS部署

目录 一、Nginx 概述 二、Nginx 核心安全配置 &#xff08;一&#xff09;编译安装 Nginx &#xff08;二&#xff09;隐藏版本号 &#xff08;三&#xff09;限制危险请求方法 &#xff08;四&#xff09;请求限制&#xff08;CC 攻击防御&#xff09; &#xff08;五&…...

HTTP 与 HTTPS 的深度剖析:差异、原理与应用场景

HTTP 与 HTTPS 的深度剖析&#xff1a;差异、原理与应用场景 在互联网的世界里&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;和 HTTPS&#xff08;超文本传输安全协议&#xff09;是数据传输的 “高速公路”&#xff0c;它们承载着我们日常浏览网页、购物支付等各种…...

SMT贴片钢网精密设计与制造要点解析

内容概要 SMT贴片钢网作为电子组装工艺的核心载体&#xff0c;其设计与制造质量直接影响焊膏印刷精度及产品良率。本文系统梳理了钢网全生命周期中的15项关键技术指标&#xff0c;从材料选择、结构设计到工艺控制构建完整技术框架。核心要点涵盖激光切割精度的微米级调控、开口…...

算法每日一题 | 入门-顺序结构-三角形面积

三角形面积 题目描述 一个三角形的三边长分别是 a、b、c&#xff0c;那么它的面积为 p ( p − a ) ( p − b ) ( p − c ) \sqrt{p(p-a)(p-b)(p-c)} p(p−a)(p−b)(p−c) ​&#xff0c;其中 p 1 2 ( a b c ) p\frac{1}{2}(abc) p21​(abc) 。输入这三个数字&#xff0c;…...

Linux内核视角:线程同步与互斥的原理、实现与锁优化策略

Linux系列 文章目录 Linux系列前言一、前提知识二、线程互斥概念引入三、线程互斥3.1 什么是线程的互斥3.2 线程互斥的实现 四、锁的实现原理 前言 在前两篇文章中&#xff0c;我们已经对线程的相关概念及基本操作进行了深入介绍。在本篇中&#xff0c;我们将深入探讨编写多线…...

【区块链】Uniswap详细介绍

一、前言 本文将结合网上的资料和博主的理解&#xff0c;像大家详细介绍Uniswap&#xff0c;包括其核心概念、工作原理、版本演进、代币经济学以及风险点&#xff0c;适合想深入了解去中心化交易所&#xff08;DEX&#xff09;机制的用户。 二、Uniswap是什么 Uniswap 是一个…...

YOLOv8的Python基础--函数篇

1. 文件/目录操作相关函数 这些函数来自 os 和 shutil 模块&#xff1a; 函数/用法作用示例说明os.listdir(dir)列出目录下所有文件名os.listdir("./images")返回文件名列表&#xff08;不包含路径&#xff09;os.path.join()拼接路径os.path.join("dir"…...

vue源代码采用的设计模式分解

No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…...

强化学习是AI Agent的进化引擎还是技术枷锁呢?

第一章 强化学习&#xff1a;Agent的“灵魂”觉醒之路 1.1 AlphaGo的启示&#xff1a;从规则到目标驱动的范式革命 2016年AlphaGo击败李世石的事件&#xff0c;标志着RL首次在复杂决策场景中展现其颠覆性价值。通过深度神经网络与RL的结合&#xff0c;AlphaGo无需依赖人类棋谱…...

python简易实现勒索病毒

python简易实现勒索病毒 1.首先介绍Crypto库1.1首先是对称加密1.2 非对称加密1.3 哈希 2.生成RSA密钥并保存3.文件加密4.文件解密1. 导入必要的模块2. 定义解密函数3. 设置私钥的密码4. 打开并读取文件5. 导入私钥6. 读取加密数据7. 解密会话密钥8. 创建 AES 解密器9. 解密数据…...

Nacos源码—4.Nacos集群高可用分析三

大纲 6.CAP原则与Raft协议 7.Nacos实现的Raft协议是如何写入数据的 8.Nacos实现的Raft协议是如何选举Leader节点的 9.Nacos实现的Raft协议是如何同步数据的 10.Nacos如何实现Raft协议的简版总结 6.CAP原则与Raft协议 (1)CAP分别指的是什么 (2)什么是分区以及容错 (3)为…...

AWS WebRTC如何实现拉流?内部是这样实现的

当我们通过手机上的app选择某一个Iot设备,例如,摄像头,想看实时视频的时候,aws都做了什么?最近在搞自研Iot项目,借机整理一下相关流程。 App通过 AWS SDK 发起拉流请求的内部机制是AWS Kinesis Video Streams (KVS) WebRTC 模式中一个非常关键的问题。 一、KVS WebRTC …...

NGINX `ngx_http_browser_module` 深度解析与实战

1. 模块定位 ngx_http_browser_module 在 HTTP 头 User-Agent 解析的基础上&#xff0c;给出三个内置变量&#xff1a; 变量作用典型值$modern_browser当 UA 被判定为 现代浏览器 时取 modern_browser_value 指定的值&#xff1b;否则为空modern. / 1$ancient_browser当 UA 被…...

Elasticsearch知识汇总之 ElasticSearch高可用方案

六 ElasticSearch高可用方案 6.1 高可用架构 请求协调节点根据负载均衡&#xff0c;转发给主分片节点&#xff0c;主分片同步复制给从节点&#xff0c;主从节点都写入完成返回客户端请求成功。对于读请求&#xff0c;协调负载到任意节点数据节点&#xff0c;数据节点把各自符合…...

多线程2-多线程编程

引入 当我们想要代码能够实现并发执行时&#xff0c;我们可以使用多进程进行并发编程&#xff08;在Java中并不推荐这种方式&#xff0c;许多API在Java标准库中都没有提供&#xff09;&#xff0c;也可以使用多线程进行并发编程&#xff08;系统提供了相关的API&#xff0c;Ja…...

电商系统中单商户和多商户的区别

在电商的商业版图上&#xff0c;单商户与多商户模式如同两条并行的发展脉络&#xff0c;各自构建起独特的商业生态。它们在运营逻辑、商业模式等多方面存在显著差异&#xff0c;这些差异不仅塑造了不同的平台特性&#xff0c;也深刻影响着企业的发展路径。接下来&#xff0c;我…...

【东枫科技】代理英伟达产品:智能网卡的连接线

文章目录 总览详细&#xff1a;NVIDIA 400Gb/s QSFP-DD 线缆详细&#xff1a;NVIDIA 400Gb/s OSFP 线缆详细&#xff1a;NVIDIA 200Gb/s QSFP56 线缆详细&#xff1a;NVIDIA 100Gb/s QSFP28 线缆 总览 详细&#xff1a;NVIDIA 400Gb/s QSFP-DD 线缆 详细&#xff1a;NVIDIA 400…...

使用ip池后,爬虫还被封,是什么原因呢?

嘿&#xff0c;亲爱的小伙伴们&#xff01;今天我们聊一个让很多爬虫工程师抓狂的问题&#xff1a;明明用上了IP池&#xff0c;结果爬虫还是被封了&#xff01;怎么回事呢&#xff1f;如果你也曾在爬虫与反爬的“猫鼠游戏”里痛苦“翻车”&#xff0c;别着急&#xff0c;这篇文…...

C++23 新利器:深入解析栈踪迹库 (P0881R7)

文章目录 为何需要标准化的栈踪迹&#xff1f;P0881R7 的核心组件与使用基本用法示例与异常处理的集成优势与价值潜在的考量总结 对于 C 开发者而言&#xff0c;调试和错误诊断一直是开发周期中不可或缺但又充满挑战的一环。当程序崩溃或发生未预期行为时&#xff0c;获取清晰、…...

2025-05-06 事业-独立开发项目-记录

摘要: 2025-05-06 事业-独立开发项目-记录 独立开发项目记录 Product Hunt | InDev 独立开发者导航站https://www.producthunt.com/ Nomads.com - Best Places to Live for Digital Nomads (formerly Nomad List)https://nomads.com/ InDev 独立开发者导航站https://indev.bei…...

【Linux系统】探索进程等待与程序替换的奥秘

文章目录 前言一、重谈进程创建1.1 fork 函数1.2 写时拷贝1.3 fork 的常规用法1.4 fork 调用失败的原因1.5 创建一批进程 二、进程终止2.1 进程退出场景2.2 strerror 函数的作用2.3 errno 全局变量2.4 程序异常机制2.5 进程退出方式 三、进程等待3.1 进程等待必要性3.2 进程等待…...

Github 2025-05-06Python开源项目日报 Top10

根据Github Trendings的统计,今日(2025-05-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10C++项目2TypeScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…...

【愚公系列】《Manus极简入门》021-音乐创作助手:“音符魔术师”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…...

【Azure Redis】Redis导入备份文件(RDB)失败的原因

问题描述 在测试Azure Redis的导入/导出备份文件的功能中&#xff0c;突然发现在Redis 4.0上导入的时候&#xff0c;一直报错。 image.png 问题解答 因为门户上只是显示导入失败&#xff0c;没有任何错误消息说明。根据常理推断&#xff0c;Redis 的RDB文件格式都具有一致性。居…...

git “分离头指针”(detached HEAD) 状态。

在 Git 中&#xff0c;当你运行 git branch 命令时&#xff0c;看到如下输出&#xff1a; * (detached from 5b596b5)master 其中的&#xff1a; * (detached from 5b596b5) 表示你当前处于 “分离头指针”&#xff08;detached HEAD&#xff09; 状态。 &#x1f9e0; 什…...

Gitee的介绍

目录 1.Gitee介绍&#xff1a; 1.1 代码托管 1.2 本土化优势 1.3 企业级服务 1.4 开源生态 1.5 多形态适配 定位&#xff1a;国内开发者首选的高效代码协作平台&#xff0c;兼顾个人开源与企业级私有开发需求。 2.Gitee和GitHub区别 3.Gitee使用教程 4.Gitee相关…...

NoUniqueKey问题和Regular join介绍

问题背景 在flink任务中&#xff0c;遇到了 NoUniqueKey Join的情况&#xff0c;导致了数据膨胀&#xff0c;和下游结果与数据库数据不一致问题 那NoUniqueKey Join为什么会导致问题呢&#xff0c;下面是其中一种场景示例&#xff1a; 为什么会出现 NoUniqueKey &#xff1a;…...

TC8:SOMEIP_ETS_027-028

SOMEIP_ETS_027: echoUINT8 目的 检查method方法echoUINT8的参数及其顺序能够被顺利地发送和接收 说白了就是检查UINT8数据类型参数在SOME/IP协议层的序列化与反序列化是否正常。 UINT8相比于测试用例SOMEIP_ETS_021: echoINT8中的SINT8数据类型来说,属于无符号整数,也就是…...

小微企业SaaS ERP管理系统,SpringBoot+Vue+ElementUI+UniAPP

小微企业的SaaS ERP管理系统&#xff0c;ERP系统源码&#xff0c;ERP管理系统源代码 一款适用于小微企业的SaaS ERP管理系统, 采用SpringBootVueElementUIUniAPP技术栈开发&#xff0c;让企业简单上云。 专注于小微企业的应用需求&#xff0c;如企业基本的进销存、询价&#…...

css filter 常用方法函数和应用实例

1. blur() 模糊 filter: blur(半径);参数&#xff1a;模糊半径&#xff08;像素&#xff09;&#xff0c;值越大越模糊 示例&#xff1a;filter: blur(5px);2. brightness() 亮度 filter: brightness(百分比); 参数&#xff1a;1原始对比度&#xff0c;0全灰&#xff0c;>…...

chrome inspect 调试遇到的问题

1、oppp 手机打开webview 的时候&#xff0c; 报错这个并没有页面 Offline #V8FIG6SGLN75M7FY Pending authentication: please accept debugging session on the device. 解决方法&#xff0c;保持chrome 浏览器在显示的状态 去设置里开启usb 调试再关闭&#xff0c;反复重…...

Kotlin 中 List 和 MutableList 的区别

在 Kotlin 中&#xff0c;List 和 MutableList 是两种不同的集合接口&#xff0c;核心区别在于可变性。 Kotlin 集合框架的重要设计原则&#xff1a;通过接口分离只读&#xff08;read - only&#xff09;和可变&#xff08;mutable&#xff09;操作&#xff0c;以提高代码的安…...

openssl 生成自签名证书实现接口支持https

1.下载安装openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 2.配置环境变量 将 openssl 的目录&#xff08;D:\tools\openssl\bin&#xff09;添加到 path 中 3.生成自签名证书 找一个存证书的目录打开powershell 3.1 生成私钥 openssl gen…...

React 中集成 Ant Design 组件库:提升开发效率与用户体验

React 中集成 Ant Design 组件库:提升开发效率与用户体验 一、为什么选择 Ant Design 组件库?二、基础引入方式三、按需引入(优化性能)四、Ant Design Charts无缝接入图标前面提到了利用Redux提供全局维护,但如果在开发时再自己手动封装组件,不仅效率不高,可能开发的组件…...