JVM基础- 垃圾回收器

基本介绍

Java虚拟机(JVM)中的垃圾回收器是用来自动管理内存的关键组件。它负责识别并回收不再使用的内存,从而防止内存泄漏。不同的JVM实现提供了多种垃圾回收器,每种回收器都有其特定的使用场景和性能特点。以下是一些常见的JVM垃圾回收器的详细介绍:

1. 串行回收器(Serial Garbage Collector)

  • 工作方式:使用单个线程进行垃圾回收。
  • 特点:简单高效,适用于单核处理器或资源受限的环境。
  • 使用场景:主要用于小型应用或嵌入式系统。
  • 启动参数-XX:+UseSerialGC

2. 并行回收器(Parallel Garbage Collector)

  • 工作方式:同时使用多个线程进行垃圾回收,主要目标是增加吞吐量。
  • 特点:适用于多核处理器,提高了处理器的利用率。
  • 使用场景:适合需要高吞吐量的后端应用和大型多线程应用。
  • 启动参数-XX:+UseParallelGC

3. 并发标记清除(CMS)回收器

  • 工作方式:并发地标记和清除垃圾,目的是减少应用暂停时间。
  • 特点:低延迟,但可能会导致较高的CPU消耗和内存碎片。
  • 使用场景:适用于对响应时间敏感的应用,如Web服务器和交互式应用程序。
  • 启动参数-XX:+UseConcMarkSweepGC

4. G1(Garbage-First)垃圾回收器

  • 工作方式:将堆划分为多个区域(Region)并并行、并发地进行垃圾回收。
  • 特点:提供了更细粒度的控制,旨在提供高吞吐量同时保持低延迟。
  • 使用场景:适用于大型堆内存的应用,需要平衡高吞吐量和低延迟。
  • 启动参数-XX:+UseG1GC

5. ZGC(Z Garbage Collector)

  • 工作方式:是一种可扩展的低延迟垃圾回收器。
  • 特点:几乎所有的垃圾回收工作都是并发进行的,目标是将STW暂停时间限制在数毫秒内。
  • 使用场景:适用于需要极低延迟和大堆大小的应用。
  • 启动参数-XX:+UseZGC

6. Shenandoah

  • 工作方式:与ZGC类似,是一种低停顿时间的垃圾回收器。
  • 特点:旨在减少停顿时间,适用于需要低延迟的大数据应用和云服务。
  • 使用场景:需要处理大量数据同时要求低停顿时间的应用。
  • 启动参数-XX:+UseShenandoahGC

总结

每种垃圾回收器都有其优势和特定的应用场景。选择合适的垃圾回收器取决于应用的需求,比如对延迟的敏感度、堆的大小、处理器的核心数等。理解不同垃圾回收器的工作原理和特点对于优化Java应用性能和稳定性至关重要。

串行回收器(Serial Garbage Collector)

串行垃圾回收器(Serial Garbage Collector)是Java虚拟机中最基础和最简单的垃圾回收器之一。它主要用于单核处理器或者资源受限的环境,如小型设备或简单的桌面应用。串行回收器因其简单性和高效性在特定场景下依然受到应用。
在这里插入图片描述

工作原理

串行垃圾回收器在执行垃圾回收时会暂停所有应用程序线程(称为Stop-The-World,STW),然后只使用一个单独的线程来执行垃圾回收任务。这个单线程的工作方式是串行回收器名称的由来。

  1. 年轻代回收(Minor GC):

    • 串行回收器在年轻代使用的是标记-复制(Mark-Copy)算法。
    • 当年轻代(Eden区和Survivor区)空间不足时触发Minor GC。
    • 在Minor GC期间,活动的对象被复制到Survivor区,未使用的对象被清除。
  2. 老年代回收(Major GC 或 Full GC):

    • 在老年代,串行回收器使用标记-整理(Mark-Sweep-Compact)算法。
    • 当老年代空间不足时触发Major GC,这通常伴随着更长的暂停时间,因为需要处理整个老年代的数据。
    • 老年代的垃圾回收涉及标记所有存活对象,然后清除未使用的对象,并压缩剩余对象以减少碎片。

特点

  • 简单高效:对于单线程应用或小型堆,串行回收器因其简单性能够提供相对高效的垃圾回收。
  • 停顿时间:所有垃圾回收活动都会导致应用线程的暂停,这在处理大型堆或多线程应用时可能成为性能瓶颈。
  • 低资源占用:由于只使用一个线程进行垃圾回收,所以它的CPU资源消耗较少,适合资源受限的环境。

