JVM模型、GC、OOM定位
JVM模型
程序计数器
程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。
另外,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
作用
记录当前线程执行的字节码指令地址(行号),在多线程切换时恢复执行位置。
特性
线程私有,生命周期与线程绑定
唯一不会发生OutOfMemoryError的区域
异常
无
Java虚拟机栈(Java Virtual Machine Stack)
与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的内存模型。
Java 内存可以粗糙的区分为堆内存(Heap)和栈内存(Stack)其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。 (实际上,Java虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有局部变量表、操作数栈、动态链接、方法出口信息)
局部变量表主要存放了编译器可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。
作用
存储方法调用的栈帧(Frame),包括局部变量表、操作数栈、动态链接和方法返回地址。
特性
线程私有,每个方法调用对应一个栈帧
通过 -Xss 参数设置栈大小(如 -Xss1m)
异常
StackOverflowError:栈深度超过限制(如无限递归)
OutOfMemoryError:栈动态扩展时无法申请足够内存(较少见)
本地方法栈(Native Method Stack)
和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
作用
为JVM调用本地(Native)方法(如C/C++代码)服务。
特性
与Java虚拟机栈类似,但服务于Native方法。
异常
同虚拟机栈(StackOverflowError、OutOfMemoryError)。
Java堆(Java Heap)
Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
Java 堆是垃圾收集器管理的主要区域,因此也被称作GC堆(Garbage Collected Heap).从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以Java堆还可以细分为:新生代和老年代:再细致一点有:Eden空间、From Survivor、To Survivor空间等。进一步划分的目的是更好地回收内存,或者更快地分配内存。
作用
存放对象实例和数组,是垃圾回收(GC)的主要区域。
特性
线程共享,生命周期与JVM进程一致。
通过 -Xms(初始堆大小)和 -Xmx(最大堆大小)调整(如 -Xms256m -Xmx1024m)。
新生代分为 Eden 区 和两个 Survivor 区(From 和 To),默认比例(可通过参数调整):
Eden : Survivor = 8:1:1(如 -XX:SurvivorRatio=8)
Java 8后,字符串常量池(String Table)从方法区移至堆中。
异常
OutOfMemoryError: Java heap space:对象过多或内存泄漏导致堆空间不足。
永久代与元空间的区别:
方法区(Method Area)
方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
作用
存储类元数据(Class Metadata)、常量池(Constant Pool)、静态变量(JDK 8+移至堆中)等。
实现演进
JDK 7及之前:称为“永久代(PermGen)”,通过 -XX:PermSize 和 -XX:MaxPermSize 调整。
JDK 8+:改为元空间(Metaspace),使用本地内存(Native Memory),通过 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 控制。
异常
OutOfMemoryError: Metaspace(JDK 8+)或 PermGen space(JDK 7):加载过多类或动态生成类(如反射、CGLib)。
直接内存(Direct Memory)
定位:
直接内存是JVM外部的本地内存(Native Memory),不属于JVM运行时数据区,但可通过Java代码间接访问(如ByteBuffer.allocateDirect())。
特点:
绕过堆内存:避免Java堆与Native堆之间的数据复制,提升I/O性能(常用于NIO的DirectBuffer)。
手动管理:不依赖JVM垃圾回收,需显式调用System.gc()或依赖Cleaner机制释放(但不可控)。
容量限制:受操作系统物理内存和进程地址空间限制(32位系统单进程通常≤2GB)。
配置参数
-XX:MaxDirectMemorySize:设置直接内存最大容量(默认与堆最大值-Xmx相同)
# 示例:限制直接内存为512MB
-XX:MaxDirectMemorySize=512m
常见问题
OutOfMemoryError: Direct buffer memory:
原因:
直接内存分配超出MaxDirectMemorySize限制,或未及时释放。
排查:
检查代码中DirectBuffer的使用(如Netty、文件读写)。
监控直接内存占用(jcmd VM.native_memory或NMT工具)。
确保-XX:MaxDirectMemorySize配置合理。
GC
垃圾收集器详解
JVM 提供了多种垃圾收集器(Garbage Collectors, GC),每种收集器针对不同的应用场景和性能需求设计。以下是主要收集器的分类、特点及适用场景:
经典分代收集器
(1) Serial 收集器
模式:单线程、Stop-The-World (STW)。
适用场景:客户端应用、资源受限的嵌入式系统。
参数:-XX:+UseSerialGC
新生代算法:复制(Copying)。
老年代算法:标记-整理(Mark-Compact)。
(2) Parallel Scavenge(吞吐量优先收集器)
模式:多线程并行、STW。
目标:最大化 吞吐量(总运行时间中 GC 时间占比最低)。
参数:-XX:+UseParallelGC(JDK 8 默认)
新生代算法:复制。
老年代算法:标记-整理(Parallel Old)。
(3) ParNew 收集器
模式:Parallel Scavenge 的改进版,专为配合 CMS 设计。
参数:-XX:+UseParNewGC
特点:与 CMS 配合时,用于新生代收集。
(4) CMS(Concurrent Mark-Sweep)
模式:并发标记、STW 清除。
目标:最小化 停顿时间(低延迟)。
参数:-XX:+UseConcMarkSweepGC
老年代算法:标记-清除(Mark-Sweep),需定期 Full GC 整理碎片。
缺点:内存碎片、CPU 敏感。
新一代收集器
(1) G1(Garbage-First)
模式:并发与并行、分 Region 管理。
目标:平衡 吞吐量 和 延迟(JDK 9+ 默认收集器)。
参数:-XX:+UseG1GC
内存布局:将堆划分为多个 Region(默认 2048 个),避免全堆回收。
阶段:
Young GC:回收 Eden 和 Survivor 区。
Mixed GC:同时回收新生代和部分老年代 Region。
适用场景:大内存(>4GB)、低延迟要求(数百毫秒级)。
(2) ZGC(Z Garbage Collector)
模式:全并发、低停顿(STW < 10ms)。
目标:超大堆(TB 级)下的极低延迟。
参数:-XX:+UseZGC
关键技术:
染色指针(Colored Pointers):在指针中存储元数据,避免内存屏障。
内存映射:支持动态堆大小调整。
适用场景:云计算、实时系统(JDK 15+ 生产可用)。
(3) Shenandoah
模式:全并发、与 ZGC 竞争。
参数:-XX:+UseShenandoahGC
特点:
与 ZGC 类似,但通过 读屏障 而非染色指针实现并发。
在 JDK 12+ 中提供,适合中等规模堆(数百 GB)。
优势:低延迟且兼容性更广(支持较早 JDK)。
特殊场景收集器
(1) Epsilon(No-Op GC)
模式:不执行回收,仅供测试。
参数:-XX:+UseEpsilonGC
用途:性能测试、短生命周期应用(如 CI 任务)。
(2) Serial GC 的变种
Serial Old:Serial 的老年代版本(标记-整理)。
Serial CMS:CMS 的单线程模式(极少使用)。
JDK 17+ 支持的收集器
收集器 | 启动参数 | 适用场景 | 特点 | 推荐 JDK 版本 |
---|---|---|---|---|
G1 (Garbage-First) | -XX:+UseG1GC | 通用场景(默认) | 平衡吞吐量和延迟,支持大堆内存 | JDK 9+ (默认) |
ZGC | -XX:+UseZGC | 超大堆、超低延迟 | STW < 1ms,支持 TB 级堆 | JDK 15+ |
Shenandoah | -XX:+UseShenandoahGC | 低延迟、兼容性要求高 | 全并发,STW < 10ms | JDK 12+ |
Parallel (吞吐量优先) | -XX:+UseParallelGC | 批处理、计算密集型任务 | 多线程并行,最大化吞吐量 | JDK 8+ |
Serial | -XX:+UseSerialGC | 客户端/嵌入式系统 | 单线程,资源占用低 | 全版本 |
Epsilon (无操作) | -XX:+UseEpsilonGC | 测试/极短生命周期应用 | 不回收内存,仅分配 | JDK 11+ |
Minor GC(Young GC)
目标
回收年轻代(Young Generation)的垃圾对象。
触发条件
Eden 区空间不足:当程序尝试在 Eden 区分配对象时,若空间不足则触发。
主动触发:某些垃圾收集器(如 G1)可能周期性触发。
核心流程
(1) 根枚举(Root Scanning)
目标:确定所有 GC Roots(存活对象的起点)。
GC Roots 类型:
栈帧中的局部变量(线程栈)
静态变量(方法区)
JNI 引用(Native 方法)
(2) 标记存活对象(Marking)
可达性分析:从 GC Roots 出发,遍历所有引用链,标记存活对象。
三色标记法:通过白、灰、黑三色跟踪对象状态(具体算法因收集器而异)。
(3) 复制存活对象(Copying)
复制目标:
Survivor To 区:将 Eden 和 Survivor From 区的存活对象复制到 Survivor To 区。
老年代:若对象年龄超过阈值(默认 15,-XX:MaxTenuringThreshold)或 To 区空间不足,则直接晋升到老年代。
对象年龄计数器:每经历一次 Minor GC,存活对象的年龄 +1。
(4) 清空原区域(Sweeping)
回收 Eden 和 From 区:所有未被复制的对象(即垃圾)被回收,空间被释放。
指针碰撞(Bump the Pointer):内存整理后,Eden 区重新从起始地址分配对象。
(5) 交换 Survivor 区(Swap)
From ↔ To 角色互换:确保下一次 Minor GC 时,Survivor To 区为空。
核心算法
复制算法(Copying):通过复制存活对象到Survivor区,避免内存碎片。
Stop-The-World(STW):Minor GC会暂停所有应用线程,但时间通常较短。
Full GC
目标
回收整个堆(包括老年代、年轻代)以及元空间(Metaspace)或永久代(PermGen,Java 8之前)
触发条件
1.老年代空间不足(如对象晋升失败)。
2,元空间/永久代空间不足。
3.显式调用System.gc()(依赖JVM参数-XX:+DisableExplicitGC配置)。
4.垃圾回收器策略触发(如CMS的并发模式失败、G1的疏散失败等)。
核心流程
(1)标记所有存活对象:
从GC Roots出发,标记整个堆(年轻代+老年代)和元空间的存活对象。
(2)回收垃圾对象:
年轻代:执行类似Minor GC的复制算法。
老年代:根据垃圾回收器类型不同,可能使用以下算法:
标记-清除-整理(Mark-Sweep-Compact):CMS、Serial Old等。
分代收集(Generational):G1、ZGC等。
元空间/永久代:回收不再使用的类元数据。
(3)内存整理(可选):
部分回收器(如Serial Old)会对老年代进行内存整理,减少碎片。
(4)完成回收:
释放未使用的内存,恢复应用线程。
核心算法
标记-清除(Mark-Sweep)或标记-整理(Mark-Compact):适用于老年代。
Stop-The-World(STW):Full GC的STW时间通常较长,对性能影响显著。
GC关键对比
OOM定位
常见OOM类型
错误类型 | 触发区域 | 典型原因 |
---|---|---|
java.lang.OutOfMemoryError: Java heap space | 堆内存 | 对象数量过多、内存泄漏、缓存未清理 |
java.lang.OutOfMemoryError: Metaspace | 元空间(方法区 | 动态生成类过多(如反射、CGLIB)、未限制元空间大小 |
java.lang.OutOfMemoryError: Direct buffer memory | 直接内存 | 未释放 ByteBuffer、Netty 或 NIO 使用不当 |
java.lang.OutOfMemoryError: Unable to create new native thread | 栈/线程资源 | 线程数过多、操作系统限制(ulimit -u) |
java.lang.OutOfMemoryError: Requested array size exceeds VM limit | 堆内存 | 尝试分配超大数组(如 new int[Integer.MAX_VALUE]) |
分析堆转储文件
工具选择:
Eclipse MAT:分析对象引用链,查找内存泄漏。
VisualVM:快速查看对象分布。
JProfiler:商业工具,功能全面。
MAT 分析步骤:
打开 heapdump.hprof。
查看 Histogram,按对象数量或内存占用排序。
使用 Dominator Tree 找到占用内存最大的对象。
通过 Path to GC Roots 查看对象引用链,定位未释放的引用。
发生OOM时自动生成堆转储文件Heap Dump)
1.在 Dockerfile 中直接指定 JVM 参数
FROM openjdk:11-jdk # 基础镜像(需确保有写入权限的目录)
COPY your-app.jar /app.jar# 创建堆转储目录并设置权限
RUN mkdir -p /dumps && chmod 777 /dumps# 添加 JVM 参数
ENV JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dumps"
CMD ["sh", "-c", "java $JAVA_OPTS -jar /app.jar"]
2. 通过 docker run 命令动态传递参数
docker run -d \-v /host/dumps:/dumps \ # 挂载宿主机目录到容器内的转储路径-e JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dumps" \your-java-image
3.导出.hprof文件使用MAT工具分析
使用jmap命令
确保容器内安装 JDK(而非仅 JRE)
基础镜像应包含完整的 JDK,例如:
FROM openjdk:11-jdk # 使用 JDK 镜像(包含 jps/jmap 工具)
如果使用 JRE 镜像(如 openjdk:11-jre),需手动安装 JDK 工具:
apt-get update && apt-get install -y openjdk-11-jdk-headless
启动容器时保留调试权限
添加 --cap-add=SYS_PTRACE 避免权限问题:
docker run -d --cap-add=SYS_PTRACE --name my_container my_image
查看java进程PID
进入容器执行命令
docker exec -it <container_id> /bin/bash
jps -l # 查看容器内 Java 进程 PID 和主类名
直接执行命令(不进入容器)
docker exec <container_id> jps -l
使用 jmap 生成堆转储
生成堆转储文件
# 进入容器后执行
jmap -dump:format=b,file=/tmp/heapdump.hprof <pid># 或直接执行
docker exec <container_id> jmap -dump:format=b,file=/tmp/heapdump.hprof <pid>
将堆转储文件从容器复制到宿主机
docker cp <container_id>:/tmp/heapdump.hprof /path/on/host
相关文章:
JVM模型、GC、OOM定位
JVM模型 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来…...
什么是数据链路层的CRC检测以及为什么要放到帧尾?
数据链路层在封装过程中添加CRC(循环冗余校验)帧尾,主要目的是为了检测数据传输过程中可能出现的比特错误,确保数据的完整性和可靠性。具体原因如下: 1. 错误检测 物理层传输的不可靠性:数据在物理介质&am…...
Electron 入门指南
Electron 入门指南 Electron 是一个使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用的框架。通过 Electron,你可以利用 Web 技术开发出功能强大的桌面应用程序,并且能够运行在 Windows、Mac 和 Linux 系统上。 本文将带你从零开始构建一个简单的 Ele…...
目标检测YOLO实战应用案例100讲- 无人机平台下露天目标检测与计数
目录 知识储备 基于YOLOv8改进的无人机露天目标检测与计数 一、环境配置与依赖安装 二、核心代码实现(带详细注释) 1. 改进YOLOv8模型定义(添加注意力机制) 2. 无人机视角数据增强(drone_augment.py ) 3. 多目标跟踪与计数(tracking_counter.py ) 4. 完整推理流…...
ArkTS基础实验 (二)
任务一:使用模板字符串相关知识,实现多个变量的拼接。同学们可以把自己的姓名、年纪和爱好这三个变量进行拼接。把代码和日志中console.log的打印结果截图保留。 预期效果: 任务二:使用状态变量和点击事件相关知识实现计数器案例…...
【计算机视觉】Bayer Pattern与Demosaic算法详解:从传感器原始数据到彩色图像
Bayer Pattern与Demosaic算法详解:从传感器原始数据到彩色图像 一、引言 在现代数码相机和手机摄像头中,我们能够拍摄到丰富多彩的彩色图像。然而,你可能不知道的是,图像传感器本身并不能直接感知颜色——它们只能感知光的强度。…...
媒体查询使用
一、引言 为了确保网页在不同设备上都能提供良好的用户体验,响应式设计变得至关重要。而媒体查询(Media Queries)就是前端开发中实现响应式设计的核心技术之一。 二、媒体查询的概念 媒体查询是 CSS3 引入的一项强大功能,它允许开…...
deepseek对IBM MQ SSL 证书算法的建议与解答
在IBM MQ配置SSL TLS的命令中,如果参数SSLCIPH使用TLS_RSA_WITH_AES_128_CBC_SHA256,如下所示: DEFINE CHANNEL(QM1.TO.QM2) CHLTYPE(SDR) TRPTYPE(TCP) CONNAME(QM1.MACH.COM) XMITQ(QM2) SSLCIPH(TLS_RSA_WITH_AES_128_CBC_SHA256) DESCR(S…...
服务器文件同步工具有哪些?
服务器文件同步工具的选择取决于你的具体需求(如实时同步、单向/双向同步、跨平台支持、安全性等)。以下是几款主流的服务器文件同步工具推荐,适用于不同场景: 1. 实时同步工具(适合高频率、低延迟需求) rsync 特点:经典增量同步工具,支持本地/远程同步,高效节省带宽。…...
Numpy数组与矩阵——python学习
我前面提到过Numpy函数,但是不够全,在这里我顺便做一些补充。先说明一下我用的是Notebook。 一、数组的创建与操作 1、把列表转换为数组 np.array([1,2,3,4,5]) 2、把元组转换为数组 np.array((1,2,3,4,5)) 3、把range对象转换为数组 np.array(rang…...
CasaOS上部署1Panel开源运维面板远程在线访问配置实操指南
文章目录 前言1. 添加镜像源2. 部署1Panel3. 本地访问测试4. 安装内网穿透工具5. 配置公网地址6. 配置固定公网地址 前言 很多时候在尝试远程管理服务器时,常常会遇到各种各样的麻烦,尤其是缺乏公网IP或者路由器设置过于复杂时,更是让人感到…...
深入理解缓存淘汰策略:LRU 与 LFU 算法详解及 Java 实现
一、LRU (Least Recently Used - 最近最少使用) LRU 策略的核心思想是:当缓存空间不足时,优先淘汰最近最长时间未被访问的数据。它基于“时间局部性”原理,即最近被访问的数据,在未来被访问的概率也更高。 LeetCode 146. LRU 缓…...
小智项目架构分析
小智代码架构 .github 这就是github项目上拉下来的一些信息 没什么好看的,这跟项目代码无关 .build 编译时生成的文件,没什么可看的,与项目代码无关 .main 主要的代码都在这里面了 .managed_components 这里是小智用到的一些第三方移植…...
基于 SSE 和分块传输的 Uniapp 微信小程序 实现 流式传输 对话
最近的项目是做微信小程序的一个对话框,接入DeepSeek,实现实时对话一个功能。 主要用到的技术点为: 1. Server-Sent Events (SSE) 技术: 在请求头中设置了 ‘X-DashScope-SSE’: ‘enable’,启用了SSE协议 服务器以事…...
[OS] POSIX C库介绍
POSIX C 库可以理解为 Unix/Linux系统的"标准化工具包",用一句话概括就是: 👉 它提供了一套跨Unix系统的统一编程接口,让开发者用同一份代码能在不同系统(如Linux、macOS)中运行。 核心组成&…...
<uniapp><插件><UTS>在uniapp中,创建自己的插件并发布到uni插件市场
前言 本专栏是基于uniapp实现手机端各种小功能的程序,并且基于各种通讯协议如http、websocekt等,实现手机端作为客户端(或者是手持机、PDA等),与服务端进行数据通讯的实例开发。 发文平台 CSDN 环境配置 系统&…...
深度学习前沿探秘:Transformer 模型与多领域应用
技术点目录 注意力(Attention)机制详解自然语言处理(NLP)领域的Transformer模型详解计算视觉(CV)领域的Transformer模型详解时间序列建模与预测的大语言模型目标检测算法详解目标检测的大语言模型语义分割的…...
介绍下Nginx的作用与请求转发机制
引言 最近笔者在业务中遇到了Nginx轮训策略使用不当导致后端服务的压力增加,从而导致容器CPU资源不足,响应超时的问题; 但由于对Nginx的了解仅限与作为反向代理使用,所以借用GPT工具整理了Nginx的作用以及请求转发机制ÿ…...
Sql刷题日志(day6)
一、笔试 1、insert ignore:在插入数据时忽略主键冲突或其他唯一性约束冲突。 如果插入的记录会导致主键冲突(如 actor_id 已存在),该语句不会报错,而是直接忽略插入操作 语法: INSERT IGNORE INTO tab…...
Ajax 提交表单与文件上传
目录 一、Ajax 提交表单1.1 基本原理1.2 HTML 表单示例1.3 JavaScript 示例(使用 fetch API)二、Ajax 文件上传2.1 基本原理2.2 HTML 文件上传表单示例2.3 JavaScript 示例(使用 fetch API)三、后端处理示例(以 Node.js + Express 为例)3.1 安装依赖3.2 创建服务器文件四…...
【零基础入门】ASP.NET Core快速搭建第一个Web应用
一、为什么选择ASP.NET Core? 跨平台支持:可在Windows/macOS/Linux系统运行 高性能:比传统ASP.NET框架快10倍以上 开源生态:活跃的开发者社区和丰富的NuGet包 云原生支持:完美适配Docker和Kubernetes部署 二、开发…...
盒子模型
1.1看透网页布局的本质 1.2盒子模型的组成部分 css盒子模型本质是一个盒子,封装周围的html元素,它包括边框 外边距 内边距和实际内容。 padding:盒子与内容间的距离margin:盒子与盒子间的距离 1.3border边框 1.border-width 边…...
厚铜PCB如何兼顾质量与成本?供应商设计规范执行的黄金平衡点
厚铜电路板供应商需要遵循一系列设计规范,以确保所提供的电路板符合行业标准和客户要求。以下是一些需要遵循的设计规范: 1. 电路板尺寸和形状:厚铜电路板供应商需要按照客户提供的规格和要求来设计电路板的尺寸和形状。一般来说,…...
Kafka 配置参数性能调优建议
文章目录 1、生产者调优batch.size(重要)linger.mscompression.typeacks(重要)buffer.memorymax.in.flight.requests.per.connection(重要)message.max.bytes(重要) 2、消费者调优fe…...
Java读Excel:解析阿里云easyExcel导入文件的行号
文章目录 引言I 解析阿里云easyExcel导入文件的行号声明解析对象的基类判断Excel解析对象类型是否包含继承某个类 isAssignableFromJava 转换list类型并设置下标到元素对象属性II 封装excel 文件读取excel 文件读取用法文件导入上下文III 参数校验工具类校验参数是否合法 (jaka…...
Vuex持续保存数据 页面刷新不丢失 vuex-persistedstate
vuex可以进行全局的状态管理,但刷新后刷新后数据会消失,这是我们不愿意看到的。怎么解决呢,我们可以结合本地存储做到数据状态持久化,但是太麻烦每次都要操作,强烈建议使用插件利用vuex-persistedstate插件. 安装 npm …...
.NET8配置组件
一、组件的概念 含义:用于从配置文件中读取配置的组件,叫做配置组件。简单来说, 就是从xml、json、yaml、txt等文件中读取配置的组件。主要采用微软提供的 Microsoft.Extensions.Configuration 二、组件的使用 1、json配置读取 (1)、在Dunk.Common.Project.Configuratio…...
加密算法:ed25519和RSA
ed25519 和 RSA 是两种不同的非对称加密算法,常用于 SSH 密钥认证。以下是它们的对比和选择建议: 1. 算法对比 特性ed25519RSA (4096-bit)安全性更高(基于椭圆曲线密码学 ECC)高(依赖大数分解难度)密钥长度固定 256 位(公钥/私钥更短)通常 2048/4096 位(公钥较大)性能…...
递归、搜索和回溯算法《递归》
在之前的优选算法当中我们已经学习了一些基本的算法,那么接下来我们就要来学习算法当中的一大重要章节——递归、搜索和回溯算法,其实也就是大家常常听到的dfs、bfs;其实本质就是递归,在学习搜索、回溯等算法的过程当中我们会先来…...
构建“云中”高并发:12306技术改造的系统性启示
作为曾参与12306余票查询系统高并发升级的技术从业者,笔者注意到公众对于12306底层技术常存在认知盲区。为破解这一迷思,特此分享十年前的架构解密文献(该技术之前名叫 gemfire 现已晋升为Apache顶级项目Geode,代码库详见…...
升级xcode15 报错Error (Xcode): Cycle inside Runner
升级xcode15后报错 Could not build the precompiled application for the device. Error (Xcode): Cycle inside Runner; building could produce unreliable results. This usually can be resolved by moving the shell script phase Thin Binary so that it runs before th…...
gradle-tasks.register(‘classesJar‘, Jar)解析
在使用gradle作为构建工具的android或者java web项目中,我们经常能遇到以下格式 tasks.register(classesJar, Jar) {from "$buildDir/intermediates/javac/release/classes" // 假设使用 release 构建变体 }artifact sourcesJar使用伪代码解释 class Cu…...
深度对比:Objective-C与Swift的RunTime机制与底层原理
1. RunTime简介 RunTime(运行时)是指程序在运行过程中动态管理类型、对象、方法等的机制。Objective-C 和 Swift 都拥有自己的运行时系统,但设计理念和实现方式有很大不同。理解 RunTime 的底层原理,是掌握 iOS 高级开发的关键。…...
升级Xcode16,flutter项目报错
升级xcode16后发现原来的项目运行不了了,flutter的版本是3.3.1 保错:[ 304 ms] Could not build the precompiled application for the device. [ 16 ms] Error (Xcode): linker command failed with exit code 1 (use -v to see invocation) 1、找到本地…...
MCU内存映射技术详解
MCU内存映射技术详解 1. 引言 内存映射是微控制器(MCU)系统设计中的核心概念,它决定了MCU如何访问和管理内存资源。通过内存映射,处理器可以将物理设备的地址空间映射到自己的逻辑地址空间中,实现对各种硬件资源的统一访问。本文将深入探讨…...
Mac搭建Flutter IOS环境详细指南
目录 1. 准备工作 2. 下载Flutter SDK: 2.1 配置环境 2.2 解决环境报错 zsh:command not found:flutter 2.3、再使用source命令重新加载一下:【source ~/.zshrc】,下次再编辑这个文件就可以直接执行:【open ~/.zshrc】 2.4、执行【flut…...
计算机基础—(九道题)
1. 流程控制题 编写一个程序,输入一个整数,判断它是否是素数(质数)。 如果是素数,输出Yes,否则输出No。 #include <stdio.h> int main() /* 1. 流程控制题编写一个程序,输入一个整数&…...
蓝桥杯2025年第十六届省赛真题-可分解的正整数
其实只有1不符合要求,因为-1010,作为对称结构,任何数都可以改成加法,比如4-3-2-101234,但因为最小连续的数为3,1恰好在里面,所以1不行。 #include<bits/stdc.h> using namespace std; #define int l…...
Linux虚拟机无法重启网络
这是为什么啊?试了很多种方法都还是失败。 这是本机vmware8的网络配置 这是linux虚拟机的nat配置 这是虚拟机里静态配置的网络 有没有可以答疑解惑一下的?...
8.Android(通过Manifest配置文件传递数据(meta-data))
配置文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><applicationandroid:allowBackup"tr…...
17:00开始面试,17:08就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到4月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
Docker 常用命令(涵盖多个方面)
Docker 命令完整列表(表格形式) 类别 命令 描述 示例 Docker 服务管理 sudo systemctl start docker 启动 Docker 守护进程 sudo systemctl start docker sudo systemctl stop docker 停止 Docker 守护进程,需先停止所有容…...
前缀树(Trie)(字典树)
做leetcode的时候看到前缀树,听都没听过,后来才知道前缀树就是字典树。之前学过,在OJ项目中用字典树来实现黑白名单限制。浅浅复习一下吧 用字典树来实现黑白名单限制 实现步骤 (1)定义黑名单 import java.util.Arra…...
word插入APA格式的参考文献
word插入APA格式的参考文献并实现交叉引用 1. 直接手写并采用超链接 2. 使用zotero插入参考文献后采用超链接(前提下载zotero和对应的插件) 1. 直接手写 APA格式生成 1. 在需要插入参考文献的地方手写格式,如下。 2. 生成书签 名字随便填的,&#x…...
n8n部署docker本地化备份和数据持久化和迁移问题
问题总结: 在一开始的操作中,你遇到的主要问题是 Docker 容器内的文件权限导致了文件无法正确写入和修改,尤其是在复制本地备份文件到容器内时。具体问题表现为: 复制文件后,容器内文件权限错误:你使用 do…...
绘制板块层级图
目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 【实验总结】 【实验目的】 掌握数据文件读取掌握数据处理的方法实现板块层级图的绘制 【实验原理】 板块层级图(treemap)是一种基于面积的可视化方式,通过每一个板块&…...
国标云台控制状态
1.基本概念 国标联网系统的信息传输、交换、控制方面的都是通过SIP服务器负责通讯得,SIP负责信令流逐级转发。其中最重要的一部分就是和摄像机进行信令交互。 像安全注册、实时视音频点播、历史视音频的回放等应用的会话控制采用IETFRFC3261规定的Register、Invite等…...
PostgreSQL与MySQL哪个适合做时空数据分析?
PostgreSQL与MySQL的定位与区别 定位差异:功能导向与性能优先 PostgreSQL和MySQL作为两大主流开源数据库,其核心设计理念和适用场景存在显著差异。PostgreSQL定位为 对象-关系型数据库(ORDBMS) ,强调功能完备性与标准…...
uniapp利用生命周期函数实现后台常驻示例
在 Uniapp 中,利用生命周期函数实现“后台常驻”主要是通过监听应用的前后台状态变化( onHide 和 onShow ),并结合 定时器、后台任务或状态保持逻辑 来实现。但需注意: 纯前端 JS 代码无法突破系统对后台应用的限制&am…...
JAVA设计模式——(八)单例模式
JAVA设计模式——(八)单例模式 介绍理解实现饿汉式懒汉式 应用 介绍 确保一个类只存在一个实例。 理解 就是一个实例,new出来的一个,很简单。不过单例模式分为了懒汉式和饿汉式,其中也有线程安全的实现方式和线程不…...