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),然后只使用一个单独的线程来执行垃圾回收任务。这个单线程的工作方式是串行回收器名称的由来。
-
年轻代回收(Minor GC):
- 串行回收器在年轻代使用的是标记-复制(Mark-Copy)算法。
- 当年轻代(Eden区和Survivor区)空间不足时触发Minor GC。
- 在Minor GC期间,活动的对象被复制到Survivor区,未使用的对象被清除。
-
老年代回收(Major GC 或 Full GC):
- 在老年代,串行回收器使用标记-整理(Mark-Sweep-Compact)算法。
- 当老年代空间不足时触发Major GC,这通常伴随着更长的暂停时间,因为需要处理整个老年代的数据。
- 老年代的垃圾回收涉及标记所有存活对象,然后清除未使用的对象,并压缩剩余对象以减少碎片。
特点
- 简单高效:对于单线程应用或小型堆,串行回收器因其简单性能够提供相对高效的垃圾回收。
- 停顿时间:所有垃圾回收活动都会导致应用线程的暂停,这在处理大型堆或多线程应用时可能成为性能瓶颈。
- 低资源占用:由于只使用一个线程进行垃圾回收,所以它的CPU资源消耗较少,适合资源受限的环境。
使用和配置
- 串行垃圾回收器可以通过JVM启动参数
-XX:+UseSerialGC来启用。 - 适用于限制内存和处理器资源的环境,如小型嵌入式系统或简单的桌面应用。
适用场景
- 串行垃圾回收器适用于单核处理器或内存资源受限的应用。
- 对于多核处理器和要求低延迟的应用,其他类型的垃圾回收器(如并行或并发回收器)可能更加适合。
总的来说,串行垃圾回收器在特定场景下仍然有其用武之地,尤其是在资源受限的环境中。它的简单性和高效性在处理小型堆时能够提供良好的性能,但在处理大型堆或多线程应用时可能会遇到性能瓶颈。
并行回收器(Parallel Garbage Collector)
吞吐量优先垃圾回收器(通常指 Parallel Collector 或 Throughput Collector)是Java虚拟机中用于提高应用吞吐量的垃圾回收器。它的主要特点是在执行垃圾回收时使用多个线程来提高回收效率,从而最大化应用程序运行时间和性能。这种垃圾回收器特别适合需要高吞吐量和大型多处理器环境的应用程序。

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