使用和配置

  • 串行垃圾回收器可以通过JVM启动参数-XX:+UseSerialGC来启用。
  • 适用于限制内存和处理器资源的环境,如小型嵌入式系统或简单的桌面应用。

适用场景

  • 串行垃圾回收器适用于单核处理器或内存资源受限的应用。
  • 对于多核处理器和要求低延迟的应用,其他类型的垃圾回收器(如并行或并发回收器)可能更加适合。

总的来说,串行垃圾回收器在特定场景下仍然有其用武之地,尤其是在资源受限的环境中。它的简单性和高效性在处理小型堆时能够提供良好的性能,但在处理大型堆或多线程应用时可能会遇到性能瓶颈。

并行回收器(Parallel Garbage Collector)

吞吐量优先垃圾回收器(通常指 Parallel Collector 或 Throughput Collector)是Java虚拟机中用于提高应用吞吐量的垃圾回收器。它的主要特点是在执行垃圾回收时使用多个线程来提高回收效率,从而最大化应用程序运行时间和性能。这种垃圾回收器特别适合需要高吞吐量和大型多处理器环境的应用程序。
在这里插入图片描述

工作原理

  1. 年轻代回收(Minor GC):

    • Parallel Collector主要在年轻代(Young Generation)使用标记-复制(Mark-Copy)算法。
    • 在执行Minor GC时,所有应用线程会暂停(STW - Stop The World),然后多个垃圾回收线程并行地标记和复制活动对象。
    • 通过并行执行,可以减少GC的总暂停时间,尤其在多核处理器上表现更加明显。
  2. 老年代回收(Major GC):

    • 在老年代(Old Generation),它通常使用标记-整理(Mark-Compact)算法。
    • 与年轻代类似,在执行Major GC时,应用线程也会暂停。
    • 多个垃圾回收线程并行工作,首先标记所有可达对象,然后整理剩余对象以减少内存碎片。

配置和优化

  • 使用-XX:+UseParallelGC参数可以启用Parallel GC。
  • 可以通过-XX:ParallelGCThreads=N来设置垃圾回收线程的数量,其中N是线程数。对于多处理器系统,增加线程数通常可以提高垃圾回收的效率。
  • 可以调整堆的大小和年轻代与老年代的比例来优化垃圾回收行为。例如,-Xms-Xmx参数可以分别设置堆的初始大小和最大大小。

适用场景

  • 吞吐量优先垃圾回收器适用于对停顿时间要求不是非常严格,但需要高吞吐量的应用场景。
  • 在多核心处理器上表现更好,因为它能够利用多个核心同时进行垃圾回收。

缺点

  • 在进行垃圾回收时,会发生应用线程的全面暂停(STW),这可能导致短暂的停顿,尤其是在执行Major GC时。
  • 对于需要低延迟的应用,比如实时系统或者用户界面交互密集型的应用,可能不是最佳选择。

总的来说,吞吐量优先垃圾回收器是Java应用中一种常用的垃圾回收策略,特别是在需要优化应用程序运行时间和处理能力的场景中。通过合理配置,可以在提高应用性能的同时,保持垃圾回收的有效性。

并发标记清除(CMS)回收器

CMS(Concurrent Mark-Sweep)垃圾回收器是Java虚拟机中一种以减少应用暂停时间为目标的回收器,主要用于收集老年代(Old Generation)的垃圾。它特别适合那些对响应时间有严格要求的应用程序,如Web服务器和交互式应用程序。下面是对CMS垃圾回收器的详细介绍:
在这里插入图片描述

