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

单次 CMS Old GC 耗时长问题分析与优化

目录

一、现象说明

二、CMS GC 机制简述

三、可能导致长时间停顿的原因详细分析

(一)Full GC(完全垃圾回收)

1. 主要原因

2.参数调整

(二)Promotion Failure(晋升失败)

1. 主要原因

2. 参数调整

(三)内存碎片化问题

1. 主要原因

2. 参数调整

(四)并发标记和清理阶段的问题

1. 主要原因

2. 参数调整

(五)GC 并行度不足

1. 主要原因

2. 参数调整

四、优化思路与方案

(一)增加 Old Generation 的内存

1. 背景与原因

2. 具体方案

(二)减少 Promotion Failure

1. 背景与原因

2. 具体方案

(三)减少内存碎片

1. 背景与原因

2. 具体方案

(四)增加 CMS 的并行度

1. 背景与原因

2. 具体方案

(五)切换到 G1 GC

1. 背景与原因

2. 具体方案

(六)使用 ZGC 或 Shenandoah GC

1. 背景与原因

2. 具体方案

五、总结


干货分享,感谢您的阅读!

在高并发的生产环境中,Java 应用通常依赖于垃圾回收机制(GC)来管理内存。CMS(Concurrent Mark-Sweep)垃圾回收器是一种较为常见的垃圾回收策略,它通过并行回收来降低停顿时间。然而,在某些情况下,CMS 的 Old GC(老年代回收)阶段会出现较长的停顿,甚至超过 1000ms,极端情况下可能达到 8000ms。这类长时间的 GC 停顿会严重影响系统的响应时间,并可能引发系统的雪崩效应,即多个服务由于 GC 停顿相互影响,导致整个系统性能下降。

历史主要基本文章回顾:

涉猎内容具体链接
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堆内存震荡:从原理到实践的GC调优指南

显式 GC 的使用:留与去,如何选择?

显式 GC 的使用:留与去,如何选择?

过早晋升的识别与优化实战

Java垃圾回收的隐性杀手:过早晋升的识别与优化实战

如何选取合适的 NewRatio 值

如何选取合适的 NewRatio 值来优化 JVM 的垃圾回收策略

解决 CMS Old GC 频繁触

解决 CMS Old GC 频繁触发优化 Java 性能的技术方案

高效解决MetaSpace OOM 问题

深入剖析 MetaSpace OOM 问题:根因分析与高效解决策略
高频面试题汇总JVM高频基本面试问题整理_jvm面试题-CSDN博客

一、现象说明

在一些高并发的生产环境中,GC 停顿时间的增加会直接影响应用的可用性。特别是在使用 CMS 回收器时,Old Generation 的垃圾回收经常会导致长时间的 STW(Stop-the-World)停顿。STW 阶段是指 JVM 停止所有用户线程进行垃圾回收工作,这一阶段的停顿时间如果过长,将严重影响系统的响应时间。

影响分析

  • 响应时间:GC 停顿时间过长时,用户请求可能会被阻塞,导致响应延迟。
  • 雪崩效应:多个服务由于 GC 停顿时间过长而相互影响,导致系统性能整体下降,甚至出现多个服务挂掉的情况。

这种问题虽然不是频繁发生,但一旦发生,会显著降低用户体验,尤其在对延迟敏感的应用中更为严重。因此,准确分析和优化 CMS Old GC 的 STW 停顿时间,是确保系统稳定性和高可用性的关键。

二、CMS GC 机制简述

在了解问题根源之前,我们首先回顾一下 CMS 的工作机制。CMS 是一种低停顿的垃圾回收器,旨在减少 Stop-the-World 时间。

为了避免长时间Stop the World,CMS采用了4个阶段来垃圾回收,分别是初始标记、并发标记、重新标记和并发清理。其中初始标记和重新标记,耗时很短,虽然会导致Stop the World,但是影响不大,然后并发标记和并发清理,两个阶段耗时最长,但是是可以跟系统的工作线程并发运行的,所以对系统没太大影响。具体图示如下:

如果细化的话,它的回收过程分为以下几个主要阶段:

  1. 初始标记(Initial Mark):这个阶段会进行 Stop-the-World,标记根对象。该阶段相对较快。
  2. 并发标记(Concurrent Mark):在这个阶段,JVM 会在用户线程运行的同时,标记所有活动对象。这是 CMS 的核心特性,它能够避免长时间的停顿。
  3. 并发预清理(Concurrent Preclean):该阶段会清理一些不再需要的对象。
  4. 重新标记(Remark):在这个阶段,JVM 需要暂停所有应用线程,重新标记在并发标记期间被修改的对象。
  5. 并发清理(Concurrent Sweep):清理标记过的垃圾对象,并回收内存空间。
  6. 并发重生(Concurrent Reset):用于回收 Old Generation 空间的恢复。

然而,尽管 CMS 的设计理念是减少停顿时间,在一些高并发或内存压力较大的环境下,CMS 仍然可能出现长时间的 STW 停顿,特别是在 Old Generation 的回收阶段。

