动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南
目录
一、典型案例:系统发布后的GC雪崩事件
(一)故障现象
1. 刚刚启动时 GC 次数较多
2. 堆内存锯齿状波动
3. GC日志特征:Allocation Failure
(二)问题定位
二、原理深度解析:JVM内存弹性机制的三层矛盾
(一)堆伸缩核心机制
1. 内存扩展和收缩的核心机制
1.1 扩展堆内存
1.2 收缩堆内存
2. 扩展与收缩的阈值计算
2.1 扩展阈值
(二)多代际协同问题
1. 响应差异与协同问题
2. 晋升风暴的发生机制
(三)多代际协同问题参数处理
1. 优化内存配置,平衡代际的大小
2. 优化垃圾回收策略
3. 调整 Metaspace 配置
三、解决方案重提
(一)定位手段
(二)解决方案
四、思考立体化解决方案:从被动响应到主动防御
(一)从被动响应到主动防御的转变
1.被动响应
1.1 传统的内存配置
1.2 监控与报警
2.主动防御
2.1 自动调节与弹性伸缩
2.2 智能化内存管理
2.3 自动化的 GC 调优
3. 立体化的防御机制
3.1 自动监控与预警系统
3.2 智能资源调度与负载均衡
3.3 弹性 GC 策略
3.4 动态内存预留与提前扩展
五、总结
干货分享,感谢您的阅读!
随着微服务架构和云原生技术的广泛应用,JVM(Java虚拟机)的内存管理问题越来越复杂,尤其是在大规模分布式环境下,如何高效稳定地管理内存成为系统稳定性和性能的关键之一。在高并发、高负载的场景下,JVM的堆内存伸缩和垃圾回收机制(GC)常常会带来突发的性能瓶颈,导致系统崩溃或性能严重下降,尤其是当内存压力急剧变化时。
本文通过分析一例支付系统的GC雪崩事件,深入探讨JVM内存伸缩和多代际协同的问题,揭示了系统内存管理中的多重矛盾,并提出从被动响应到主动防御的转变,提出一套立体化的解决方案,旨在帮助开发者和运维人员在复杂的内存管理场景中实现更高效、更稳定的内存管理。
历史主要基本文章回顾:
涉猎内容 | 具体链接 |
Java GC 基础知识快速回顾 | Java GC 基础知识快速回顾-CSDN博客 |
垃圾回收基本知识内容 | Java回收垃圾的基本过程与常用算法_java垃圾回收过程-CSDN博客 |
CMS调优和案例分析 | CMS垃圾回收器介绍与优化分析案列整理总结_cms 对老年代的回收做了哪些优化设计-CSDN博客 |
G1调优分析 | Java Hotspot G1 GC的理解总结_java g1-CSDN博客 |
ZGC基础和调优案例分析 | 垃圾回收器ZGC应用分析总结-CSDN博客 |
从ES的JVM配置起步思考JVM常见参数优化 | 从ES的JVM配置起步思考JVM常见参数优化_es jvm配置-CSDN博客 |
深入剖析GC问题:如何有效判断与排查 | 深入剖析GC问题:如何有效判断与排查_排查java堆中大对象触发gc-CSDN博客 |
高频面试题汇总 | JVM高频基本面试问题整理_jvm面试题-CSDN博客 |
一、典型案例:系统发布后的GC雪崩事件
(一)故障现象
支付系统在K8s集群自动扩容后出现服务抖动,监控系统捕获到以下异常数据:
1. 刚刚启动时 GC 次数较多
最直观的表现为,刚刚启动时 GC 次数较多,从正常时段的4次/小时激增至32次/小时
2. 堆内存锯齿状波动
Committed Memory呈现明显锯齿状波动,堆内各个空间的大小会被调整如下:
3. GC日志特征:Allocation Failure
GC Cause 一般为 Allocation Failure,且在 GC 日志中会观察到经历一次 GC ,堆内各个空间的大小会被调整:
(二)问题定位
当 JVM 的 -Xms
(初始堆大小)与 -Xmx
(最大堆大小)不一致时,服务启动初期,JVM 堆会按照 -Xms
设置的大小分配内存。如果在运行过程中需要更多内存,JVM 会通过向操作系统申请更多空间。这时,如果堆内存不足,JVM 会触发一次 GC(通常是 Allocation Failure),并且堆的空间会根据需求进行动态调整。
具体来说,JVM 在扩展堆空间时,会根据当前堆的使用情况来决定是否需要增长堆内存,或者在空间过多时进行缩容。此过程由堆内存的管理策略(如 -XX:MinHeapFreeRatio
和 -XX:MaxHeapFreeRatio
)控制,调节这些参数可以控制扩容和缩容的时机。
二、原理深度解析:JVM内存弹性机制的三层矛盾
(一)堆伸缩核心机制
在现代 Java 应用中,JVM 内存管理是保证系统高效运行的关键因素之一。JVM 会根据应用的内存需求动态调整堆内存的大小,以提高内存利用率并避免浪费。然而,堆内存的伸缩并不是简单的操作,它涉及到内存的扩展与收缩机制,特别是在内存压力较大的情况下,如何动态伸缩内存成为一个复杂的问题。
1. 内存扩展和收缩的核心机制
JVM 使用 -Xms
和 -Xmx
两个参数来设置堆内存的初始值和最大值。当堆内存不足时,JVM 会根据当前堆的使用情况和内存压力,决定是否向操作系统申请更多内存。
1.1 扩展堆内存
当堆内存的使用率低于设定的扩展阈值(由 MinHeapFreeRatio
控制),JVM 会扩展堆内存。扩展过程通常是通过 GenCollectedHeap::expand_heap_and_allocate()
方法实现的:
HeapWord* GenCollectedHeap::expand_heap_and_allocate(size_t size, bool is_tlab) {HeapWord* result = NULL;if (_old_gen->should_allocate(size, is_tlab)) {result = _old_gen->expand_and_allocate(size, is_tlab);}if (result == NULL) {if (_young_gen->should_allocate(size, is_tlab)) {result = _young_gen->expand_and_allocate(size, is_tlab);}}assert(result == NULL || is_in_reserved(result), "result not in heap");return result;
}
如果老年代无法满足分配需求,JVM 会尝试扩展年轻代的空间。扩展操作会在堆的使用超过当前阈值时触发,通常是根据当前堆已提交空间的比例来决定。
1.2 收缩堆内存
当堆内存的使用低于设定的收缩阈值(由 MaxHeapFreeRatio
控制),JVM 会尝试收缩堆内存。收缩机制会调整堆的大小,以提高内存使用效率。
2. 扩展与收缩的阈值计算
2.1 扩展阈值
JVM 通过 MinHeapFreeRatio
来设置扩展阈值,当当前堆内存的使用低于这个阈值时,JVM 会触发扩展:
2.2 收缩阈值
JVM 通过 MaxHeapFreeRatio
设置收缩阈值,当堆内存使用高于这个阈值时,JVM 会尝试收缩堆内存:
(二)多代际协同问题
在 JVM 内存伸缩的过程中,除了堆的整体大小变化,还需要考虑不同内存代际(年轻代、老年代和 Metaspace)的协调问题。由于每个代际的扩展和响应速度不同,可能会导致内存压力的传播,并产生连锁反应,尤其是在内存需求急剧变化时。
1. 响应差异与协同问题
-
年轻代的响应:年轻代对内存压力变化非常敏感,扩展速度较快,通常在几百毫秒内就能响应变化。当内存压力突增时,年轻代可能会迅速扩展,导致更多对象被晋升到老年代,形成所谓的“晋升风暴”。
-
老年代的响应:相比年轻代,老年代的扩展响应较慢,通常需要几秒钟时间。因此,在内存突增的情况下,老年代可能无法及时跟上年轻代的扩展,最终导致老年代内存压力加大,触发 Full GC 或 OOM 错误。
-
Metaspace的响应:Metaspace 主要存储类的元数据,扩展响应最慢,通常需要 5 秒甚至更长时间。这种延迟使得 Metaspace 在内存压力剧增时不能及时响应,进一步加剧内存压力。
2. 晋升风暴的发生机制
由于年轻代、老年代和 Metaspace 在内存扩展时的响应差异,突发流量下容易发生 晋升风暴。当年轻代扩展过快,导致大量对象晋升到老年代时,老年代由于扩展较慢,无法及时消化这些对象,从而加大老年代的内存压力,最终可能触发 Full GC。
(三)多代际协同问题参数处理
要避免因内存扩展的响应差异引发的“晋升风暴”问题,需要采取一些策略来控制堆内存的使用和调整代际的内存分配应对措施:
1. 优化内存配置,平衡代际的大小
为了避免由于年轻代和老年代之间的内存不平衡而引发晋升风暴,可以调整内存代际的大小比例,确保内存分配符合实际应用需求。
-
调整年轻代和老年代的比例:可以通过
-XX:NewRatio
参数来调整年轻代和老年代的比例。例如,-XX:NewRatio=2
会让年轻代和老年代的比例为 1:2。合理的代际比例可以避免年轻代扩展过快导致对象迅速晋升到老年代。 -
调整
-XX:MaxNewSize
和-XX:NewSize
:确保年轻代的初始大小和最大大小合理,避免内存扩展过快。过小的年轻代会导致更多对象晋升到老年代,从而加重老年代的压力。 -
合理配置老年代的内存:根据应用需求调整老年代的内存大小,确保老年代能够及时响应内存压力。可以使用
-XX:MaxOldSize
来限制老年代的最大内存大小。
2. 优化垃圾回收策略
JVM 提供了不同的垃圾回收器,每个回收器在不同场景下的表现不同。针对晋升风暴问题,可以考虑选择合适的 GC 策略,并进行优化。
-
使用 G1 垃圾回收器:G1 是针对大堆内存和多核处理器优化的垃圾回收器。它能够在后台按需进行堆内存回收,减少 Full GC 的发生。G1 GC 可以通过设置
-XX:InitiatingHeapOccupancyPercent
来调整触发并行回收的阈值,避免老年代内存压力过大。 -
调整
-XX:MaxGCPauseMillis
和-XX:G1HeapRegionSize
:这些参数可以帮助 G1 更好地平衡年轻代和老年代的垃圾回收,减少晋升风暴的发生。 -
调节 CMS 收集器的老年代收集行为:如果你使用的是 CMS 收集器,可以通过调整
-XX:CMSInitiatingOccupancyFraction
来控制老年代开始收集的时机,避免过度占用老年代内存。
3. 调整 Metaspace 配置
由于 Metaspace 对内存压力的响应较慢,特别是在类加载较多的应用中,可以考虑以下配置来减缓 Metaspace 的内存压力:
-
增加 Metaspace 的大小:可以通过
-XX:MetaspaceSize
和-XX:MaxMetaspaceSize
配置 Metaspace 的初始大小和最大大小。合理配置 Metaspace 的大小,避免在类加载高峰时触发频繁的 Full GC。 -
监控类加载和卸载:特别是在微服务架构下,类的动态加载和卸载频繁时,要留意 Metaspace 使用情况。如果发现 Metaspace 内存接近最大值,可以适当调整应用的类加载策略,避免类加载过多导致内存压力。
避免晋升风暴的发生,主要依赖于合理配置内存和垃圾回收器、优化内存分配比例、减少突发流量的内存压力以及及时监控系统的内存状态。
三、解决方案重提
(一)定位手段
要诊断堆内存扩展和收缩带来的问题,关键是观察 CMS GC 的触发时间点。重点查看 Old Generation 和 MetaSpace 区域的 committed
内存占比是否稳定,或者观察整个堆的内存使用率是否存在波动。如果这两个区域的 committed
内存占比过高或过低,可能暗示内存伸缩的不稳定或过度扩展。
(二)解决方案
为了避免堆内存的不稳定伸缩,可以采用以下策略:
-
固定堆内存大小:确保堆内存的初始大小和最大大小一致,避免在运行时频繁扩展和收缩。可以将
-Xms
和-Xmx
设置为相同的值,减少内存伸缩引发的 GC 次数。 -
统一配置内存参数:对于堆的其他区域(如年轻代和 Metaspace),确保相应的配置参数成对设置,并尽量固定。具体来说:
- 设置
-XX:MaxNewSize
和-XX:NewSize
,保证年轻代的初始大小和最大大小一致。 - 设置
-XX:MetaSpaceSize
和-XX:MaxMetaSpaceSize
,确保 MetaSpace 区域在负载变化时稳定,不会因为过度收缩而导致内存紧张。
- 设置
通过这些策略,可以有效避免因堆内存不稳定伸缩而导致的性能波动,从而提高 JVM 的稳定性。至于晋升风暴按实际情况进行调整即可,本次线上问题暂不涉及。
四、思考立体化解决方案:从被动响应到主动防御
在解决 JVM 内存伸缩及多代际协同问题时,传统上很多策略倾向于通过被动响应来处理内存不足和 GC 压力,如通过手动配置堆内存参数、优化 GC 策略等。这种方法通常在问题发生后进行处理,存在一定的滞后性。而在云原生环境及现代微服务架构中,内存压力、垃圾回收等问题的突发性较强,依赖于单一的被动响应策略已经无法满足高可靠性的需求。因此,主动防御机制逐渐成为主流,能够通过提前预判、智能调节和实时优化,有效防止问题的发生。
(一)从被动响应到主动防御的转变
1.被动响应
1.1 传统的内存配置
通常依赖静态的内存配置参数(如 -Xms
、-Xmx
)和手动调整的 GC 策略,随着负载增加和内存压力增大,系统会被动触发 GC 操作,尽管能够解决部分问题,但这依赖于手动配置和调优,缺乏灵活性和实时响应能力。
1.2 监控与报警
系统通过对内存使用情况的实时监控进行报警提示,帮助运维人员及时响应内存超限或 GC 频繁的情况,进而采取措施。但这种方法需要人工干预,且一旦出现问题,响应的时机已经错过,不能真正做到预防。
2.主动防御
2.1 自动调节与弹性伸缩
结合 Kubernetes 等容器编排工具,云原生环境中的 JVM 可以根据当前负载自动调整容器内存限制、GC 策略和资源分配。通过提前设定合理的阈值和自动伸缩策略,在内存使用达到临界点时,系统会自动进行资源扩展,而不是等待内存使用达到极限时才触发扩容。
2.2 智能化内存管理
基于 APM(应用性能管理)工具和机器学习算法,智能化地预测内存需求并进行资源预分配。例如,通过分析应用负载的变化趋势,提前调整年轻代、老年代和 Metaspace 的配置,甚至智能选择适合的垃圾回收算法,以避免突发内存压力的发生。
2.3 自动化的 GC 调优
通过结合 JVM 的自动调优功能,实时监控各代际的内存使用情况和 GC 压力,系统可以动态调整 GC 策略,例如在内存压力较大时自动切换到 G1 GC 或 ZGC 等低暂停时间的垃圾回收器。这些策略可以减少停顿时间,并降低由于 GC 引发的性能瓶颈。
3. 立体化的防御机制
3.1 自动监控与预警系统
自动化监控与预警系统不仅依赖于简单的内存使用率监控,更进一步加入内存申请速率、GC 次数和内存碎片等监控指标,结合机器学习预测模型,通过对历史数据的分析,预测未来的内存需求和垃圾回收的影响,并主动调节资源配置,防止内存突增。
3.2 智能资源调度与负载均衡
通过容器化平台的自动化资源调度和负载均衡功能,动态调整 Pod 或容器的内存限制与 CPU 配置,避免某一单元的内存压力过大引发整个应用的性能问题。例如,Kubernetes 可以通过 Horizontal Pod Autoscaler 或 Vertical Pod Autoscaler(VPA)根据实时负载自动扩展或缩减应用的资源配置,做到按需分配资源。
3.3 弹性 GC 策略
基于不同负载条件自动切换适合的 GC 策略,可以避免长时间的 Full GC 导致内存资源紧张。例如,在低延迟要求的应用中,可能需要选择 G1 GC 或 ZGC,而在内存压力较大的情况下,可以选择 CMS 或 Shenandoah 等适合高并发的 GC 策略,最大化内存使用效率。
3.4 动态内存预留与提前扩展
根据应用的内存历史记录和当前负载预测,提前进行内存预留或自动扩展。比如,可以设置在内存使用率达到一定比例时,提前为 JVM 预分配额外的内存空间,避免因资源不足导致的系统崩溃
五、总结
通过本案例的分析,我们发现 JVM 内存管理中的伸缩机制、垃圾回收策略和代际协同等因素,往往是导致系统故障的根本原因。通过细致的故障定位和问题分析,我们不仅可以明确问题的发生机制,还能够根据具体场景采取相应的优化措施。
本文提出的从被动响应到主动防御的转变,为解决内存压力问题提供了更加前瞻和灵活的解决方案。结合自动化调节、智能监控、资源弹性调度等手段,可以大幅减少由于突发内存压力导致的系统崩溃和性能下降问题。同时,合理配置堆内存大小、优化代际内存分配、选择合适的垃圾回收策略,也是保证 JVM 稳定运行的必要手段。
最终,本文通过分析和总结,明确了避免 JVM 内存管理故障的立体化防御机制,旨在为广大开发者提供一种新的思路和方法,以应对日益复杂的内存管理挑战,提升系统的稳定性和可靠性。
相关文章:
动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南
目录 一、典型案例:系统发布后的GC雪崩事件 (一)故障现象 1. 刚刚启动时 GC 次数较多 2. 堆内存锯齿状波动 3. GC日志特征:Allocation Failure (二)问题定位 二、原理深度解析:JVM内存弹…...
本地运行Manus的替代方案:OpenManus的技术解析与实践指南
无需邀请码,三小时构建的开源智能体革命 一、背景:从Manus到OpenManus的技术突围 近期,AI智能体领域因Manus的发布引发热议。这款号称“全球首个通用型AI智能体”的产品,通过整合浏览器操作(Browser Use)…...
红果短剧安卓+IOS双端源码,专业短剧开发公司
给大家拆解一下红果短剧/河马短剧,这种看光解锁视频,可以挣金币的短剧APP。给大家分享一个相似的短剧APP源码,这个系统已接入穿山甲广告、百度广告、快手广告、腾讯广告等,类似红果短剧的玩法,可以看剧赚钱,…...
ubuntu22.04本地部署OpenWebUI
一、简介 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线运行。它支持各种 LLM 运行器,如 Ollama 和 OpenAI 兼容的 API,并内置了 RAG 推理引擎,使其成为强大的 AI 部署解决方案。 二、安装 方法 …...
不同开发语言之for循环的用法、区别总结
一、Objective-C (1)标准的c风格 for (int i 0; i < 5; i) {NSLog("i %d", i); } (2)for in循环。 NSArray *array ["apple", "banana", "orange"]; for (NSString *fruit in …...
国产编辑器EverEdit - 宏功能介绍
1 宏 1.1 应用场景 宏是一种重复执行简单工作的利器,可以让用户愉快的从繁琐的工作中解放出来,其本质是对键盘和菜单的操作序列的录制,并不会识别文件的内容,属于无差别无脑执行。 特别是对一些有规律的重复按键动作,…...
【Linux跬步积累】—— 网络基础
🌏博客主页:PH_modest的博客主页 🚩当前专栏:Linux跬步积累 💌其他专栏: 🔴 每日一题 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮࿰…...
【银河麒麟高级服务器操作系统实例】虚拟机桥接网络问题分析及处理
更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…...
深入剖析Android Service:原理、生命周期与实战应用
一、引言:开启 Service 探索之旅 在 Android 开发的广袤天地中,Service 堪称一颗璀璨的明星,占据着举足轻重的地位。它宛如一位幕后英雄,默默地在后台辛勤劳作,执行着各种至关重要的任务,却无需与用户进行…...
MLT媒体程序框架03:滤镜——loudness
EBU R.128协议 引用链接 EBU的全称为European Broadcasting Union ,既欧洲广播联盟,为欧洲与北非各广播业者(包含广播电台与电视台)的合作组织,成立于1950年2月12日,有五十多个正式加盟国,总部位于瑞士日内瓦,目前中国…...
FreeRTOS第15篇:FreeRTOS链表实现细节03_List_t与ListItem_t的奥秘
文/指尖动听知识库-星愿 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:深入FreeRTOS内核:从原理到实战的嵌入式开发指南 1 FreeRTOS列表的核心数据结构 FreeRTOS的列表实现由两个关键结构体组成:List_t(列表)和ListItem_t(列表项)。它们共同…...
Spring Boot静态资源访问顺序
在 Spring Boot 中,static 和 public 目录都用于存放静态资源(如 HTML、CSS、JavaScript、图片等文件),但它们在使用上有一些细微的区别。以下是它们的详细对比: 1. 默认优先级 Spring Boot 会按照以下优先级加载静态…...
什么是 spring 的循环依赖?
什么是 spring 的循环依赖? 首先,认识一下什么是循环依赖,举个例子:A 对象被 Spring 管理,并且引入的 B 对象,同样的 B 对象也被 Spring 管理,并且也引入的 A 对象。这种相互被引用的情况&#…...
RSA的理解运用与Pycharm组装Cryptodome库
1、RSA的来源 RSA通常指基于RSA算法的密码系统,令我没想到的是,其名字的来源竟然不是某个含有特别意义的单词缩写而成(比如PHP:Hypertext Preprocessor(超文本预处理器)),而是由1977年提出该算法的三个歪果…...
AI数据分析:deepseek生成SQL
在当今数据驱动的时代,数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展,AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行自动补全SQL 查询语句。 我们都知道,SQL 查询语…...
git的坑
不小心把工作区的代码全删掉了 首先是名字出错,不知为何gitee任意把我的名字更改。 导致无法push验证 git push -u origin "master 显示:fatal: Authentication failed for https://gitee.com/zhang-great/stm32-smart-security-system.git/ 我…...
小程序事件系统 —— 32 事件系统 - 事件分类以及阻止事件冒泡
在微信小程序中,事件分为 冒泡事件 和 非冒泡事件 : 冒泡事件:当一个组件的事件被触发后,该事件会向父节点传递;(如果父节点中也绑定了一个事件,父节点事件也会被触发,也就是说子组…...
PLC数据类型和C#数据类型的数据类型映射表
数据类型映射表 PLC数据类型C#数据类型读取方式补充说明BitboolDBX布尔值BytebyteDBB单字节无符号整数WordushortDBW16位无符号整数DWorduintDBD32位无符号整数Intshort16位有符号整数DIntint32位有符号整数RealfloatDBR单精度浮点数LRealdoubleDBL双精度浮点数Stringstr…...
全球首创!微软发布医疗AI助手,终结手写病历时代
今天凌晨,微软发布了医疗界首个用于临床工作流程的AI助手Microsoft Dragon Copilot。 Dragon Copilot是基于语音文本的混合架构,能够将医生的语音或临床口述内容实时转换为文本。例如,医生可以通过语音输入患者的病历信息、医嘱或诊断结果&a…...
每日一题----------异常处理
总结: NullPointerException:尝试使用一个空引用进行操作时抛出。 ArrayIndexOutOfBoundsException:数组下标越界时抛出。 ClassCastException:类型转换失败时抛出。 ArithmeticException:数学运算错误时抛出&#…...
HTML 属性(详细易懂)
HTML(超文本标记语言)是用于创建网页和其他可在浏览器中查看的内容的基础标记语言。HTML 属性是 HTML 元素的额外信息,它们提供了元素的更多细节,如元素的标识符、样式、行为等。在本文中,将详细介绍 HTML 属性&#x…...
基于火山引擎的DeepSeek-V3 api实现简单的数据查询功能
前言 现在ai比较火,ai可以极大的提高大家的工作效率,所以有空的话要学习下ai的使用 火山引擎大模型 火山引擎大模型广场,聚集了市面上常见的基座大模型,每个模型都有50Wtokens的免费调用量,可以方便大家调用 账号登…...
AI入门1:关键概念
1. 基础概念 AI(Artificial Intelligence,人工智能) 模拟人类智能的机器系统,具备学习、推理、决策等能力。 Machine Learning(机器学习,ML) 让计算机通过数据自动学习规律,…...
WPS工具栏添加Mathtype加载项
问题描述: 分别安装好WPS和MathType之后,WPS工具栏没直接显示MathType工具,或者是前期使用正常,由于WPS更新之后MathType工具消失,如下图 解决办法 将文件“MathType Commands 2016.dotm”和“MathPage.wll”从Matht…...
【MySQL-数据类型】数据类型分类+数值类型+文本、二进制类型+String类型
一、数据类型分类 二、数值类型 1.bit类型 测试环境ubuntu 基本语法: bit[(M)]:位字段类型,M表示每个值的位数,范围从1~64;如果M被忽略,默认为1举例: create table testBit(id i…...
cuda矩阵转置算子(共享内存)
cpu版本 即为按行遍历行列互换 // 主机上的矩阵转置函数,用于验证结果 void cpuTranspose(const float *input, float *output, int n) {for (int row 0; row < n; row){for (int col 0; col < n; col){output[col * n row] input[row * n col];}} }gp…...
GB28181视频监控流媒体平台LiveGBS如何自定义收流端口区间以便减少收流端口数或解决端口冲突问题
LiveGBS GB28181流媒体服务在接收视频的时候默认是使用30000-30249, webrtc流播放端口区间默认是UDP的30250-30500区间。有些网络环境不方便开放这么大的端口区间,下面介绍下如何修改配置这个区间。 从页面上修改这个区间,端口区间尽量设置大…...
在Go语言中,判断变量是否为“空”(零值或未初始化状态)的方法总结
在Go语言中,判断变量是否为“空”(零值或未初始化状态)的方法因数据类型而异。以下是各类型变量的判断方法总结: 1. 基本类型 整数(int) 判断是否等于零值 0。 var i int if i == 0 { // 空 } 字符串(string) 判断是否等于空字符串 ""。 var s string if s =…...
VUE3开发-9、axios前后端跨域问题解决方案
VUE前端解决跨域问题 前端页面需要改写 如果无效,记得重启服务器 后端c#解决跨域问题 前端js取值,后端c#跨域_c# js跨域-CSDN博客...
利用 requestrepo 工具验证 XML外部实体注入漏洞
1. 前言 在数字化浪潮席卷的当下,网络安全的重要性愈发凸显。应用程序在便捷生活与工作的同时,也可能暗藏安全风险。XXE(XML外部实体)漏洞作为其中的典型代表,攻击者一旦利用它,便能窃取敏感信息、掌控服务…...
嵌入式开发之串行数据处理
前题 前面几篇文章写了关于嵌入式软件开发时,关于串行数据处理的一些相关内容,有兴趣的可以看看《嵌入式开发:软件架构、驱动开发与串行数据处理》、《嵌入式软件开发之生产关系模型》和《嵌入式开发之Modbus-RTU协议解析》相关的内容。从业十…...
深入解析 JVM —— 从基础概念到实战调优的全链路学习指南
文章目录 一、为什么要学习 JVM?1. 面试必备与技能提升2. 性能优化与问题诊断3. 编写高质量代码 二、JVM 基础概念与体系结构1. JVM 简介2. JDK、JRE 与 JVM 三、JVM 内存模型1. 线程私有区2. 线程共享区 四、类加载机制与双亲委派1. 类加载过程2. 双亲委派模型3. 动…...
LTC6804、LTC6811、LTC6813的使用
FSEC自制BMS第一步:从零开发使用LTC6804采集电池电压 LTC6811特性 LTC6811 是 LTC6804 的引脚兼容型升级器件,LTC6804官方已经不推荐选用 可测量多达 12 节串联电池 1.2mV 最大总测量误差 可堆叠式架构能支持几百个电池 内置 isoSPI™ 接口 可在 290μ…...
Spring 构造器注入和setter注入的比较
一、比较说明 在 Spring 框架中,构造器注入(Constructor Injection)和 Setter 注入(Setter Injection)是实现依赖注入(DI)的两种主要方式。它们的核心区别在于依赖注入的时机、代码设计理念以及…...
【LangChain】对话历史管理
1 历史记录的剪裁 trimmed_messages from langchain_core.messages import (AIMessage,HumanMessage,SystemMessage,trim_messages, ) from langchain_openai import ChatOpenAImessages [SystemMessage("youre a good assistant, you always respond with a joke."…...
【无人机三维路径规划】基于CPO冠豪猪优化算法的无人机三维路径规划Maltab
代码获取基于CPO冠豪猪优化算法的无人机三维路径规划Maltab 基于CPO冠豪猪优化算法的无人机三维路径规划 一、CPO算法的基本原理与核心优势 冠豪猪优化算法(Crested Porcupine Optimizer, CPO)是一种新型元启发式算法,其灵感来源于冠豪猪的…...
CAN协议介绍
目录 一、CAN协议 1.1 CAN协议简介 1.2 CAN物理层 1.3 CAN协议层 二、CAN控制器 2.1 CAN控制内核 2.2 CAN发送邮箱 2.3 CAN接收FIFO 2.4 CAN验收筛选器 一、CAN协议 1.1 CAN协议简介 CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生…...
树莓派 Interface Option 中没有camera选项
最近重温树莓派的视觉,烧录了树莓派的新系统后发现在 raspi-config 中的 Interface Option 没有 camera 选项,同时在终端用 vcgencmd get_camera 查看摄像头时没有检测到树莓派的 CSI 摄像头,在 Thonny 中调用树莓派摄像头出现报错࿱…...
大数据学习(55)-BI工具数据分析的使用
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
轻松上手 —— 通过 RPM 包快速部署 NebulaGraph
前言 在当今大数据时代,处理复杂关系数据的需求与日俱增,图数据库应运而生并逐渐崭露头角。NebulaGraph 作为一款高性能、分布式且易扩展的图数据库,专为应对大规模图数据处理而精心打造。它不仅具备丰富的查询语言,还拥有强大高效…...
nginx作为下载服务器配置
一、Nginx 作为下载服务器配置笔记 基本配置指令 server块配置: 在 Nginx 的配置文件(通常是/etc/nginx/nginx.conf或在/etc/nginx/conf.d/目录下的特定配置文件)中,首先需要定义一个server块来监听特定的端口并处理下载请求。例如…...
第六课:数据存储三剑客:CSV/JSON/MySQL
在Python的数据存储与处理领域,CSV、JSON和MySQL被广大开发者誉为“数据存储三剑客”。它们各自在不同的场景下发挥着重要作用,无论是简单的数据交换、轻量级的数据存储,还是复杂的关系型数据库管理,都能找到它们的身影。本文将详…...
Dify 开源大语言模型应用开发平台使用(一)
文章目录 一、创建锂电池专业知识解答应用1.1 应用初始化二、核心功能模块详解2.1 知识库构建2.2 工作流与节点编排节点类型说明工作流设计示例:锂电池选型咨询2.3 变量管理三、测试与调试3.1 单元测试3.2 压力测试3.3 安全验证四、部署与优化建议4.1 部署配置4.2 持续优化结论…...
PyQt高亮代码
PyQt高亮代码 安装 Pygments支持的格式支持的样式详解参考 Qt中使用 安装 Pygments Pygments 是Python中的一个高亮代码的包,挺好用的 pip install Pygments支持的格式 支持的格式比较多,不列出来了 # coding:utf-8 from pygments.lexers import get_all…...
小白学Agent技术[1]
文章目录 课程地址Agent介绍原理架构任务规划记忆工具使用程序开发范式的变化Agent开发注意事项 课程地址 Agent课程地址 Agent介绍 AI Agent(人工智能代理、AI智能体),一种模拟人类智能行为的人工智能系统,以大模型语言&#…...
以商业思维框架为帆,驭创业浪潮前行
创业者踏入商海,如同航海家奔赴未知海域,需有清晰的思维罗盘指引方向。图中“为什么—用什么—怎么做—何人做—投入产出”的商业框架,正是创业者破解商业谜题的密钥,从需求洞察到落地执行,为创业之路铺就逻辑基石。 …...
开源宝藏 Tigshop,开启电商新征程
在电商竞争愈发激烈的当下,一个强大且适配的商城系统是商家制胜的法宝。 Tigshop官网:Tigshop官网 - 开源商城系统Tigshop开源商城系统,支持b2b2c、多商户、多店铺、商家入驻、分销系统、跨境电商、连锁商城等解决方案,免费下载&…...
java多线程实现方式
目录 1. 继承 Thread 类 2. 实现 Runnable 接口 3. 实现 Callable 接口 4. 使用线程池 5. 使用 CompletableFuture(Java 8) 6. 使用 ForkJoinPool(Java 7) 7. 使用 Timer 和 TimerTask 8. 使用 ScheduledExecutorService …...
windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)
目录 1. git update-git-for-windows 报错2. 解决方案2.1. 更新 CA 证书库2.2. 使用 SSH 连接(推荐)2.3 禁用 SSL 验证(不推荐) 1. git update-git-for-windows 报错 LenovoLAPTOP-EQKBL89E MINGW64 /d/YHProjects/omni-channel-…...
python:pymunk + pygame 模拟六边形内小球弹跳运动
向 chat.deepseek.com 提问:编写 python 程序,用 pymunk, 有一个正六边形,围绕中心点缓慢旋转,六边形内有一个小球,六边形的6条边作为墙壁,小球受重力和摩擦力、弹力影响,模拟小球弹跳运动&…...