工作原理

  1. 初始标记(Initial Mark):

    • 这是第一个停顿阶段(STW - Stop The World),虽然这个阶段很短。
    • 在这个阶段,CMS回收器标记所有直接与GC根相连的对象。GC根包括活跃线程的栈帧、静态字段、JNI引用等。
    • 由于只标记与根节点直接相连的对象,所以这个过程比较快。
  2. 并发标记(Concurrent Marking):

    • 从初始标记阶段结束后,CMS开始并发标记阶段,这时应用程序的线程和垃圾回收线程可以同时运行。
    • 在并发标记过程中,CMS回收器遍历堆中的对象,标记所有可达的对象。
    • 由于应用线程在运行,可能会对堆中的对象进行修改,因此可能引入了所谓的“浮动垃圾”(即在垃圾回收过程中新生成的垃圾)。
  3. 重新标记(Remark):

    • 这是第二个STW阶段,目的是修正由于应用程序的并发运行在并发标记阶段可能产生的变化。
    • 这个阶段通常使用算法(如卡片标记和增量更新)来追踪在并发标记阶段由于程序运行而产生的变化,以确保标记的准确性。
    • 重新标记通常比初始标记要长一些,但仍然比整个堆遍历要快。
  4. 并发清理(Concurrent Sweeping):

    • 在重新标记完成后,CMS进入并发清理阶段。
    • 在这个阶段,回收器删除所有未标记的对象,释放它们占用的空间。
    • 这个过程是并发的,意味着应用程序的线程可以与垃圾回收线程同时运行。
  5. 并发重置(Concurrent Reset):

    • 这是清理完垃圾后,为下一次垃圾回收准备的阶段。
    • 在这个阶段,CMS回收器重置内部数据结构,为下一轮的垃圾回收做准备。

CMS垃圾回收器的主要优点是减少了应用程序停顿的时间,但这种方式的代价是较高的CPU占用。此外,它无法处理碎片化问题,可能导致提早发生Full GC。为了解决这个问题,通常需要配合适当的堆大小和其他JVM参数来使用。

特点

  • 低停顿时间:CMS的主要优点是减少了应用程序的停顿时间,尤其是减少了长时间的STW事件。
  • 高CPU消耗:为了减少停顿时间,CMS通常需要更多的CPU资源来处理并发垃圾回收。
  • 内存碎片化:CMS使用的是标记-清除算法,不会像标记-整理算法那样对对象进行压缩,因此可能导致内存碎片化问题。
  • 预测难度:CMS回收器在确定何时启动垃圾回收方面可能不如其他垃圾回收器那么精确,有时可能会发生“并发模式失败”(Concurrent Mode Failure),这时会退回到Serial Old GC进行垃圾回收。

使用和配置

  • 可以通过-XX:+UseConcMarkSweepGC JVM参数来启用CMS垃圾回收器。
  • 还可以使用-XX:CMSInitiatingOccupancyFraction=N参数来设置老年代被占用多少百分比后启动垃圾回收,其中N是占用的百分比。

适用场景

  • CMS(Concurrent Mark-Sweep)垃圾回收器适用于对停顿时间敏感的应用,比如Web服务器、应用服务器等。它主要是为了减少垃圾收集过程中的停顿时间,从而提高应用的响应性。
  • 然而,CMS并不适合内存分配速率较高或多核CPU较少的环境,因为这些环境下CMS的优势无法得到充分发挥。在内存分配速率较高的环境中,对象的快速分配和回收会频繁触发垃圾回收,这可能导致CMS中的并发标记和清理阶段与应用线程的内存分配操作发生冲突,从而影响性能。此外,由于CMS主要依赖CPU资源来并发处理垃圾回收,因此在多核CPU较少的环境中,可能没有足够的处理器资源来支持高效的并发垃圾回收,进而影响整体的垃圾回收效率。

总之,CMS垃圾回收器最适合那些对停顿时间敏感且具有相对稳定内存分配和足够CPU资源的应用环境。对于其他环境,比如内存分配频繁或CPU资源有限的情况,可能需要考虑使用其他类型的垃圾回收器,如G1或Parallel GC,以获得更好的性能表现。

G1(Garbage-First)垃圾回收器

G1(Garbage-First)垃圾回收器是Java虚拟机中的一种高级垃圾回收器,旨在为具有大内存容量和多核处理器的系统提供高吞吐量同时保持低延迟。G1垃圾回收器特别适合需要快速响应时间的大型应用,例如大型服务器和云基础设施。以下是G1垃圾回收器的详细介绍:

工作原理

G1垃圾回收器将Java堆分割成多个相同大小的区域(Regions),每个区域可以是Eden区、Survivor区或Old区。这种划分使得G1能够更灵活地管理堆内存,从而提高垃圾回收的效率。整体上是标记-整理算法,两个区域之间是复制算法。

  1. 初始标记(Initial Mark):

    • 这个阶段与应用线程同时运行,并标记从GC根直接可达的活动对象。这个阶段是STW(Stop-The-World),但通常很快。
  2. 并发标记(Concurrent Marking):

    • 在这个阶段,G1回收器遍历堆中的对象,并标记所有可达的对象。这个过程是并发进行的,不会阻塞用户线程。
  3. 最终标记(Final Mark):

    • 这个阶段处理在并发标记期间由于应用程序继续运行而产生的变化。这通常是一个较短的STW暂停。
  4. 筛选回收(Evacuation):

    • 这是G1中最重要的阶段,回收器将选定的区域(通常是那些垃圾最多的区域)中的存活对象复制到空闲区域,然后清理这些区域。这个过程通常是STW的。