三、可能导致长时间停顿的原因详细分析

(一)Full GC(完全垃圾回收)

当 Old Generation 空间不足时,JVM 会触发 Full GC(完全垃圾回收)。在 CMS 回收器中,Full GC 会清理整个堆(包括 Young 和 Old Generation),从而导致长时间的 STW 停顿。特别是在 Old Generation 中有大量活跃对象时,Full GC 可能会清理大量对象,导致 GC 停顿时间显著增加。

1. 主要原因

当 Old Generation 的内存压力较大时,JVM 可能无法有效回收足够的内存,导致需要进行 Full GC。而 CMS 的设计目标是减少 STW 时间,但 Full GC 的过程仍然是 Stop-the-World 的,意味着会暂停所有应用线程。

2.参数调整

// 调整 Old Generation 的大小
-XX:OldGenSize=4g   // 设置 Old Generation 内存为 4GB// 开启 Full GC 时的内存压缩
-XX:+UseCMSCompactAtFullCollection   // 在 Full GC 时进行内存压缩
  • 参数-XX:OldGenSize 用于指定 Old Generation 的大小。
  • 参数-XX:+UseCMSCompactAtFullCollection 用于在 Full GC 时进行内存压缩,减少碎片。

调优思路

  1. 增加 Old Generation 空间:通过增加 -XX:OldGenSize,可以降低频繁 Full GC 的概率。
  2. 分析 Full GC 日志:查看 Full GC 的日志,以了解是否是 Old Generation 空间不足导致了 Full GC。

如果日志中显示频繁发生 Full GC,并且 Old Generation 空间较小,可以通过增大 -XX:OldGenSize 来减少 Full GC 的触发频率。

[GC (Allocation Failure) [PSYoungGen: 8192K->832K(9216K)] 
[ParOldGen: 6656K->1510K(10240K)] 14848K->2332K(19456K), 0.0167736 secs]

在上面的 GC 日志中,Full GC 发生了,而 Old Generation 被清理了 6656K 的内存。如果此时 Old Generation 空间过小,可能会频繁触发 Full GC。

(二)Promotion Failure(晋升失败)

Promotion Failure 指的是在 CMS 回收过程中,如果 Young Generation 中的对象无法在足够的空间内晋升到 Old Generation,就会发生晋升失败。此时,JVM 会触发 Full GC,清理 Old Generation,以便腾出空间进行晋升。

1. 主要原因

CMS 在 Young Generation 回收时,若有大量对象需要晋升到 Old Generation,但 Old Generation 空间不足,则会发生 Promotion Failure,导致 GC 停顿时间增加。

2. 参数调整

// 控制晋升阈值,减少晋升失败
-XX:MaxTenuringThreshold=5   // 对象在 Young Generation 中存活 5 次后晋升// 调整 Survivor 区域的比例
-XX:SurvivorRatio=8   // Survivor 区与 Eden 区的比例为 8:1
  • 参数-XX:MaxTenuringThreshold 用于控制晋升到 Old Generation 的阈值。
  • 参数-XX:SurvivorRatio 用于调整 Young Generation 的大小比例,从而影响对象的晋升。

调优思路

  1. 减少对象晋升到 Old Generation 的频率:通过调整 -XX:MaxTenuringThreshold 参数,减少大量对象被晋升到 Old Generation,降低晋升失败的风险。
  2. 增加 Young Generation 大小:通过调整 -XX:SurvivorRatio-XX:NewSize 参数,优化 Young Generation 的大小,使更多对象在 Young Generation 中被回收。

如果日志显示频繁的 Promotion Failure,可以通过调整 -XX:MaxTenuringThreshold,将对象晋升阈值调整为更大的数值,或者通过增大 Young Generation 空间来减少晋升失败。

(三)内存碎片化问题

CMS 使用标记-清理算法,清理后会产生内存碎片。如果 Old Generation 中存在大量碎片,JVM 在清理时可能无法回收足够的连续内存块,从而导致 GC 停顿时间的增加。

1. 主要原因

在清理阶段,CMS 会标记活动对象并清理未被标记的垃圾对象,但标记-清理算法的一个问题是可能产生大量碎片,导致 Old Generation 空间无法有效回收连续的内存块。

2. 参数调整

// 开启 Full GC 时的内存压缩
-XX:+UseCMSCompactAtFullCollection   // 在 Full GC 时进行内存压缩// 控制堆的自由内存比例
-XX:MinHeapFreeRatio=40   // 最小空闲比例为 40%
-XX:MaxHeapFreeRatio=70   // 最大空闲比例为 70%
  • 参数-XX:+UseCMSCompactAtFullCollection 在 Full GC 时进行内存压缩,减少碎片。
  • 参数-XX:MinHeapFreeRatio-XX:MaxHeapFreeRatio 用于控制堆的自由内存比例,避免过多的碎片。