工作原理
-
初始标记(Initial Mark):
- 这是第一个停顿阶段(STW - Stop The World),虽然这个阶段很短。
- 在这个阶段,CMS回收器标记所有直接与GC根相连的对象。GC根包括活跃线程的栈帧、静态字段、JNI引用等。
- 由于只标记与根节点直接相连的对象,所以这个过程比较快。
-
并发标记(Concurrent Marking):
- 从初始标记阶段结束后,CMS开始并发标记阶段,这时应用程序的线程和垃圾回收线程可以同时运行。
- 在并发标记过程中,CMS回收器遍历堆中的对象,标记所有可达的对象。
- 由于应用线程在运行,可能会对堆中的对象进行修改,因此可能引入了所谓的“浮动垃圾”(即在垃圾回收过程中新生成的垃圾)。
-
重新标记(Remark):
- 这是第二个STW阶段,目的是修正由于应用程序的并发运行在并发标记阶段可能产生的变化。
- 这个阶段通常使用算法(如卡片标记和增量更新)来追踪在并发标记阶段由于程序运行而产生的变化,以确保标记的准确性。
- 重新标记通常比初始标记要长一些,但仍然比整个堆遍历要快。
-
并发清理(Concurrent Sweeping):
- 在重新标记完成后,CMS进入并发清理阶段。
- 在这个阶段,回收器删除所有未标记的对象,释放它们占用的空间。
- 这个过程是并发的,意味着应用程序的线程可以与垃圾回收线程同时运行。
-
并发重置(Concurrent Reset):
- 这是清理完垃圾后,为下一次垃圾回收准备的阶段。
- 在这个阶段,CMS回收器重置内部数据结构,为下一轮的垃圾回收做准备。
CMS垃圾回收器的主要优点是减少了应用程序停顿的时间,但这种方式的代价是较高的CPU占用。此外,它无法处理碎片化问题,可能导致提早发生Full GC。为了解决这个问题,通常需要配合适当的堆大小和其他JVM参数来使用。
特点
- 低停顿时间:CMS的主要优点是减少了应用程序的停顿时间,尤其是减少了长时间的STW事件。
- 高CPU消耗:为了减少停顿时间,CMS通常需要更多的CPU资源来处理并发垃圾回收。
- 内存碎片化:CMS使用的是标记-清除算法,不会像标记-整理算法那样对对象进行压缩,因此可能导致内存碎片化问题。
- 预测难度:CMS回收器在确定何时启动垃圾回收方面可能不如其他垃圾回收器那么精确,有时可能会发生“并发模式失败”(Concurrent Mode Failure),这时会退回到Serial Old GC进行垃圾回收。
使用和配置
- 可以通过
-XX:+UseConcMarkSweepGCJVM参数来启用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能够更灵活地管理堆内存,从而提高垃圾回收的效率。整体上是标记-整理算法,两个区域之间是复制算法。
-
初始标记(Initial Mark):
- 这个阶段与应用线程同时运行,并标记从GC根直接可达的活动对象。这个阶段是STW(Stop-The-World),但通常很快。
-
并发标记(Concurrent Marking):
- 在这个阶段,G1回收器遍历堆中的对象,并标记所有可达的对象。这个过程是并发进行的,不会阻塞用户线程。
-
最终标记(Final Mark):
- 这个阶段处理在并发标记期间由于应用程序继续运行而产生的变化。这通常是一个较短的STW暂停。
-
筛选回收(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的工作原理与传统的垃圾回收器有所不同,其主要特点包括:
-
并发执行:
- ZGC的大多数工作都是并发进行的,这意味着垃圾回收过程中应用程序线程可以继续运行,减少了停顿时间。
-
基于区域的内存管理:
- 类似于G1垃圾回收器,ZGC也将堆划分为多个区域(Region)。但与G1不同,ZGC使用了一种称为“着色指针”(Colored Pointers)的技术来有效地管理这些区域。
-
负载平衡:
- ZGC会动态调整回收工作的负载,确保回收过程不会对应用程序的正常运行造成太大影响。
-
回收阶段:
- ZGC的垃圾回收过程包括几个阶段:并发标记、并发预备重置、并发重置和并发回收。这些阶段大多数时间都是并发执行的。
特点
- 极低的停顿时间:ZGC的设计目标是将停顿时间控制在几毫秒内,即使是在处理TB级别的堆内存时也是如此。
- 可扩展性:ZGC能够高效地管理从几百MB到几TB的堆内存。
- 负载感知:ZGC能够感知应用程序的负载并相应调整其行为,以最小化对应用程序性能的影响。
- 堆内存碎片处理:ZGC通过并发的内存压缩来减少内存碎片。
使用和配置
- ZGC可以通过JVM启动参数
-XX:+UseZGC来启用。 - 适用于需要极低延迟且具有大内存需求的应用,如大数据处理、实时系统等。
适用场景
ZGC适用于需要极低延迟以及能够处理大量内存的应用环境。它特别适合那些对停顿时间非常敏感的应用,例如金融行业的交易系统、大型在线服务等。同时,由于其对大内存的有效管理,ZGC也适合用于大数据和云计算环境。
总的来说,ZGC是Java虚拟机中的一种先进的垃圾回收器,它通过创新的技术和算法,为现代多核和大内存的应用提供了极低延迟的垃圾回收解决方案。
Shenandoah
Shenandoah是Java虚拟机的一种垃圾回收器,旨在为具有大内存容量的应用提供低延迟的垃圾回收。Shenandoah是Java平台中较新的垃圾回收技术之一,它的主要目标是减少垃圾回收导致的应用暂停时间,即使在处理大型堆(Heap)时也能保持低延迟。
工作原理
Shenandoah的垃圾回收过程主要包括以下几个阶段,其中大多数阶段都是并发执行的,即在垃圾回收过程中应用线程依然可以运行:
-
初始标记(Initial Marking):
- 这是一个短暂的停顿(Stop-The-World)阶段,用于标记从GC根直接可达的活动对象。
-
并发标记(Concurrent Marking):
- 在这个阶段,垃圾回收器遍历堆中的对象,并标记所有可达的对象。这一过程是并发进行的,不会阻塞用户线程。
-
最终标记(Final Mark):
- 这个阶段处理在并发标记期间由于应用程序的继续运行而产生的变化。这通常是一个较短的停顿阶段。
-
并发清理(Concurrent Cleanup):
- 清理阶段回收那些未被标记的区域,这个过程是并发执行的。
-
并发蒸发(Concurrent Evacuation):
- 这是Shenandoah独有的一个阶段。在这个阶段中,存活的对象被移动到其他区域,以解决内存碎片问题。这个过程也是并发进行的。
特点
- 低延迟:Shenandoah的主要优势是低延迟,它通过并发执行绝大多数垃圾回收工作来实现这一点。
- 内存压缩:通过并发蒸发阶段,Shenandoah能够有效地处理内存碎片问题。
- 停顿时间独立于堆大小:与其他垃圾回收器不同,Shenandoah的停顿时间不随堆大小增加而显著增长。
- 负载平衡:Shenandoah努力保持应用线程和垃圾回收线程之间的负载平衡。
使用和配置
- Shenandoah可以通过JVM启动参数
-XX:+UseShenandoahGC来启用。 - 适用于需要低延迟且具有大内存需求的应用,如大数据处理、实时系统等。
适用场景
Shenandoah适用于那些对停顿时间敏感的大型应用,尤其是在大内存环境下。它适用于需要快速响应的应用程序,例如云服务、大数据分析和实时交易系统。
总体而言,Shenandoah是Java垃圾回收领域的一项先进技术,通过其创新的并发回收机制,为需要处理大量数据并且对延迟有严格要求的应用提供了有效的解决方案。
相关文章:
JVM基础- 垃圾回收器
基本介绍 Java虚拟机(JVM)中的垃圾回收器是用来自动管理内存的关键组件。它负责识别并回收不再使用的内存,从而防止内存泄漏。不同的JVM实现提供了多种垃圾回收器,每种回收器都有其特定的使用场景和性能特点。以下是一些常见的JV…...
数理统计的基本概念(二)
文章目录 抽样分布几个重要分布 Γ \Gamma Γ 分布 β \beta β 分布 χ 2 \chi^2 χ2 分布 t t t 分布 F F F 分布 分位数 参考文献 抽样分布 所谓抽样分布是指统计量的概率分布。确定统计量的分布是数理统计学的基本问题之一。 几个重要分布 Γ \Gamma Γ 分布 若随机变量 …...
CountDownLatch和CyclicBarrier
JUC(Java.util.concurrent)是Java 5中引入的一个并发编程库,它包含了许多用于多线程处理的工具类和接口。JUC主要提供了以下特性: 线程池:线程池可以提高线程的使用效率,避免频繁地创建和销毁线程ÿ…...
云原生正在重塑软件的整个生命周期(内附资料)
随着企业数字化转型进程的发展,企业面临着新旧商业形态的剧变,颠覆和重构时刻都在发生。 企业需要更加快速地感知用户侧的需求变化并做出调整,才有可能在竞争中持续积累优势。业务的个性化、敏捷化、智能化需求日益突显,数字化应…...
Node.js环境配置级安装vue-cli脚手架
一、下载安装Node.js (略) 二、验证node.js并配置 1、下载安装后,cmd面板输入node -v查询版本、npm -v ,查看npm是否安装成功(有版本号就行了) 2、选择npm镜像(npm config set registry https://registry.npm.taobao.org&…...
十七、Rust集成MQTT Client
1、信息整理 目前了解到的Rust MQTT项目有: bytebeamio/rumqtt 1.3k star、717 commits、Contributors 78、tokio、futures、tls、rumqttc(client):cargo add rumqttc https://github.com/bytebeamio/rumqtt/tree/main/rumqttc ru…...
HarmonyOS ArkTS开发语言介绍(三)
1 引言 Mozilla创造了JS,Microsoft创建了TS,Huawei进一步推出了ArkTS。 从最初的基础的逻辑交互能力,到具备类型系统的高效工程开发能力,再到融合声明式UI、多维状态管理等丰富的应用开发能力,共同组成了相关的演进脉…...
[架构之路-247]:目标系统 - 设计方法 - 软件工程 - 结构化方法的基本思想、本质、特点以及在软件开发、在生活中的应用
目录 前言: 一、什么是非结构化方法 1.1 什么是非结构化方法 1.2 非结构化方法的适用场合 二、什么是结构化方法 1.1 结构化方法诞生的背景:软件规模发展:大规模、复杂系统的需要 1.2 概述 1.3 主要特点与核心思想 三、结构化方法在…...
大模型的交互能力
摘要: 基础大模型显示出明显的潜力,可以改变AI系统的开发人员和用户体验:基础模型降低了原型设计和构建AI应用程序的难度阈值,因为它们在适应方面的样本效率,并提高了新用户交互的上限,因为它们的多模式和生…...
80%测试员被骗,关于jmeter 的一个弥天大谎!
jmeter是目前大家都喜欢用的一款性能测试工具,因为它小巧、简单易上手,所以很多人都愿意用它来做接口测试或者性能测试,因此,在目前企业中,使用各个jmeter的版本都有,其中以jmeter3.x、4.x的应该居多。 但是…...
Git——感谢尚硅谷官方文档
Git——尚硅谷学习笔记 第1章 Git 概述1.1 何为版本控制1.2 为什么需要版本控制1.3 版本控制工具1.4 Git 简史1.5 Git 工作机制1.6 Git 和代码托管中心 第2章 Git 安装第 3 章 Git 常用命令3.1 设置用户签名3.2 初始化本地库3.3 查看本地库状态3.4 添加暂存区3.4.1 将工作区的文…...
Java WebSocket框架
引言 随着互联网和移动互联网的迅猛发展,实时通信成为了应用程序的一项重要能力。WebSocket作为一种在Web上实现双向通信的协议,极大地丰富了Web应用程序的交互方式。而在Java领域,也有许多优秀的WebSocket框架可供选择,本文将介…...
C#实现本地服务器客户端私聊通信
(一)需求 在游戏中我们经常能够看到玩家与玩家之间可以进行私聊,在QQ或微信中最基本的功能就是用户与用户之间的通信。抽象成计算机网络,就是两个客户端通过服务器进行私聊通信,两个客户端可以互相看到对方发送过来的信…...
PyTorch 之 Dataset 类入门学习
PyTorch 之 Dataset 类入门学习 Dataset 类简介 PyTorch 中的 Dataset 类是一个抽象类,用来表示数据集。通过继承 Dataset 类可以进行自定义数据集的格式、大小和其它属性,供后续使用; 可以看到官方封装好的数据集也是直接或间接的继承自 …...
Java update scheduler
引言 Java 更新调度器是 Java 中的一个特性,可以自动化 Java 应用程序的更新过程。它提供了一种方便的方式来安排 Java 应用程序的更新,确保其与最新的功能、错误修复和安全补丁保持同步。本文将深入介绍如何使用 Java 更新调度器,并解释它对…...
常见树种(贵州省):006栎类
摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、麻栎 …...
拓扑排序-
有向无环图是拓扑排序 拓扑排序将图中所有的顶点排成一个线性序列,使得所有的有向边均从序列的前面指向后面。 拓扑排序使用深度优先搜索来实现,图中有环则无法进行拓扑排序 一个有向图,如果图中有入度为0的点,就把这个点删掉…...
Oracle数据库如何定位trace file位置
用一个示例来说明吧。 在导入master key时,出现错误: ADMINISTER KEY MANAGEMENTIMPORT KEYS WITH SECRET "my_secret"FROM /tmp/export.expIDENTIFIED BY keypwd5 WITH BACKUP; ADMINISTER KEY MANAGEMENT * ERROR at line 1: ORA-46655…...
电脑盘符错乱,C盘变成D盘怎么办?
在一些特殊情况下,磁盘盘符会出现错乱,C盘可能会变成D盘。那么,这该怎么办呢?下面我们就来了解一下。 通过磁盘管理更改盘符 磁盘管理是Windows自带的工具,它位于“计算机管理”的控制台中。管理硬盘及其所包含的卷或…...
Android WMS——客户端输入事件处理(十九)
前面的文章我们介绍了 WMS 中的输入服务的启动及事件处理,这一篇我们来看一下客户端对输入事件的处理。 一、事件初始化 事件的初始化就是在添加窗口的过程。 1、ViewRootImpl 源码位置:/frameworks/base/core/java/android/view/ViewRootImpl.java public void setView(…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