特点

  • 并发和并行处理:G1回收器结合了并发和并行处理,尝试平衡低延迟和高吞吐量。
  • 可预测的停顿时间:G1回收器允许用户指定期望的停顿时间目标,回收器会尽量在这个时间范围内完成垃圾回收。
  • 堆内存分区:通过将堆内存分割成多个区域,G1能够更高效地管理内存,并减少整体的垃圾回收时间。
  • 减少内存碎片:通过复制存活对象并清理整个区域,G1有助于减少内存碎片。

使用和配置

  • G1垃圾回收器可以通过JVM启动参数-XX:+UseG1GC来启用。
  • 可以通过参数-XX:MaxGCPauseMillis来设置期望的最大垃圾回收停顿时间。
  • G1对大内存堆尤其有效,适合多核服务器环境。

适用场景

G1垃圾回收器适用于需要平衡高吞吐量和低延迟的大型应用,特别是那些具有大量内存和多核处理器的服务器和云应用。它提供了对大堆的有效管理,同时通过可预测的停顿时间来优化应用性能。

总的来说,G1垃圾回收器是一个适用于现代多核服务器和大内存环境的先进垃圾回收方案,它通过创新的堆管理和垃圾回收技术,提供了一种既快速又高效的内存管理方法。

ZGC(Z Garbage Collector)

ZGC(Z Garbage Collector)是Java虚拟机中的一种现代垃圾回收器,其主要目标是为具有大量内存和多核处理器的系统提供低延迟的垃圾回收。ZGC是为需要极低延迟以及能够处理大型堆(数十GB甚至TB级别)的应用而设计的。以下是ZGC垃圴回收器的详细介绍:

工作原理

ZGC的工作原理与传统的垃圾回收器有所不同,其主要特点包括:

  1. 并发执行:

    • ZGC的大多数工作都是并发进行的,这意味着垃圾回收过程中应用程序线程可以继续运行,减少了停顿时间。
  2. 基于区域的内存管理:

    • 类似于G1垃圾回收器,ZGC也将堆划分为多个区域(Region)。但与G1不同,ZGC使用了一种称为“着色指针”(Colored Pointers)的技术来有效地管理这些区域。
  3. 负载平衡:

    • ZGC会动态调整回收工作的负载,确保回收过程不会对应用程序的正常运行造成太大影响。
  4. 回收阶段:

    • ZGC的垃圾回收过程包括几个阶段:并发标记、并发预备重置、并发重置和并发回收。这些阶段大多数时间都是并发执行的。

特点

  • 极低的停顿时间:ZGC的设计目标是将停顿时间控制在几毫秒内,即使是在处理TB级别的堆内存时也是如此。
  • 可扩展性:ZGC能够高效地管理从几百MB到几TB的堆内存。
  • 负载感知:ZGC能够感知应用程序的负载并相应调整其行为,以最小化对应用程序性能的影响。
  • 堆内存碎片处理:ZGC通过并发的内存压缩来减少内存碎片。

使用和配置

  • ZGC可以通过JVM启动参数-XX:+UseZGC来启用。
  • 适用于需要极低延迟且具有大内存需求的应用,如大数据处理、实时系统等。

适用场景

ZGC适用于需要极低延迟以及能够处理大量内存的应用环境。它特别适合那些对停顿时间非常敏感的应用,例如金融行业的交易系统、大型在线服务等。同时,由于其对大内存的有效管理,ZGC也适合用于大数据和云计算环境。

总的来说,ZGC是Java虚拟机中的一种先进的垃圾回收器,它通过创新的技术和算法,为现代多核和大内存的应用提供了极低延迟的垃圾回收解决方案。

Shenandoah

Shenandoah是Java虚拟机的一种垃圾回收器,旨在为具有大内存容量的应用提供低延迟的垃圾回收。Shenandoah是Java平台中较新的垃圾回收技术之一,它的主要目标是减少垃圾回收导致的应用暂停时间,即使在处理大型堆(Heap)时也能保持低延迟。

工作原理