调优思路

  1. 开启内存压缩:通过开启 -XX:+UseCMSCompactAtFullCollection,确保 Full GC 期间进行内存压缩,减少碎片。
  2. 调整堆内存比例:通过调整 -XX:MinHeapFreeRatio-XX:MaxHeapFreeRatio 参数,减少碎片化的影响。

如果 Old Generation 中存在大量碎片,可以通过开启 -XX:+UseCMSCompactAtFullCollection 来减少 Full GC 时的碎片,或者通过调整堆内存比例来优化内存分配。

(四)并发标记和清理阶段的问题

CMS 的并发标记和清理阶段设计目的是在应用线程运行的同时,标记和清理不再使用的对象。然而,在高并发环境下,多个线程对内存的争用可能导致标记和清理过程变得低效,进而增加 STW 停顿时间。

1. 主要原因

在并发标记阶段,多个线程可能会争用资源,特别是在多核 CPU 环境中,CPU 核数较少时,标记和清理的并行度不足,可能导致整个 GC 过程变慢。

2. 参数调整

// 增加 CMS 的并行标记和清理线程数
-XX:ParallelCMSThreads=8   // 增加并发标记和清理的线程数
  • 参数-XX:ParallelCMSThreads 用于调整并发标记和清理阶段的线程数。

调优思路

  1. 增加并发线程数:通过增加 -XX:ParallelCMSThreads 参数,增加并发标记和清理的线程数,提升回收效率。
  2. 查看 GC 线程使用情况:通过监控 CPU 核数和线程利用率,确保多核资源得到充分利用。

(五)GC 并行度不足

如果系统的 CPU 核数较少,或者配置的 GC 并行度参数不足,CMS 的并行标记和清理阶段就无法充分并行化,导致 GC 效率低下,从而增加 STW 停顿时间。

1. 主要原因

当系统的 CPU 核数较少时,CMS 的并行度可能不足,无法充分利用多核资源,导致 GC 效率低下,从而增加停顿时间。

2. 参数调整

// 增加 GC 并行度,充分利用多核 CPU
-XX:ParallelGCThreads=8   // 设置并行 GC 线程数
  • 参数-XX:ParallelGCThreads 用于设置 GC 并行度。

调优思路

  1. 增加 GC 并行度:通过调整 -XX:ParallelGCThreads 参数,增加 GC 的并行度,提升回收效率。
  2. 合理分配 CPU 资源:确保系统的 CPU 资源能够充分用于 GC

四、优化思路与方案

(一)增加 Old Generation 的内存

1. 背景与原因

在 CMS 回收器中,Old Generation 是存储长期存在的对象的区域。如果 Old Generation 的空间不足,JVM 就会触发 Full GC。频繁的 Full GC 会导致长时间的 STW 停顿,进而影响系统的响应时间和吞吐量。因此,适当增加 Old Generation 的内存,可以有效避免频繁的 Full GC。

2. 具体方案

通过调整以下 JVM 参数,可以增加 Old Generation 的内存,并减少 Old GC 触发的频率:

// 增加 Old Generation 内存大小
-XX:OldGenSize=4g  // 设置 Old Generation 内存为 4GB// 调整 Old Generation 与 Young Generation 的比例
-XX:NewRatio=3  // 增加 Old Generation 比例,Young Generation 占 1/4 堆内存
  • -XX:OldGenSize:用于指定 Old Generation 的大小。通过增大该参数,减少 Full GC 的发生频率。
  • -XX:NewRatio:控制 Young Generation 与 Old Generation 的比例。默认值是 2,表示 Old Generation 占堆内存的 1/3。可以通过调整该参数来优化 Old Generation 和 Young Generation 之间的内存分配比例。

优化原理与效果:

  • 增大 Old Generation:当 Old Generation 空间增大时,老年代对象能够得到更长时间的存活,不容易触发 Full GC。减少 Full GC 的触发频率有助于降低 STW 停顿的发生。
  • 优化内存分配:通过调整 -XX:NewRatio 参数,合理分配 Old Generation 和 Young Generation 的内存,可以避免 Young Generation 空间不足引发的晋升失败(Promotion Failure),并减少晋升到 Old Generation 的压力。

(二)减少 Promotion Failure

1. 背景与原因

Promotion Failure 是指 Young Generation 中的对象无法晋升到 Old Generation,因为 Old Generation 没有足够的空间来容纳这些对象。当发生 Promotion Failure 时,JVM 会触发 Full GC,清理 Old Generation 的空间,从而造成长时间的 STW 停顿。

2. 具体方案

通过调整以下参数,可以减少 Promotion Failure 的发生,降低 Full GC 的频率:

// 减少 Promotion Failure 的发生
-XX:MaxTenuringThreshold=5  // 设置对象在 Young Generation 中存活 5 次后晋升到 Old Generation// 调整 Survivor 区的比例
-XX:SurvivorRatio=8  // Eden 区和 Survivor 区的比例为 8:1
  • -XX:MaxTenuringThreshold:指定对象在 Young Generation 中存活的次数。只有当对象存活足够多次后,才会被晋升到 Old Generation。调整该参数可以减少频繁晋升到 Old Generation 的对象,从而减轻 Old Generation 的负担。
  • -XX:SurvivorRatio:控制 Young Generation 中 Eden 区和 Survivor 区的大小比例。调整该比例可以增加 Young Generation 空间,减少对象晋升到 Old Generation 的概率。

