【JVM调优实战指南:从案例分析到性能优化】
一、JVM 调优核心原则
JVM 调优旨在平衡系统的吞吐量、延迟和内存使用。在进行 JVM 调优时,我们可以遵循以下原则:
先优化代码:优先排查业务逻辑中的内存泄漏、对象滥用等问题。优化代码不仅能从根本上解决性能问题,还能减少对 JVM 参数调整的依赖。比如,在一个电商订单处理系统中,开发人员发现部分代码在每次处理订单时都会创建大量临时对象,且这些对象在使用后未及时释放,导致内存占用不断攀升。通过优化代码,将这些临时对象的创建和使用进行合理管理,有效地减少了内存消耗,降低了垃圾回收的频率。
监控先行:通过jstat、jmap、arthas等工具分析 GC 日志和堆快照,了解 JVM 的运行状态。在一个高并发的 Web 应用中,使用jstat工具定时查看 GC 的频率和耗时,发现年轻代 GC 频繁发生,且每次耗时较长。进一步使用arthas工具进行深入分析,发现是某些业务模块中对象创建过于频繁,导致年轻代空间快速被填满,从而频繁触发 GC。
参数迭代:逐步调整内存分配和 GC 策略,对比优化前后的指标变化。每次只调整一个参数,这样可以清晰地了解每个参数调整对系统性能的影响。以一个大数据处理任务为例,首先尝试调整堆内存大小参数-Xms和-Xmx,观察任务的执行时间和内存使用情况;然后再调整垃圾回收器相关参数,如选择不同的垃圾回收器或调整垃圾回收器的参数,对比每次调整后的性能指标,从而找到最适合的参数配置。
二、经典案例分析与解决方案
案例 1:脚本引擎引发的 Metaspace 内存溢出
在一个金融风险评估系统中,系统突然发生 Full GC,并且 Metaspace 区域的占用持续增长。重启后,问题虽然暂时得到缓解,但没过几天又周期性地复现,频繁的 Full GC 触发了告警。
为了定位问题,首先开启 GC 日志,添加参数-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintHeapAtGC -XX:+PrintReferenceGC -XX:+PrintGCApplicationStoppedTime -Xloggc:/path/to/gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=14 -XX:GCLogFileSize=100M。通过分析 GC 日志,发现 Full GC 发生在 Metaspace 区 ,这表明可能存在类的元数据不断增加的问题。通常情况下,Metaspace 在系统稳定运行一段时间后占用空间应该比较稳定,而现在出现频繁 Full GC,说明在不断地加载类。进一步观察发现,在 Full GC 期间有大量类被卸载,这暗示着可能在频繁地生成大量 “一次性” 的类。
接着进行堆 dump 分析,使用jmap -dump:format=b,file=/tmp/heapDump.hprof [pid]命令生成堆快照 ,然后通过 VisualVM 工具导入快照进行分析。结果发现存在大量的匿名 Script 类,追踪这些类的引用,发现来自于 Lhs 类。查看 Lhs 类的代码,发现其中使用了 Aviator 脚本引擎进行表达式编译,每次编译都会生成新的匿名类,而这些类会占用 JVM 的 Metaspace 区域。经过查询 Aviator 官网文档,确认这是一个已知的内存溢出问题。
问题的根源在于 Aviator 脚本引擎在编译表达式时,默认每次都生成新类,且未启用缓存模式。解决方法是在编译时使用缓存模式,将AviatorEvaluator.compile(this.expression)改为AviatorEvaluator.compile(this.expression, true) 。重新发布系统后,Metaspace 的占用趋于稳定,Full GC 的问题得到解决。
案例 2:Kafka 消费不均衡导致 CPU 负载飙升
某广告投放服务突然出现大量 CPU 负载过高的告警,尤其是在服务发布时,告警更加频繁。这严重影响了广告投放的实时性和稳定性,可能导致广告展示延迟,进而影响广告主的投放效果和业务收益。
为了找出问题所在,使用 arthas 工具进行线程分析。arthas 提供了丰富的命令,如thread、jvm、memory等,通过thread命令查看线程信息,快速定位到是mkt_ta_track_topic.sub消费线程占用了大量的 CPU 资源。进一步分析发现,主要存在两个问题:一是ta埋点消息量很大,但当前只是做了简单的判断和日志打印,没有其他复杂业务逻辑,却使用了多线程消费,导致消费速度很快,几乎相当于空循环,这使得 CPU 资源被大量浪费;二是mkt_ta_track_topic当时申请了 8 个分区,而只有 5 台机器,这就意味着部分机器可能需要消费多个分区,从而导致 CPU 占用更加严重。此外,服务发布时会导致 Kafka 分区重分配,进一步加剧了负载过高的问题。
针对这些问题,采取了以下解决方案:一是调整线程池,将多线程消费改为单线程消费,这样可以避免空循环对 CPU资源的浪费。不过考虑到后续业务可能会有正常处理需求,后续可根据实际情况再做调整;二是申请扩展机器,新增 3 台服务。之所以选择扩容机器而不是调整分区,是因为当前服务负载本来就很高,扩容不仅可以解决当前分区分配不均的问题,还能提升系统整体的处理能力。扩容之后,资源利用率依然有75.97%,说明系统还有一定的扩展空间。通过这些措施,CPU 负载过高的问题得到了有效解决,广告投放服务的稳定性和性能得到了显著提升。
案例 3:Full GC 停顿过长引发服务超时
新接手一个服务后,上游反馈偶尔调用超时,超时时间为 1000ms。与上游确认超时发生的时间点后,查看当时系统的运行情况,发现超时时间与 Full GC 的发生时间重合,且 Full GC 的停顿时间超过了 1000ms。这表明 Full GC 停顿过长是导致上游调用超时的主要原因。
为了深入分析问题,首先进行 GC 日志分析。开启 GC 日志打印参数,获取详细的 GC 日志。通过分析日志发现,Full GC 耗时长达 1.2 秒,远远超过了业务允许的阈值。进一步查看垃圾收集器的配置,发现 JDK 使用的是 JDK8,默认垃圾收集器为 Parallel Scavenge 收集器。该收集器的设计目标是追求高吞吐量,主要关注的是整体的运行效率,而不太关心停顿时间。在高并发场景下,较长的停顿时间会导致服务响应变慢,从而引发超时问题。
针对这种情况,解决方案是更换垃圾收集器,选择以获取最短回收停顿时间为目标的 CMS
收集器。通过添加参数-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly来启用 CMS 收集器。其中,-XX:+UseConcMarkSweepGC用于指定使用 CMS
收集器;-XX:CMSInitiatingOccupancyFraction=80表示当老年代的内存占用率达到 80% 时,开始触发 CMS
收集器进行垃圾回收;-XX:+UseCMSInitiatingOccupancyOnly则确保只根据设定的占用率来触发垃圾回收,而不是采用其他默认的触发方式。更换收集器后,Full
GC 的停顿时间明显缩短,服务超时问题得到了解决。
三、JVM 调优实用技巧
- 内存分配策略
堆大小:通过-Xms和-Xmx设置相同值,避免动态扩展。在一个高并发的电商订单处理系统中,由于业务量波动较大,一开始没有将-Xms和-Xmx设置为相同值,导致 JVM 在运行过程中频繁调整堆内存大小。每次调整堆内存时,JVM 都需要向操作系统申请额外的内存,这不仅增加了系统的开销,还导致了垃圾回收频率的增加。后来将-Xms和-Xmx设置为相同值,系统的性能得到了显著提升,垃圾回收的频率也明显降低。
新生代与老年代比例:-XX:NewRatio=2(新生代占 1/3)。在一个实时数据分析系统中,大量的数据处理任务会产生大量的短期存活对象。如果新生代过小,这些对象很快就会填满新生代,导致频繁的 Minor GC,影响系统的性能。通过设置-XX:NewRatio=2,适当增大了新生代的比例,使得短期存活对象能够在新生代中得到及时的回收,减少了 Full GC 的发生频率,提高了系统的响应速度。
Survivor 区优化:-XX:SurvivorRatio=8(Eden:Survivor=8:1)。在一个基于 Spring Boot 开发的 Web 应用中,由于对象的创建和销毁比较频繁,Survivor 区的合理配置显得尤为重要。如果 Survivor 区过小,对象可能会过早地晋升到老年代,增加老年代的压力。通过设置-XX:SurvivorRatio=8,确保了 Eden 区和 Survivor 区的比例合理,使得对象能够在新生代中经历多次 Minor GC 后再晋升到老年代,减少了老年代的垃圾回收压力。 - 垃圾收集器选择
场景
推荐收集器
参数配置
单核 CPU,低延迟
Serial
-XX:+UseSerialGC
多核 CPU,高吞吐量
Parallel Scavenge
-XX:+UseParallelGC -XX:MaxGCPauseMillis :设置最大 GC 停顿时间 -XX:GCTimeRatio :设置 GC 时间与应用运行时间的比例
多核 CPU,低停顿
CMS/G1
CMS: -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction :设置老年代占用多少比例时开始 CMS 收集 -XX:+UseCMSInitiatingOccupancyOnly :确保只根据设定的占用率来触发垃圾回收 G1: -XX:+UseG1GC -XX:MaxGCPauseMillis :设置目标最大停顿时间 -XX:G1NewSizePercent :设置新生代最小占比
在一个单核 CPU 的小型服务器上运行的 Java 应用,主要用于处理一些简单的业务逻辑,对延迟要求较高。由于单核 CPU 的性能有限,使用 Serial 收集器可以充分利用单核 CPU 的性能,并且它的停顿时间相对较短,能够满足应用对低延迟的要求。
在一个大数据处理集群中,每个节点都配备了多核 CPU,集群主要负责处理海量的数据计算任务,对吞吐量要求较高。Parallel Scavenge 收集器可以充分利用多核 CPU 的计算能力,通过设置-XX:MaxGCPauseMillis和-XX:GCTimeRatio等参数,可以有效地控制垃圾回收的停顿时间和吞吐量,使得集群能够高效地处理大量的数据。
在一个互联网电商平台的后端服务中,运行着多个高并发的业务模块,对响应时间要求极高,不允许出现长时间的停顿。使用 CMS 收集器可以在垃圾回收过程中尽量减少对用户线程的影响,通过合理设置-XX:CMSInitiatingOccupancyFraction和-XX:+UseCMSInitiatingOccupancyOnly等参数,可以避免 Concurrent Mode Failure 等问题的发生,保证系统的低停顿和高可用性。对于一些堆内存较大、对停顿时间要求非常严格的应用场景,G1 收集器也是一个不错的选择,它通过将堆内存划分为多个区域,实现了更细粒度的垃圾回收控制,能够在有限的时间内获得最大的回收效率。
3. 避免内存泄漏
谨慎使用缓存:对本地缓存设置大小限制和淘汰策略(如 LRU)。在一个基于 Spring 框架开发的企业级应用中,使用了本地缓存来提高数据的访问速度。但是,如果不设置缓存的大小限制和淘汰策略,随着数据的不断增加,缓存可能会占用大量的内存,导致内存泄漏。通过使用 Guava Cache,并设置大小限制和 LRU 淘汰策略,当缓存达到一定大小时,会自动淘汰最近最少使用的数据,有效地避免了内存泄漏的问题。
关闭显式 GC:添加-XX:+DisableExplicitGC禁止System.gc()触发 Full GC。在一个多线程的并发应用中,有些开发人员可能会在代码中误调用System.gc(),这可能会导致不必要的 Full GC,影响系统的性能。通过添加-XX:+DisableExplicitGC参数,禁止了System.gc()的调用,避免了因误调用而引发的 Full GC,提高了系统的稳定性和性能。
监控堆外内存:通过jstat -gccapacity观察DirectByteBuffer使用情况。在一个使用了 Netty 框架进行网络通信的应用中,Netty 会使用DirectByteBuffer来进行数据的读写操作。如果DirectByteBuffer使用不当,可能会导致堆外内存泄漏。通过使用jstat -gccapacity命令,可以实时观察DirectByteBuffer的使用情况,及时发现和解决堆外内存泄漏的问题。例如,当发现DirectByteBuffer的使用量持续增加且没有释放时,就需要检查代码中是否存在DirectByteBuffer未正确释放的情况 。
四、调优工具推荐
JDK 自带工具
jconsole:从 Java 5 开始引入,是一个基于 JMX 的 GUI 性能监控工具 。它可以实时监控内存、线程、类加载等情况,几乎不消耗性能,因为其自身占用服务器的内存非常小。使用时,既可以通过 cmd 命令直接打开,也能到 JDK 的 bin 目录下双击 jconsole.exe 启动。启动后,可连接本地或远程的 JVM 实例。连接成功后,在主界面的 “内存” 页面能查看堆内存、非堆内存的使用情况以及 GC 的相关信息;“线程” 页面可展示当前 Java 程序中线程的使用信息,还能点击 “检测死锁” 来检查线程之间是否存在死锁情况;“类” 页面则显示了当前 Java 程序中关于类加载的信息。例如,在一个大型电商系统的开发和测试过程中,开发人员使用 jconsole 连接到运行中的应用程序,通过观察 “内存” 页面,发现堆内存的使用率在某些业务操作后急剧上升,且长时间没有下降,进一步查看 GC 信息,发现频繁的 Full GC 并没有有效释放内存,从而判断可能存在内存泄漏问题,为后续的问题排查提供了方向。
jmap -histo:用于分析堆中对象的分布情况。通过jmap -histo:live [pid]命令,可以查看堆中各个类的实例数量和占用空间大小。在一个基于 Spring Cloud 的微服务架构中,某个微服务出现内存占用过高的问题。运维人员使用jmap -histo:live命令获取该微服务进程的堆中对象信息,发现某一个自定义的业务对象实例数量异常多,占用了大量的内存空间。进一步检查代码,发现是在一个循环中错误地创建了该对象,而没有进行有效的复用和释放,从而导致内存占用过高。
jstack:能够生成虚拟机当前时刻的线程快照,主要用于诊断线程死锁或阻塞等问题。当线程出现长时间停顿,比如发生死锁、死循环或者请求外部资源导致长时间等待时,通过jstack [pid]命令查看各个线程的调用堆栈,就可以了解没有响应的线程正在执行的方法以及等待的资源。例如,在一个多线程的文件处理系统中,部分文件处理任务出现长时间卡顿的情况。开发人员使用jstack命令获取线程快照,分析发现是两个线程在访问共享资源时发生了死锁,通过调整代码中资源的访问顺序和加锁机制,解决了死锁问题,恢复了系统的正常运行。
第三方工具
Arthas:由 Alibaba 开源,是一款强大的 Java 诊断工具,支持 JDK 6+,兼容 Linux/Mac/Windows 系统 。它采用命令行交互模式,并提供丰富的 Tab 自动补全功能,方便用户进行问题的定位和诊断。通过thread命令,不仅可以查看线程的详细情况,还能通过thread -b命令快速定位线程死锁问题;使用jad命令可以反编译类,方便查看线上代码版本是否正确;ognl命令则能查看和修改线上系统变量的值。在一个高并发的分布式系统中,某个服务的 CPU 使用率突然飙升。运维人员使用 Arthas 的thread命令,通过thread -n 3参数查看 CPU 占用率最高的前 3 个线程,发现是一个业务处理线程占用了大量 CPU 资源。进一步使用jad命令反编译该线程对应的类,发现是一段复杂的业务逻辑中存在算法效率低下的问题,经过优化算法,CPU 使用率恢复正常。
MAT(Memory Analyzer Tool):这是一个基于 Eclipse 的独立内存分析工具,能快速分析 Java 堆转储快照,帮助开发人员定位内存泄漏和内存浪费问题。当系统发生 OOM(OutOfMemoryError)时,如果配置了-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/…这两个 JVM 参数 ,JVM 会在崩溃前生成一份 dump 快照。使用 MAT 打开该文件后,通过 “Overview” 可以查看整体的内存使用情况,如哪个线程或对象占用了大量内存;“Dominator Tree”(支配树)能直观地反映一个对象本身及它持有引用的对象所占的内存大小和比例,通过 “Shallow Heap”(对象本身所占的内存大小)和 “Retained Heap”(对象的 retained set 所包含对象所占内存的总大小)来分析内存占用情况;“Leak Suspects”(泄漏疑点)功能更是强大,它可以自动分析泄漏的原因,并生成详细的分析报告。在一个大型企业级应用中,系统偶尔会出现 OOM 问题。运维人员在 OOM 发生后,获取到 dump 文件,使用 MAT 进行分析。通过 “Leak Suspects” 功能,快速定位到是一个缓存模块中的对象没有正确释放,导致内存泄漏,经过修复缓存模块的代码,解决了 OOM 问题。
相关文章:
【JVM调优实战指南:从案例分析到性能优化】
一、JVM 调优核心原则 JVM 调优旨在平衡系统的吞吐量、延迟和内存使用。在进行 JVM 调优时,我们可以遵循以下原则: 先优化代码:优先排查业务逻辑中的内存泄漏、对象滥用等问题。优化代码不仅能从根本上解决性能问题,还能减少对 J…...
交换机转发原理 和 DNS服务
1. 收到报文后,将其转换为二进制,并记录在缓存当中 2. 根据二进制中的源 MAC 地址,与接收报文的接口,记录对应关系,在 MAC 地址表中,每个动态表项 300S 老化时间。 3. 判断 如果目的 MAC 是组播或广…...
强化学习Q-Learning:DQN
强化学习Q-Learning/DQN 本文是一篇学习笔记,主要参考李宏毅老师的强化学习课程。 目前主流的强化学习方法大致可以分为 policy-based 和 value-based 两大类。之前我们介绍的 policy gradient 策略梯度,就是 policy-based 的方法。本文要介绍的 Q-learn…...
OpenCv(七)——模板匹配、打包、图像的旋转
目录 一、模板匹配 模板匹配原理 1、单模板之间的匹配 (1)读取并显示待匹配的图片和模板图片 (2)模板匹配并绘制匹配位置的外接矩形 (3)显示最终的效果 2、模板与多个对象匹配,仅匹配当前…...
汽车售后诊断 ODX 和 OTX 对比分析报告
一、引言 在汽车行业不断发展的当下,汽车售后诊断技术对于保障车辆性能、维护车主权益以及提升汽车品牌服务质量起着至关重要的作用。随着汽车电子化程度的不断提高,售后诊断所涉及的数据和流程愈发复杂,这就促使行业需要更加标准化、高效化…...
关于图卷积
深入理解神经网络中的图卷积 一、为什么需要图卷积(动机) 在图结构中,比如: 社交网络(节点是人,边是朋友关系)分子结构(节点是原子,边是化学键)知识图谱&a…...
Meta LLaMA 4:对抗 GPT-4o 与 Claude 的开源王牌
2025 年 4 月,Meta 正式发布了 LLaMA 4 系列的首批两款模型。 这两款模型模型分别是:LLaMA 4 Scout 与 LLaMA 4 Maverick,均采用了 专家混合架构(Mixture-of-Experts, MoE)。 据 Meta 表示,这是首次有 …...
如何进行SQL调优
如何进行SQL调优 SQL 调优是优化数据库查询性能的过程,目的是减少查询的执行时间,提高数据库系统的整体效率。SQL 调优的技巧和方法可以针对不同的数据库管理系统(DBMS)有所不同,但基本的原则和步骤是相似的。以下是一…...
WAF防护规则配置技巧与企业级安全实践指南
面对日益复杂的Web应用攻击,WAF规则配置直接决定防护体系的有效性。本文深度解析规则优先级编排、误报消减策略、智能学习机制等17项关键技术,结合金融行业API攻击案例与Gartner最新防御框架,为企业提供可落地的WAF优化路径。 WAF规则引擎的…...
第16届蓝桥杯单片机模拟试题Ⅱ
试题 代码 sys.h #ifndef __SYS_H__ #define __SYS_H__#include <STC15F2K60S2.H> //ds1302.c extern unsigned char time[3]; void w_ds1302(); void r_ds1302(); //iic.c float v_adc(unsigned char addr); //sys.c extern float light_v; extern float rb2_v; exte…...
机器学习——ROC曲线、PR曲线
一、ROC曲线简介 1.1 ROC曲线的构成 1.横轴(假正率,FPR): 表示负样本被错误分类为正的比例(越小越好) 2.纵轴(真正率,TPR,即召回率): 表示正样…...
Flutter之交互事件
目录: 1、点击事件标准案例1.1、效果图2.1、代码实现 1、点击事件标准案例 1.1、效果图 2.1、代码实现 class FavoriteWidget extends StatefulWidget {const FavoriteWidget({super.key});overrideState<FavoriteWidget> createState() > _FavoriteWidge…...
深入解析Spring Boot自动装配:原理、设计与最佳实践
引言 Spring Boot作为现代Java开发中的一股清流,凭借其简洁、快速和高效的特性,迅速赢得了广大开发者的青睐。而在Spring Boot的众多特性中,自动装载(Auto-configuration)无疑是最为耀眼的明珠之一。本文将深入剖析Sp…...
【责任链】模式解决流程中多个接口的流程问题
业务需求 整体流程有5步骤,每个步骤调用一个接口,每个接口成功才能进行下一步。如a->b->c->d->e, 比如入学报到 a:报班,根据名字生成学号uid b:根据学号分配班级获取班级编号cid c:…...
excel常见错误包括(#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?、#NULL! )
目录 1. #N/A2. #VALUE!3. #REF!4. #DIV/0!5. #NUM!6. #NAME?7. #NULL!8.图表总结 在 Excel 中,可能会遇到以下常见的错误值,每个都有特定的含义和成因: 1. #N/A 含义: 表示“Not Available”(不可用)。…...
【湖南大学】2025我们该如何看待DeepSeek
大家好,我是樱木。 DeepSeek 官方网站:https://www.deepseek.com/ 一、DeepSeek 到底是什么? TA 到底厉害在哪里? 故事从 ChatGPT 说起 去年我们看到 Open AI 发布ChatGPT 后,全球的注意力到了 AI 身上。 我们来拆…...
RAG中构建个人知识库
1. 添加本地模型 1.1 查看本地模型 ollama list1.2 ragflow添加本地模型 1.3 系统模型配置 2. 构建知识库 2.1 准备知识库素材 2.2 配置知识库 2.3 知识库绑定素材文件 上传文件素材 - 解析文件 3. 构建交互系统 3.1 配置助理 3.2 完善提示词 3.3 设置模型参数 4. 体验效…...
在 Kubernetes (k8s) 中,apiserver 的 IIP和 VIP的区别
在 Kubernetes (k8s) 中,apiserver 的 IIP(Internal IP) 和 VIP(Virtual IP) 是与集群网络通信和高可用性设计相关的两个重要概念。 IIP(Internal IP) 定义: IIP 是 apiserver 所在…...
OpenCV--图像形态学
在图像处理领域,图像形态学是一种基于形状进行图像分析的有力工具,广泛应用于图像分割、特征提取、边缘检测、图像降噪等多个方面。借助 OpenCV 这个强大的计算机视觉库,我们可以轻松实现各种图像形态学操作。本文将深入探讨图像形态学的基本…...
智慧医疗数据集
WiNGPT2 更新时间:2024-11-29 访问地址: GitHub 描述: WiNGPT是一个基于GPT的医疗垂直领域大模型,旨在将专业的医学知识、医疗信息、数据融会贯通,为医疗行业提供智能化的医疗问答、诊断支持和医学知识等信息服务,…...
3D激光轮廓仪知识整理(待补充)
文章目录 1.原理和应用场景1.1 相机原理1.1.1 测量原理1.1.2 相机激光器1.1.3 沙姆镜头1.1.4 相机标定1.1.5 中心线提取 1.2 应用场景1.2.1 测量相关应用1.2.2 缺陷检测相关易用 2.相机参数介绍及选型介绍2.1 成像原理2.2 原始图成像2.3 生成轮廓图2.4 相机规格参数2.4.1 单轮廓…...
算法思想之双指针
文章目录 双指针字符串序列判定字符串所有整数最小和服务交换接口失败率分析分披萨最多团队 双指针 双指针是指在解决问题时使用两个指针,通常分别指向数组或字符串中的不同位置,通过移动这两个指针来解决问题的一种技巧。双指针技巧常用于解决数组、链…...
Windows环境下PyCharm 配置miniforge
问题描述. 目前Anconda python 环境管理软件,已非常臃肿。为了替代该软件,可以使用miniforge软件来代替。 1. 安装windows miniforge软件 (1) 下载网站:https://github.com/conda-forge/miniforge?tabreadme-ov-file 从网址下载ÿ…...
C语言基础18
内容提要 构造类型 结构体 共用体/联合体 枚举 typedef 构造类型 数据类型 基本类型/基础类型 整型 短整型:short [int] -- 2字节 基本整型:int -- 4字节 长整型:long [int] -- 32位4字节/64位8字节 长长整型:long long…...
Docker部署Jenkins服务
文章目录 1.下载Jenkins服务2.部署Java21(可选)2.1 安装Java21 3.Maven3.9.9安装4.启动Jenkins5.初始化Jenkins5.1 入门5.2 安装推荐的插件5.3 创建第一个管理员用户5.4 实例配置5.5 Jenkins已就绪5.6 开始使用Jenkins5.7 重启Jenkins 6.配置Jenkins6.1 …...
【题解-Acwing】798. 差分矩阵
题目:798. 差分矩阵 题目描述 输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1)和 (x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加…...
linux环境下的硬盘分区格式化工具介绍 fdisk,gdisk,parted,cfdisk,cgdisk,sfdisk,gparted 笔记250407
linux环境下的硬盘分区格式化工具介绍 fdisk,gdisk,parted,cfdisk,cgdisk,sfdisk,gparted 笔记250407 以下是 Linux 系统中常用的 硬盘分区与格式化工具,涵盖命令行和图形界面工具,按功能分类整理: 一、分区管理工具 1. 命令行工具 工具功能…...
Ubuntu 24.04 LTS系统安装RTX 4090显卡驱动和cuda并部署ollama下载DeepSeek模型【自用详细版】
自己捣鼓玩玩哈,正好有机子 1. 安装驱动前的系统配置工作 卸载原有驱动并禁用nouveau sudo apt remove --purge nvidia*sudo cp /etc/modprobe.d/blacklist.conf /etc/modprobe.d/blacklist.conf.backup //备份文件sudo vim /etc/modprobe.d/blacklist.conf //修…...
FogFL: Fog-Assisted Federated Learning for Resource-Constrained IoT Devices
摘要 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 -在本文中,我们提出了一个支持雾的联邦学习框架–FogFL–来促进资源受限的物联网环境中延迟敏感应用的分布式学习。联邦学习(FL)是一种流行的分…...
音视频入门基础:RTCP专题(2)——RTCP协议简介(上)
一、引言 本文对RTCP协议进行简介。在简介之前,请各位先下载RTCP的官方文档《RFC 3550》。《RFC 3550》总共有89页。本文下面所说的“页数”是指在pdf阅读器中显示的页数: 二、RTCP协议简介 本段内容对应《RFC 3550》的第6节。根据《RFC 3550》第17页&…...
oklink js逆向(入口定位)
分析api请求,定位参数 X-Apikey 搜索关键字apikey,发现结果太多 结合搜索结果,搜索关键字 apikey(,只找到5个 断点后定位 可见使用了字符串混淆,所以搜索不到 x-apikey 还可以通过搜索 headers,追踪调用栈的…...
go原子操作和锁的区别是什么?
在Go语言中,原子操作和锁都是用于实现并发编程的同步机制,但它们的工作方式和适用场景有所不同。下面是它们的主要区别: 1. 原子操作(Atomic Operations) 定义:原子操作是一种不可分割的操作,…...
QtConcurrent
以下是 QtConcurrent 的一些常见用法示例: QtConcurrent::run QtConcurrent::run 是最常用的函数,用于在单独的线程中运行一个函数。 运行普通函数 #include <QtConcurrent> #include <QDebug> #include <QThread>void myFunction…...
Git 仓库在内网与 Gitee 间迁移及同步记录
Git 仓库在内网与 Gitee 间迁移及同步记录 在软件开发过程中,常常会遇到需要将代码仓库进行迁移或同步的情况。近期我就碰到了要把 Gitee 代码仓库移植到内网代码仓库,并且后续还得进行同步的需求。这里把整个过程记录下来,方便以后自己参考…...
如何保证mysql和redis的数据一致性
保证 MySQL 和 Redis 的数据一致性是分布式系统中常见的挑战,因为 Redis 作为缓存层,可能存在与底层数据库数据不一致的情况。以下是几种常用的方案及其优缺点对比: 1. 缓存更新策略 (1) Cache-Aside Pattern(旁路缓存模式&#…...
Java学习——day23(反射的对象创建与方法调用)
文章目录 1. 使用反射实例化对象1.1 利用无参构造函数创建对象1.2利用带参构造函数创建对象 2.通过反射调用对象方法2.1 调用公共方法2.2 调用私有方法(需设置访问权限)3. 访问和修改对象的属性3.1 公共属性3.2 私有属性 4. 实践任务4.1工厂类 SimpleFac…...
遇到无法连接香港服务器可能是什么原因导致的呢
遇到无法连接香港服务器的情况时,别急着重启或联系客服,先搞清楚到底是哪里断了链条。问题可能出在服务器本身,也可能是你的本地网络、路由路径、DNS、甚至运营商的“干预”。以下是常见的几个可能原因,建议你可以逐一排查&#x…...
Python----计算机视觉处理(Opencv:道路检测完整版:透视变换,提取车道线,车道线拟合,车道线显示,)
Python----计算机视觉处理(Opencv:道路检测之道路透视变换) Python----计算机视觉处理(Opencv:道路检测之提取车道线) Python----计算机视觉处理(Opencv:道路检测之车道线拟合) Python----计算机视觉处理࿰…...
javaweb自用笔记:Maven分模块设计与开发、Maven继承与聚合、Maven私服
Maven分模块设计与开发 Maven继承与聚合 继承 版本锁定 dependencies引入依赖,dependencyManagement不代表依赖被引入,如果要使用dependencyManagement下的依赖,还需要在dependencies里面定义 聚合 如果没有用聚合,将这个项目打…...
在PyCharm中出现 **全角字符与非英文符号混合输入** 的问题
在PyCharm中出现 全角字符与非英文符号混合输入 的问题(如 124345dfs$¥cvd)࿰…...
数字身份DID协议:如何用Solidity编写去中心化身份合约
本文提出基于以太坊的自主主权身份(SSI)实现方案,通过扩展ERC-734/ERC-735标准构建链上身份核心合约,支持可验证声明、多密钥轮换、属性隐私保护等特性。设计的三层架构体系将身份控制逻辑与数据存储分离,在测试网环境…...
Linux的RPM包管理详解
Linux的RPM包管理详解 引言 RPM(Red Hat Package Manager)是Linux系统中一种重要的软件包管理工具,它以“.rpm”为扩展名,广泛应用于基于Red Hat的Linux发行版,如CentOS、Fedora、openSUSE等。RPM包不仅简化了软件包…...
其它理论原则
ABC理论 假设(Assumption)影响行为(Behavior),行为最终影响结果(Consequence)。 如果产品经理认为同事是一个不讲道理的人,那么产品经理在和他交流时就会产生抵触的行为,…...
C++中的类和对象(上)
1 类的定义 1.1 类定义的格式 1 class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省 略》。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数…...
LLaMA-Factory 数据集成从入门到精通
一、框架概述 LLaMA-Factory 框架通过Alpaca/Sharegpt双格式体系实现多任务适配,其中Alpaca专注结构化指令微调(含SFT/DPO/预训练),Sharegpt支持多角色对话及多模态数据集成。核心配置依托 dataset_info.json 实现数据源映射、格…...
高级:JVM面试题深度剖析
一、引言 在Java技术面试中,JVM(Java虚拟机)相关知识是考察重点之一。深入理解JVM的内存模型、垃圾回收机制、类加载机制等,不仅能帮助开发者优化Java应用性能,还能在面试中展现深厚的技术功底。本文将针对这些高频知…...
Spring MVC 中 @ResponseBody 注解深度使用教程
一、注解核心作用 ResponseBody 是 Spring MVC 中处理 响应体内容 的核心注解,主要功能: 跳过视图解析器:直接返回数据而非视图名称自动数据转换:根据返回值类型自动转换响应格式(JSON/XML/纯文本)RESTfu…...
数据结构第一轮复习--第七章查找(包含课程代码)
基于数组实现顺序查找代码 //顺序查找的实现 typedef struct{ //查找表的数据结构(顺序表) ElemType *elem; //指向开辟的动态数组基址 (起始地址) int TableLen; //表的长度 }SSTable; //顺序查找 int Search_Seq(SSTable ST…...
Springboot JPA 集成ShardingSphere
Spring Boot集成JPA与ShardingSphere可通过以下步骤实现分库分表功能,需重点关注依赖配置、分片规则定义及JPA适配问题: 一、依赖配置 1. 引入核心依赖 在pom.xml中添加ShardingSphere和JPA相关依赖: <!-- ShardingSphere JDBC --&…...
详细介绍javaspringboot操控redis的高级特性1. 事务支持2. 发布/订阅3. Pipeline批量操作
Spring Boot 对 Redis 的操作提供了丰富的高级特性,以下是对事务支持、发布 / 订阅、Pipeline 批量操作的详细介绍: 事务支持 原理:Redis 事务是一个单独的隔离操作,它可以包含多个命令,这些命令要么全部执行&#x…...