Shenandoah的垃圾回收过程主要包括以下几个阶段,其中大多数阶段都是并发执行的,即在垃圾回收过程中应用线程依然可以运行:

  1. 初始标记(Initial Marking):

    • 这是一个短暂的停顿(Stop-The-World)阶段,用于标记从GC根直接可达的活动对象。
  2. 并发标记(Concurrent Marking):

    • 在这个阶段,垃圾回收器遍历堆中的对象,并标记所有可达的对象。这一过程是并发进行的,不会阻塞用户线程。
  3. 最终标记(Final Mark):

    • 这个阶段处理在并发标记期间由于应用程序的继续运行而产生的变化。这通常是一个较短的停顿阶段。
  4. 并发清理(Concurrent Cleanup):

    • 清理阶段回收那些未被标记的区域,这个过程是并发执行的。
  5. 并发蒸发(Concurrent Evacuation):

    • 这是Shenandoah独有的一个阶段。在这个阶段中,存活的对象被移动到其他区域,以解决内存碎片问题。这个过程也是并发进行的。

特点

  • 低延迟:Shenandoah的主要优势是低延迟,它通过并发执行绝大多数垃圾回收工作来实现这一点。
  • 内存压缩:通过并发蒸发阶段,Shenandoah能够有效地处理内存碎片问题。
  • 停顿时间独立于堆大小:与其他垃圾回收器不同,Shenandoah的停顿时间不随堆大小增加而显著增长。
  • 负载平衡:Shenandoah努力保持应用线程和垃圾回收线程之间的负载平衡。

使用和配置

  • Shenandoah可以通过JVM启动参数-XX:+UseShenandoahGC来启用。
  • 适用于需要低延迟且具有大内存需求的应用,如大数据处理、实时系统等。

适用场景

Shenandoah适用于那些对停顿时间敏感的大型应用,尤其是在大内存环境下。它适用于需要快速响应的应用程序,例如云服务、大数据分析和实时交易系统。

总体而言,Shenandoah是Java垃圾回收领域的一项先进技术,通过其创新的并发回收机制,为需要处理大量数据并且对延迟有严格要求的应用提供了有效的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/154831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 正则表达式使用

C 11 以后有了正则表达式,对于处理字符串还是很方便的.由于我也再学习.所以下面的内容有可能描述的不准确,这些都是我自己代码中使用的,或者demo测试的. 首先使用正则表达式先要添加头文件 #include <regex> 然后编写自己的正则表达式: 例如我想匹配字符串中表示数字…

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏2(附项目源码)

文章目录 先看看最终效果前言生成走廊生成房间修复死胡同增加走廊宽度获取走廊位置信息集合方法一方法二 源码完结 先看看最终效果 前言 上期已经实现了房间的生成&#xff0c;本期紧跟着上期内容&#xff0c;生成走廊并结合上期内容生成连通的房间。 生成走廊 修改Procedur…

【配置】Redis常用配置详解

文章目录 IP地址绑定设置密码 IP地址绑定 默认情况下&#xff0c;如果未指定 “bind” 配置指令&#xff0c;Redis 将监听服务器上所有可用的网络接口的连接。 可以使用 “bind” 配置指令来仅监听一个或多个选定的接口&#xff0c;后跟一个或多个 IP 地址 示例&#xff1a;bin…

集成多元算法,打造高效字面文本相似度计算与匹配搜索解决方案,助力文本匹配冷启动[BM25、词向量、SimHash、Tfidf、SequenceMatcher]

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

zabbix的安装配置,邮件告警,钉钉告警

zabbix监控架构 zabbix优点 开源&#xff0c;无软件成本投入server对设备性能要求低支持设备多&#xff0c;自带多种监控模板支持分布式集中管理&#xff0c;有自动发现功能&#xff0c;可以实现自动化监控开放式接口&#xff0c;扩展性强&#xff0c;插件编写容易当监控的item…

力扣C++学习笔记——C++ 给vector去重

要使用std::set对std::vector进行去重操作&#xff0c;您可以将向量中的元素插入到集合中&#xff0c;因为std::set会自动去除重复元素。然后&#xff0c;您可以将集合中的元素重新存回向量中。以下是一个示例代码&#xff0c;演示如何使用std::set对std::vector进行去重&#…

一次性拉取所有远程仓库分支到本地并推送到另外一个仓库