优化原理与效果:

  • 减少晋升失败:通过调整 -XX:MaxTenuringThreshold,可以控制对象在 Young Generation 中的存活时间,减少过早晋升到 Old Generation 的对象。通过增加 -XX:SurvivorRatio,扩大 Young Generation 中的 Survivor 区,可以容纳更多短生命周期对象,从而降低晋升失败的概率。
  • 减轻 Old Generation 压力:通过减少晋升到 Old Generation 的对象数量,减轻 Old Generation 的内存压力,从而减少频繁触发 Full GC 的概率。

(三)减少内存碎片

1. 背景与原因

CMS 使用标记-清理算法进行垃圾回收。标记-清理算法的一个缺点是会在清理过程中产生内存碎片。大量碎片可能会导致 Old Generation 中无法找到足够大的连续内存块来存储新对象,从而降低内存的使用效率,甚至触发 Full GC。

2. 具体方案

可以通过以下参数来减少内存碎片的影响:

// 开启 Full GC 时的内存压缩
-XX:+UseCMSCompactAtFullCollection  // 在 Full GC 时进行内存压缩// 控制堆内存空闲比例
-XX:MinHeapFreeRatio=40  // 设置堆内存的最小空闲比例为 40%
-XX:MaxHeapFreeRatio=70  // 设置堆内存的最大空闲比例为 70%
  • -XX:+UseCMSCompactAtFullCollection:在 Full GC 期间,启用内存压缩功能,减少 Old Generation 中的碎片问题。
  • -XX:MinHeapFreeRatio-XX:MaxHeapFreeRatio:控制堆内存的最小和最大空闲比例,通过这些参数可以减少碎片化现象。

优化原理与效果:

  • 内存压缩:通过启用 -XX:+UseCMSCompactAtFullCollection,在 Full GC 期间对 Old Generation 进行内存压缩,回收碎片并整理内存,从而提高内存利用率。
  • 控制堆内存比例:通过合理设置堆的空闲内存比例,可以避免 Old Generation 中过多的空闲内存造成碎片化,提高内存的使用效率。

(四)增加 CMS 的并行度

1. 背景与原因

CMS 的并发标记和清理阶段设计目的是在应用线程运行的同时,标记和清理不再使用的对象。然而,在高并发环境下,如果并发标记和清理的线程数不足,可能会导致标记和清理阶段效率低下,进而增加 STW 停顿时间。

2. 具体方案

可以通过以下参数来增加 CMS 的并行度,提高垃圾回收效率:

// 增加并行标记和清理线程数
-XX:ParallelCMSThreads=8  // 设置并行标记和清理的线程数为 8
  • -XX:ParallelCMSThreads:设置用于并发标记和清理阶段的线程数。通过增加线程数,可以提升并发标记和清理的速度,缩短 GC 停顿时间。

优化原理与效果:

  • 提升并行度:通过增加 -XX:ParallelCMSThreads,可以充分利用多核 CPU 资源,提升并发标记和清理的速度,减少 GC 停顿时间。
  • 减少 STW 停顿时间:增加并行标记和清理线程数,可以缩短 GC 停顿时间,提升系统响应能力。

(五)切换到 G1 GC

1. 背景与原因

G1 GC(Garbage First Garbage Collector)是为了应对大堆内存、高并发场景下的垃圾回收需求而设计的,它采用了分代回收和增量标记的方式,相比于 CMS,G1 更加稳定,且能更好地控制 GC 停顿时间。

2. 具体方案

// 切换到 G1 GC
-XX:+UseG1GC  // 启用 G1 GC 回收器// 设置 G1 的最大 GC 停顿时间
-XX:MaxGCPauseMillis=200  // 设置最大 GC 停顿时间为 200ms
  • -XX:+UseG1GC:启用 G1 GC 回收器,替代 CMS。
  • -XX:MaxGCPauseMillis:控制 G1 GC 的最大暂停时间,G1 会尝试尽量使 GC 停顿时间不超过该值。

优化原理与效果:

  • 减少 STW 停顿时间:G1 GC 是面向低延迟场景设计的回收器,它能够精确控制每次 GC 停顿的最大时长,避免了 CMS 中长时间停顿的问题。
  • 更高效的内存回收:G1 在进行垃圾回收时,会将内存划分为多个区域,并使用增量标记和并行回收技术,更高效地回收内存。

(六)使用 ZGC 或 Shenandoah GC

1. 背景与原因

ZGC 和 Shenandoah GC 是为了进一步降低垃圾回收时的停顿时间而设计的,它们都属于低延迟回收器,尤其适用于对响应时间要求极高的应用场景。

2. 具体方案

笔者在2022年所接触到的所有服务已经整体升级到了ZGC,其性能各方面确实是最优的。

// 启用 ZGC
-XX:+UseZGC  // 启用 ZGC 回收器// 启用 Shenandoah GC
-XX:+UseShenandoahGC  // 启用 Shenandoah GC
  • -XX:+UseZGC:启用 ZGC(低延迟垃圾回收器)。
  • -XX:+UseShenandoahGC:启用 Shenandoah GC(低延迟垃圾回收器)。

优化原理与效果:

  • 极低停顿:ZGC 和 Shenandoah GC 采用了多线程的标记和并发清理机制,几乎消除了垃圾回收期间的停顿时间,使应用能够保持较高的吞吐量和低延迟。
  • 适用于低延迟要求:在对响应时间要求较高的系统中,ZGC 和 Shenandoah GC 可以显著改善垃圾回收停顿问题,特别是在大内存场景下。

通过这些优化方案,你可以根据具体的应用场景和性能需求,选择合适的垃圾回收器和调整合适的参数,从而降低 GC 停顿时间,提升系统性能。

五、总结

在高并发环境下,长时间的 CMS Old GC 停顿可能会严重影响 Java 应用的性能和稳定性,尤其是在高延迟要求的系统中。通过深入分析和优化,能够有效减轻 GC 停顿对系统的负面影响。优化的关键点包括调整 Old Generation 大小、减少 Promotion Failure、减少内存碎片、增加并行度等方面。结合合适的 JVM 参数调优,可以降低 Full GC 触发的频率,减少内存碎片,并提升 GC 阶段的并行度,从而有效降低停顿时间。

对于一些高并发和低延迟要求的场景,除了调优 CMS 外,切换到 G1、ZGC 或 Shenandoah GC 也可以带来更好的性能表现。这些回收器采用了更加先进的标记与清理机制,能够更精确地控制停顿时间,适应不同类型应用的需求。

总之,GC 停顿的优化是一个综合性的工作,除了从 JVM 参数入手外,还需要结合应用的实际运行情况,通过持续监控与调整,确保系统稳定性和响应时间满足业务需求。

相关文章:

单次 CMS Old GC 耗时长问题分析与优化

目录 一、现象说明 二、CMS GC 机制简述 三、可能导致长时间停顿的原因详细分析 (一)Full GC(完全垃圾回收) 1. 主要原因 2.参数调整 (二)Promotion Failure(晋升失败) 1. 主…...

Python星球日记 - 第16天:爬虫基础(仅学习使用)

🌟引言: 上一篇:Python星球日记 - 第15天:综合复习(回顾前14天所学知识) 名人说:不要人夸颜色好,只留清气满乾坤(王冕《墨梅》) 创作者:Code_流苏…...

【回眸】Linux 内核 (十四)进程间通讯 之 信号量

前言 信号量概念 信号量常用API 1.创建/获取一个信号量 2.改变信号量的值 3. 控制信号量 信号量函数调用 运行结果展示 前言 上一篇文章介绍的共享内存有局限性,如:同步与互斥问题、内存管理复杂性问题、数据结构限制问题、可移植性差问题、调试困难问题。本篇博文介…...

Python 字典和集合(字典的变种)

本章内容的大纲如下: 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的 顺序,等等) 字典的变种 这一节总结了…...

LeetCode】寻找重复子树:深度解析与高效解法

📖 问题描述 给定一棵二叉树的根节点 root ,返回所有重复的子树。若两棵树结构相同且节点值相同,则认为它们是重复的。对于同类重复子树,只需返回其中任意一棵的根节点。 🌰 示例解析 示例1 输入: 1/ …...

[蓝桥杯] 挖矿(CC++双语版)

题目链接 P10904 [蓝桥杯 2024 省 C] 挖矿 - 洛谷 题目理解 我们可以将这道题中矿洞的位置理解成为一个坐标轴,以题目样例绘出坐标轴: 样例: 输入的5为矿洞数量,4为可走的步数。第二行输入是5个矿洞的坐标。输出结果为在要求步数…...

Appium如何实现移动端UI自动化测试?

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门,那么我们就直奔主题。文章结构如下: 为什么要使用A…...

在集合中哪些可以为null,哪些不能为null;Java 集合中 null 值允许情况总结与记忆技巧

Java 集合中 null 值允许情况总结与记忆技巧 一、核心集合对 null 的支持情况 集合类型Key 是否可为 nullValue 是否可为 null原因/备注HashMap✅ 是✅ 是对 null key 有特殊处理(存放在数组第 0 个位置)LinkedHashMap✅ 是✅ 是继承自 HashMapTreeMap…...

Python 并发编程指南:协程 vs 多线程及其他模型比较

Python 并发编程指南:协程 vs 多线程及其他模型比较 并发编程是指在单个程序中同时处理多个任务的能力,这些任务可以交替进行(同一时刻并不一定真的同时运行),而并行则强调在同一时刻真正同时运行多个任务&#xff08…...

WPS JS宏编程教程(从基础到进阶)-- 第五部分:JS数组与WPS结合应用