拉取所有远程仓库分支到本地并推送到另外一个仓库 # 克隆仓库 git clone old_ssh_registry# 拉取仓库所有分支到本地&#xff0c;并创建本地分支 git branch -r | grep -v \-> | while read remote; do git branch --track "${remote#origin/}" "$remote&quo…

Linux系统编程 系统编程概念

1.系统调用 系统调用&#xff08;system call&#xff09;其实是 Linux 内核提供给应用层的应用编程接口&#xff08;API&#xff09;&#xff0c;是 Linux 应用层进入内核的入口。不止 Linux 系统&#xff0c;所有的操作系统都会向应用层提供系统调用&#xff0c;应用程序通过…

为什么Transformer模型中使用Layer Normalization(Layer Norm)而不是Batch Normalization(BN)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

GCC 学习

GCC Resource Center for GCC Internalshttps://www.cse.iitb.ac.in/grc/这是个不错资料网站&#xff0c;有兴趣的可以了解下

考研思想政治理论大纲

一:马克思主义基本原理概论 (一)马克思主义是关于无产阶级和人类解放的科学 1、马克思主义的创立和发展 马克思主义的含义。马克思主义产生的经济社会根源、实践基础和思想渊源、马克思主义的创立、马克思主义在实践中的发展 2、马克思主义的鲜明特征 马克思主义科学性和革命…

【python学习】基础篇-常用模块-pickle模块:序列化和反序列化

pickle模块是Python标准库中用于序列化和反序列化的模块。通过pickle模块&#xff0c;可以将Python对象转换为字节流(序列化),也可以将字节流恢复为Python对象(反序列化)。 以下是pickle模块的一些常用函数&#xff1a; dump(obj, file, protocolNone, *, fix_importsTrue) 将…

SQL数据迁移实战:从产品层级信息到AB测试表

文章目录 创建表插入数据清空数据表数据迁移和筛选查询数据结论 创建表 首先&#xff0c;代码中定义了两个表格&#xff1a;dim_prod_hierarchy_info 和 app_abtest_product_info&#xff0c;都位于 test 数据库中。 dim_prod_hierarchy_info 表用于存储产品层级信息&#xf…

本地搭建Stackedit Markdown编辑器结合内网穿透实现远程访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

AR远程辅助技术应用到气象部门有何好处?

随着科技的不断发展&#xff0c;人类对于自然环境的理解和掌控能力也在不断提升。其中&#xff0c;AR(增强现实)技术的应用&#xff0c;为气象监控带来了革命性的变化。AR气象远程监控&#xff0c;就是将AR技术与气象监控相结合&#xff0c;通过虚拟与现实的融合&#xff0c;实…

el-input只能输入数字且有小数点最多保留两位

el-input只能输入正数数字且有小数点最多保留两位 <el-input keydown.native"handleInput2" oninput "valuevalue.replace(/[^0-9.]/g,)" v-model"form.afterSale_rate" placeholder"请输入 " />handleInput2(e) {/…

解决selenium访问网页中多个iframe,导致无法锁定元素的问题

解决方法 获取全部的iframe列表调试获取目标iframe使用&#xff1a;browser.switch_to.frame(目标iframe)退回到原有的状态&#xff1a;browser.switch_to.default_content() # 进入另一个iframe browser_iframe_list browser.find_elements(By.CSS_SELECTOR, "iframe&…

OSI网络模型与TCP/IP协议

OSI&#xff0c; Open system Interconnection Reference Model 开放式系统互联通信参考模型。是国际标准化组织在1984年定义的一个概念框架&#xff0c;用于协调制定进程间通信标准。OSI作为一个协议规范集&#xff0c;定义了七个层次&#xff0c;包括层次之间的相互关系及各层…

Hive安装配置 - 本地模式

文章目录 一、Hive运行模式二、安装配置本地模式Hive&#xff08;一&#xff09;安装配置MySQL1、删除系统自带的MariaDB2、上传MySQL组件到虚拟机3、在主节点上安装MySQL组件4、在主节点上配置MySQL&#xff08;1&#xff09;查看MySQL服务状态&#xff08;2&#xff09;查看M…

MFC中窗口居中显示

MFC中窗口居中显示 对于一个窗体&#xff0c;可以使用其CenterWindow方法将其居中&#xff0c;CenterWindow方法有一个参数&#xff0c;通过其指定居中操作相对应的父窗口。 CenterWindow方法的原型如下&#xff1a; void CenterWindow(CWnd* pAlternateOwner NULL);如果要…