目录 摘要第5章 JS数组与WPS结合应用5-1 JS数组的核心特性核心特性解析5-2 数组的两种创建方式(字面量与扩展操作符)1. 字面量创建2. 扩展操作符创建5-3 数组创建应用:提取字符串中的数字需求说明代码实现5-4 用函数创建数组(new Array、Array.of、Array.from)1. new Arra…...

STM32定时器完全指南:从基础原理到高级应用 | 零基础入门STM32第九十六步

主题内容教学目的/扩展视频TIM定时器重点课程定时器,捕获器,比较器,PWM,单脉冲。高级TIM。定时器中断。了解TIM使用 师从洋桃电子,杜洋老师 📑文章目录 一、定时器核心原理1.1 硬件架构解析1.2 核心参数公式…...

Kafka分区机制详解:原理、策略与应用

#作者:张桐瑞 文章目录 一、分区的作用二、分区策略(一)轮询策略(二)随机策略(三)按消息键保序策略 三、实际案例:消息顺序问题的解决四、其他分区策略:基于地理位置的分…...

最小K个数

文章目录 题意思路代码 题意 题目链接 思路 代码 class Solution { public:vector<int> smallestK(vector<int>& arr, int k) {priority_queue<int> Q;for (auto &index:arr){Q.push(index);if (Q.size() > k)Q.pop();}vector<int> ans…...

【STL】list介绍(附与vector的比较)

文章目录 1.关于list2.使用2.1 list的构造2.2 list 迭代器的使用2.3 list 容量操作2.3.1 size()2.3.2 empty()2.3.3 resize() 2.4 list 元素访问2.4.1 front()2.4.2 back() 2.5 list 修改操作2.5.1 push_front()2.5.2 pop_front()2.5.3 push_back()2.5.4 pop_back()2.5.5 inser…...

音视频生命探测仪,救援现场的“视听先锋”|鼎跃安全

地震等自然灾害的突发性和破坏性对人类生命构成严重威胁。据统计&#xff0c;地震后的“黄金72小时”内&#xff0c;被困者的存活率随时间的推移急剧下降&#xff0c;因此快速、精准的搜救技术至关重要。 传统搜救手段依赖人耳识别呼救声或手动挖掘&#xff0c;效率低且易造成二…...

Arch视频播放CPU占用高

Arch Linux配置视频硬件加速 - DDoSolitary’s Blog 开源神器&#xff1a;加速你的视频体验 —— libvdpau-va-gl-CSDN博客 VDPAU&#xff08;Video Decode and Presentation API for Unix&#xff09; VA-API&#xff08;Video Acceleration API&#xff09; OpenGL 我的电…...

Python技巧:二维列表 和 二维矩阵 的区别

np.vstack 是 NumPy 中的一个函数&#xff0c;用于将多个数组沿垂直方向&#xff08;行方向&#xff09;堆叠。它可以处理 二维列表 和 二维矩阵&#xff0c;但它们之间有一些关键区别。以下是详细说明&#xff1a; 1. 二维列表 定义: 二维列表是 Python 原生的数据结构&#x…...

Linux 命令清单(Linux Command List)

测试人员必备的 Linux 命令清单文件管理 ls —— 显示目录内容。 ls -l 使用 -l 选项查看详细信息。 cd —— 改变当前工作目录。 cd /path/to/directory mkdir —— 创建新目录。 mkdir new_directory rm —— 删除文件或目录。 rm filename rm -r directory 使用 …...

Wallaby‘s: Nightmare (v1.0.2)靶场渗透

Wallabys: Nightmare (v1.0.2) 来自 <Wallabys: Nightmare (v1.0.2) ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23…...

java基础 可拆分迭代器 Spliterator<T>

Spliterator Spliterator介绍核心方法tryAdvanceforEachRemainingtrySplitestimateSizetrySplit 结合并行流&#xff08;Parallel Stream&#xff09;关键注意事项总结 Spliterator介绍 Spliterator&#xff08;Splittable Iterator&#xff09;是 Java 8 引入的接口&#xff…...

【AI提示词】决策专家

提示说明 决策专家可以帮助你进行科学决策&#xff0c;尽可能避免错误&#xff0c;提升决策成功的概率。 提示词 # Role : 决策专家决策&#xff0c;是面对不容易判断优劣的几个选项&#xff0c;做出正确的选择。说白了&#xff0c;决策就是拿个主意。决策专家是基于科学决策…...

VectorBT量化入门系列:第二章 VectorBT核心功能与数据处理

VectorBT量化入门系列&#xff1a;第二章 VectorBT核心功能与数据处理 本教程专为中高级开发者设计&#xff0c;系统讲解VectorBT技术在量化交易中的应用。通过结合Tushare数据源和TA-Lib技术指标&#xff0c;深度探索策略开发、回测优化与风险评估的核心方法。从数据获取到策略…...

Spring Boot 配置文件加载优先级全解析

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 配置文件加载优先级全解析 Spring Boot 的配置文件加载机制是开发者管理不同环境配置的核心功能之一。其通过外部化配置&#xff08;Externaliz…...

System V 信号量:控制进程间共享资源的访问

System V 信号量&#xff1a;控制进程间共享资源的访问 在多进程操作系统中&#xff0c;当多个进程需要共享资源时&#xff0c;必须确保对资源的访问是有序的&#xff0c;以避免竞争条件&#xff08;Race Condition&#xff09;和数据不一致性问题。System V 信号量&#xff0…...

海运货代系统哪家好?能解决了哪些常见管理难题?

随着跨境电商的迅速发展&#xff0c;货代行业在全球供应链中扮演着越来越重要的角色。随着市场需求的多样化和国际运输环境的复杂化&#xff0c;货代企业面临的挑战也愈发复杂。为了应对这些挑战&#xff0c;数字化管理工具成为货代行业不可或缺的一部分。如今先进的海运货代系…...

预测性维护+智能优化:RK3568的储能双保险

在碳中和目标推动下&#xff0c;储能行业正经历前所未有的发展机遇。作为储能系统的核心组件&#xff0c;储能柜的智能化水平直接影响着整个系统的效率和安全性。RK3568智慧边缘控制器凭借其强大的计算能力、丰富的接口和高效的能源管理特性&#xff0c;正在成为工商储能柜的&q…...

蓝桥20257-元宵分配

#include <iostream> #include <bits/stdc.h> using namespace std; const int N1e910; typedef long long LL; int main() {// 请在此输入您的代码//将强其中的一碗全部倒进另一个中&#xff0c;将所有汤圆排序&#xff0c;最后选择前&#xff08;N/2&#xff09;…...

How to connect a mobile phone to your computer?

How to connect a mobile phone to your computer? 1. Background /ˈbkɡraʊnd/2. How to connect a mobile phone to your computer?References 1. Background /ˈbkɡraʊnd/ Let me introduce the background first. Today we will talk about this topic: How to conn…...

【力扣刷题实战】全排列II

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a;全排列II 题目描述 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码&#xff08;C&#xff09; 兄弟们共勉 &#xff01;&#xff01;&#xff01; 每篇前言 博客主页&#xff1a;小卡…...

题目练习之map的奇妙使用

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

Excel 日期值转换问题解析

目录 问题原因 解决方案 方法1&#xff1a;使用 DateTime.FromOADate 转换 方法2&#xff1a;处理可能为字符串的情况 方法3&#xff1a;使用 ExcelDataReader 时的处理 额外提示 当你在 Excel 单元格中看到 2024/12/1&#xff0c;但 C# 读取到 45627 时&#xff0c;这是…...

Linux--文件系统

ok&#xff0c;上次我们提到了硬件和inode&#xff0c;这次我们继续学习文件系统 ext2文件系统 所有的准备⼯作都已经做完&#xff0c;是时候认识下文件系统了。我们想要在硬盘上存储文件&#xff0c;必须先把硬盘格式化为某种格式的文件系统&#xff0c;才能存储文件。文件系…...

2025 年福建交安安全员考试:结合本省交通特点备考​

福建地处东南沿海&#xff0c;交通建设具有独特特点&#xff0c;这对交安安全员考试备考意义重大。在桥梁建设方面&#xff0c;由于面临复杂的海洋环境&#xff0c;桥梁的防腐、防台风等安全措施成为重点。考生在学习桥梁施工安全知识时&#xff0c;要特别关注福建本地跨海大桥…...

【项目管理】第6章 信息管理概论 --知识点整理

项目管理 相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知识总览 项目管理知识域 知识点&#xff1a; &#xff08;项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域&#xff09; 对应&…...

python-leetcode 66.寻找旋转排序数组中的最小值

题目&#xff1a; 已知一个长度为n的数组&#xff0c;预先按照升序排列&#xff0c;经由1到n次旋转后&#xff0c;得到输入数组&#xff0c;例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,2]若…...

WinMerge下载及使用教程(附安装包)

文章目录 一、WinMerge安装步骤1.WinMerge下载&#xff1a;2.解压&#xff1a;3.启动&#xff1a; 二、WinMerge使用步骤1.添加文件或文件夹2.查看差异3.格式选择 WinMerge v2.16.36 是一款免费开源的文件与文件夹比较、合并工具&#xff0c;能帮您快速找出差异&#xff0c;提高…...

Codeforces Round 1011 (Div. 2)

Dashboard - Codeforces Round 1011 (Div. 2) - Codeforces Problem - B - Codeforces 题目大意&#xff1a; 给你一个数组&#xff0c;你可以用一段子序列中没有出现的最小非负整数,替换数组中的组序列&#xff0c;经过若干操作&#xff0c;让数组变为长度为1&#xff0c;值…...

深度学习实战105-利用LSTM+Attention模型做生产车间中的铝合金生产时的合格率的预测应用

大家好,我是微学AI,今天给大家介绍一下深度学习实战105-利用LSTM+Attention模型做生产车间中的铝合金生产时的合格率的预测应用。 本项目利用LSTM+Attention模型对铝合金生产合格率进行预测,不仅在理论上具有创新性和可行性,而且在实际应用中也具有重要的价值和广阔的应用前…...

苹果内购支付 Java 接口

支付流程&#xff0c;APP支付成功后 前端调用后端接口&#xff0c;后端接口将前端支付成功后拿到的凭据传给苹果服务器检查&#xff0c;如果接口返回成功了&#xff0c;就视为支付。 代码&#xff0c;productId就是苹果开发者后台提前设置好的 产品id public CommonResult<S…...

Scrapy 是什么?Python 强大的爬虫框架详解

1. Scrapy 简介 Scrapy 是一个用 Python 编写的开源 网络爬虫框架&#xff0c;用于高效地从网站提取结构化数据。它提供了完整的爬虫开发工具&#xff0c;包括请求管理、数据解析、存储和异常处理等功能&#xff0c;适用于数据挖掘、监测和自动化测试等场景。 Scrapy 的核心特…...

一种用于基于扩散磁共振成像(MRI)的微观结构估计的外梯度与噪声调谐自适应迭代网络|文献速递-深度学习医疗AI最新文献

Title 题目 An extragradient and noise-tuning adaptive iterative network for diffusionMRI-based microstructural estimation 一种用于基于扩散磁共振成像&#xff08;MRI&#xff09;的微观结构估计的外梯度与噪声调谐自适应迭代网络 Background 背景 2.1. Advanced…...

需求的图形化分析-状态转换图

实时系统和过程控制应用程序可以在任何给定的时间内以有限的状态存在。当满足所定义的标准时&#xff0c;状态就会发生改变&#xff0c;例如在特定条件下&#xff0c;接收到一个特定的输入激励。这样的系统是有限状态机的例子。此外&#xff0c;许多业务对象&#xff08;如销售…...

3月AI论文精选十篇

1. Feature-Level Insights into Artificial Text Detection with Sparse Autoencoders[1] 核心贡献&#xff1a;通过稀疏自编码器揭示AI生成文本的检测特征&#xff0c;提出基于特征分布的鉴别方法。研究发现&#xff0c;AI文本在稀疏编码空间中呈现独特的"高频低幅"…...

【android bluetooth 框架分析 01】【关键线程 2】【bt_stack_manager_thread线程介绍】

1. bt_stack_manager_thread bt_stack_manager_thread 是蓝牙协议栈中的核心调度线程&#xff0c;负责串行化处理协议栈的生命周期事件&#xff0c;包括初始化、启动、关闭与清理操作。它确保这些状态切换在同一线程中按顺序执行&#xff0c;避免竞态和资源冲突。作为蓝牙栈的…...

GEO, TCGA 等将被禁用?!这40个公开数据库可能要小心使用了

GEO, TCGA 等将被禁用&#xff1f;&#xff01;这40个公开数据库可能要小心使用了 最近NIH公共数据库开始对中国禁用的消息闹得风风火火&#xff1a; 你认为研究者上传到 GEO 数据库上的数据会被禁用吗&#xff1f; 单选 会&#xff0c;毕竟占用存储资源 不会&#xff0c;不…...

matlab安装python API 出现Invalid version: ‘R2022a‘,

打开 setup.py 文件&#xff0c;找到设置版本号的部分 将 versionR2022a 修改为符合 Python 版本号规范的格式&#xff0c;例如 version2022.1 保存 setup.py 文件...

【ROS 通信】Services 服务通信

【ROS】Service 服务通信 前言前置操作创建一个 tutorial 功能包定义服务接口修改 CMakeLists.txt 文件修改 find_package修改 add_service_files修改 generate_messages修改 catkin_packagefind_package 和 catkin_package 修改 package.xml 文件构建 服务通信的 Python 实现服…...

25.4.8学习总结

javaFX实现倒计时 核心概念 Timeline: Timeline 是JavaFX动画API的核心类&#xff0c;用于创建动画。它可以按照指定的时间间隔&#xff08;Duration&#xff09;触发事件&#xff08;KeyFrame&#xff09;。 可以将其视为一个定时器&#xff0c;每隔一段时间执行一些操作。 …...

Android audio(6)-audiopolicyservice介绍

AudioPolicyService 是策略的制定者&#xff0c;比如某种 Stream 类型不同设备的音量&#xff08;index/DB&#xff09;是多少、某种 Stream 类型的音频数据流对应什么设备等等。而 AudioFlinger 则是策略的执行者&#xff0c;例如具体如何与音频设备通信&#xff0c;维护现有系…...

【区块链安全 | 第三十八篇】合约审计之获取私有数据(二)

文章目录 前言漏洞代码代码审计攻击步骤修复/开发建议审计思路 前言 在【区块链安全 | 第三十七篇】合约审计之获取私有数据&#xff08;一&#xff09;中&#xff0c;介绍了私有数据、访问私有数据实例、Solidity 中的数据存储方式等知识&#xff0c;本文通过分析具体合约代码…...