G1 GC详解及设置
一、概述
G1 GC,全称Garbage-First Garbage Collector,在JDK1.7中引入了G1 GC,从JAVA 9开始,G1 GC是默认的GC算法。通过-XX:+UseG1GC参数来启用。G1收集器是工作在堆内不同分区上的收集器,分区既可以是年轻代也可以是老年代,同一个代的分区不需要连续。并且每个代分区的数量是可以动态调整的。为老年代设置分区的目的是老年代里有的分区垃圾多,有的分区垃圾少,这样在回收的时候可以专注于收集垃圾多的分区,这也是G1名称的由来。不过这个算法并不适合新生代垃圾收集,因为新生代的垃圾收集算法是复制算法,但是新生代也使用了分区机制主要是因为便于代大小的调整。
G1 功能包括:
- 堆大小可达数十 GB 或更大,超过 50% 的 Java 堆被实时数据占用。
- 对象分配和提升的速率可能会随时间而显著变化。
- 堆中存在大量碎片。
- 可预测的暂停时间目标目标不超过几百毫秒,避免长时间的垃圾回收暂停。
G1 GC是设计用来取代CMS的,同CMS相比G1有以下优势:
1、可预测的停顿模型
2、避免了CMS的垃圾碎片
3、超大堆的表现更出色
G1里面的Region的概念不同于传统的垃圾回收算法中的分区的概念。G1默认把堆内存分为1024个分区,后续垃圾收集的单位都是以Region为单位的。Region是实现G1算法的基础,每个Region的大小相等,通过-XX:G1HeapRegionSize参数可以设置Region的大小
G1的内存划分和主要收集过程
G1收集回收器将堆进行分区,划分为一个个的区域,每次收集的时候,只收集其中几个区域,以此来控制垃圾回收产生一次停顿时间。
G1的收集过程可能有4个阶段:
- 新生代GC
- 并发标记周期
- 混合收集
- (如果需要)进行Full GC。
二、关键概念
SATB
SATB的全称是Snapchat-At-The_Beginning。SATB是维持并发GC的一种手段。G1并发的基础就是SATB。SATB可以理解成在GC开始之前对堆内存里的对象做一次快照,此时活的对象就认为是活的,从而形成一个对象图。在GC收集的时候,新生代的对象也认为是活的对象,除此之外其他不可达的对象都认为是垃圾对象。
RSet
RSet全称是Remember Set,每个Region中都有一个RSet,记录的是其他Region中的对象引用本Region对象的关系(谁引用了我的对象)。G1里面还有另外一种数据结构就Collection Set(CSet),CSet记录的是GC要收集的Region的集合,CSet里的Region可以是任意代的。在GC的时候,对于old->young和old->old的跨代对象引用,只要扫描对应的CSet中的RSet即可
停顿预测模型
G1收集器突出表现出来的一点是通过一个停顿预测模型来根据用户配置的停顿时间来选择CSet的大小,从而达到用户期待的应用程序暂停时间。通过-XX:MaxGCPauseMillis参数来设置。这一点有点类似于ParallelScavenge收集器。关于停顿时间的设置并不是越短越好。设置的时间越短意味着每次收集的CSet越小,导致垃圾逐步积累变多,最终不得不退化成Serial GC;停顿时间设置的过长,那么会导致每次都会产生长时间的停顿,影响了程序对外的响应时间。
堆布局
G1 将堆分区为一组大小相等的堆区域,每个堆区域都是一个连续的虚拟内存范围,如图 9-1 所示。区域是内存分配和内存回收的单位。在任何给定时间,这些区域中的每一个都可以为空(浅灰色),也可以分配给特定的一代,年轻或年老。当内存请求传入时,内存管理器会分发空闲区域。内存管理器将它们分配给一代,然后将它们作为可用空间返回到应用程序,它可以在其中分配自身。
图 7-1 G1 垃圾回收器堆布局
年轻一代包含伊甸园区域(红色)和幸存者区域(红色带“S”)。这些区域提供与其他收集器中各自的连续空间相同的功能,不同之处在于,在 G1 中,这些区域通常在内存中以不连续的模式布局。旧区域(浅蓝色)组成了老一代。对于跨越多个区域的对象,旧一代区域可能是巨大的(浅蓝色带“H”)。
应用程序始终分配给年轻一代,即伊甸园区域,但直接分配给属于老一代的巨大对象除外。
垃圾回收周期
在高电平上,G1集电极在两相之间交替。仅限年轻阶段包含垃圾回收,这些垃圾回收会逐渐用旧一代中的对象填满当前可用的内存。空间回收阶段是G1除了处理年轻一代之外,还逐步回收老一代的空间。然后,循环以仅年轻阶段重新开始。
图 9-2 概述了此循环,并举例说明了可能发生的垃圾回收暂停序列:
以下列表详细描述了 G1 垃圾回收周期的各个阶段、暂停以及各个阶段之间的过渡:
-
仅限年轻代的阶段:这个阶段从一些普通的年轻代开始,这些系列将对象推广到老年代。仅年轻阶段和空间回收阶段之间的过渡在老年代占用达到特定阈值(起始堆占用阈值)时开始。此时,G1 计划并发启动年轻集合,而不是普通年轻集合。
-
并发启动 :此类型的集合除了执行普通年轻集合外,还会启动标记过程。并发标记确定在下一个空间回收阶段保留的旧一代区域中所有当前可访问的(活动)对象。虽然收集标记尚未完全完成,但可能会出现正常的年轻代收集。标记以两个特殊的停止世界暂停结束:备注和清理。
-
备注:此暂停将完成标记本身,执行全局引用处理和类卸载,回收完全空白的区域并清理内部数据结构。在备注和清理之间 G1 计算信息,以便以后能够同时回收选定的旧生成区域中的可用空间,这将在清理暂停中完成。
-
清理:此暂停确定是否实际进入空间回收阶段。如果随后是空间回收阶段,则仅幼崽阶段将以单个“准备混合幼崽”集合完成。
-
-
空间回收阶段:此阶段由多个混合集合组成,除了年轻一代区域外,还疏散旧一代区域集合的活体。当G1确定撤离更多的老一代区域不会产生足够的可用空间值得付出努力时,空间回收阶段就结束了。
空间回收后,收集周期以另一个仅限年轻人的阶段重新开始。作为备份,如果应用程序在收集活动信息时内存不足,G1 会像其他收集器一样执行就地停止世界完整堆压缩 (Full GC)。
垃圾回收暂停和收集组
G1 在停止世界暂停时执行垃圾回收和空间回收。活动对象通常从源区域复制到堆中的一个或多个目标区域,并调整对这些移动对象的现有引用。
对于非大型区域,对象的目标区域由该对象的源区域确定:
- 年轻代的对象(伊甸园和幸存者区域)根据年龄被复制到幸存者或旧区域。
- 旧区域中的对象将复制到其他旧区域。
巨大区域中的物体处理方式不同。G1只决定它们的存活度,如果它们不存活,则回收它们占用的空间。G1永远不会移动巨大区域内的物体。
收集组是要从中回收空间的源区域集。根据垃圾回收的类型,收集组由不同类型的区域组成:
- 在仅限年轻代,收集组仅包含年轻一代中的区域,以及具有可能被回收的对象的巨大区域。
- 在空间回收阶段,收集组由年轻一代中的区域、具有可能被回收的对象的巨大区域以及收集组候选区域中的一些旧一代区域组成。
G1 在并发周期内准备收集组候选区域。在备注暂停期间,G1 会选择占用率较低的区域,即包含大量可用空间的区域。然后,在备注和清理暂停之间同时准备这些区域,以供以后收集。清理暂停会根据其效率对此准备的结果进行排序。在后续混合集合中,似乎需要较少时间收集且包含更多可用空间的更高效区域是首选。
三、全局并发标记阶段
全局并发标记阶段是基于SATB的,与CMS有些类似,但是也有不同的地方,主要的几个阶段如下:
- 初始标记阶段:G1 GC 在此阶段标记根。此阶段搭载在正常 (STW) 年轻垃圾收集之上。
- 根区域扫描阶段:G1 GC 扫描初始标记的幸存者区域以查找对旧一代的引用,并标记引用的对象。此阶段与应用程序(不是 STW)同时运行,并且必须在下一个 STW 年轻垃圾回收开始之前完成。
- 并发标记阶段:G1 GC 查找整个堆中可访问的(活动)对象。此阶段与应用程序同时发生,并可能被 STW 年轻垃圾回收中断。
- 备注阶段:此阶段是STW收集,有助于完成打标周期。G1 GC 会排出 SATB 缓冲区,跟踪未访问的活动对象,并执行引用处理。
- 清理阶段:在最后阶段,G1 GC 执行记帐和 RSet 清理的 STW 操作。在记帐过程中,G1 GC 识别完全自由的区域和混合垃圾回收候选者。清理阶段在重置空区域并将其返回到空闲列表时部分并发。
四、G1特点
1. Java 堆大小调整
G1在调整Java堆大小时遵循标准规则,使用-XX:InitialHeapSize作为最小Java堆大小,-XX:MaxHeapSize为最大Java堆大小;-XX:MinHeapFreeRatio为最小可用内存百分比,-XX:MaxHeapFreeRatio确定调整大小后的最大可用内存百分比。G1收集器考虑在Remark和FullGC暂停期间调整Java堆的大小。此过程可以向操作系统释放内存或从操作系统分配内存。
1.1.年轻代调整
G1总是在下一个突变子阶段的正常年轻收集结束时确定年轻一代的大小。这样,G1可以满足基于实际暂停时间的长期观察使用-XX:MaxGCPauseTimeMillis和-XX:PauseTimeIntervalMillis设置的暂停时间目标。它考虑到了类似规模的年轻一代需要多长时间才能撤离。这包括在收集期间必须复制多少对象以及这些对象之间的互连程度等信息。
如果没有其他约束,则G1在-XX:G1NewSizePercent和-XX:G1MaxNewSizePpercent确定的值之间自适应地调整年轻一代的大小,以满足暂停时间。有关如何修复长暂停的更多信息,请参阅垃圾第一垃圾收集器调整。
或者,可以使用-XX:NewSize与-XX:MaxNewSize组合来分别设置最小和最大年轻一代大小。
1.2.在空间回收阶段
在空间回收阶段,G1尝试在单个垃圾收集暂停中最大化旧一代中回收的空间量。年轻一代的大小设置为允许的最小值,通常由-XX:G1NewSizePercent确定。
在该阶段的每个混合集合开始时,G1从集合集合候选集合中选择一组区域以添加到集合集合。这套额外的旧一代区域由三部分组成:
- 确保疏散进度的至少一组年老代区域。这组年老代区域由集合集合候选中的区域数量除以空间回收阶段的长度由-XX:G1MixedGCCountTarget确定。
- 如果 G1 预测在收集最小集合后将有剩余时间,则收集组候选项中的其他旧生成区域。添加旧生成区域,直到预计使用剩余时间的 80%。
- 一组可选的收集组区域,G1 在其他两个部件撤出后逐渐撤出,并且此暂停中还有时间。
2.定期垃圾回收
如果由于应用程序不活动而长时间没有垃圾收集,那么VM可能会长时间保留大量未使用的内存,而这些内存可以在其他地方使用。为了避免这种情况,可以使用-XX:G1PeriodicGCInterval选项强制G1执行常规垃圾收集。此选项确定G1考虑执行垃圾收集的最小间隔(毫秒)。如果自上一次垃圾收集暂停以来经过了这段时间,并且没有正在进行的并发循环,G1将触发其他垃圾收集,并可能产生以下影响:
- 在“仅年轻”阶段:G1使用“并发开始”暂停启动并发标记,如果指定了-XX:-G1PeriodicGCInvokesConcurrent,则使用“Full GC”。
- 空间回收阶段:G1 继续空间回收阶段,触发适合当前进度的垃圾回收暂停类型。
-XX:G1PeriodicGCSystemLoadThreshold选项可用于优化是否触发垃圾收集:如果JVM主机系统(例如,容器)上getloadavg()调用返回的平均一分钟系统负载值高于此值,则不会运行定期垃圾收集。
五、启用 G1
垃圾第一垃圾收集器是默认的收集器,因此通常不需要执行任何其他操作。您可以通过在命令行上提供-XX:+UseG1GC来显式启用它。
六、G1的收集模式:
YoungGC:收集年轻代里的Region
MixGC:年轻代的所有Region+全局并发标记阶段选出的收益高的Region
无论是YoungGC还是MixGC都只是并发拷贝的阶段。
分代G1模式下选择CSet有两种子模式,分别对应YoungGC和mixedGC:
YoungGC:CSet就是所有年轻代里面的Region
MixedGC:CSet是所有年轻代里的Region加上在全局并发标记阶段标记出来的收益高的Region
G1的运行过程是这样的,会在Young GC和Mix GC之间不断的切换运行,同时定期的做全局并发标记,在实在赶不上回收速度的情况下使用Full GC(Serial GC)。初始标记是搭在YoungGC上执行的,在进行全局并发标记的时候不会做Mix GC,在做Mix GC的时候也不会启动初始标记阶段。当MixGC赶不上对象产生的速度的时候就退化成Full GC,这一点是需要重点调优的地方。
七、触发Full GC的情况:
1. 调用 System.gc()
只是建议虚拟机执行 Full GC,但是虚拟机不一定真正去执行。不建议使用这种方式,而是让虚拟机管理内存。
2. 未指定老年代和新生代大小,堆伸缩时会产生fullgc,所以一定要配置-Xmx、-Xms
3. 老年代空间不足
老年代空间不足的常见场景比如大对象、大数组直接进入老年代、长期存活的对象进入老年代等。
为了避免以上原因引起的 Full GC,应当尽量不要创建过大的对象以及数组。
除此之外,可以通过 -Xmn 虚拟机参数调大新生代的大小,让对象尽量在新生代被回收掉,不进入老年代。
还可以通过 -XX:MaxTenuringThreshold 调大对象进入老年代的年龄,让对象在新生代多存活一段时间。
在执行Full GC后空间仍然不足,则抛出错误:java.lang.OutOfMemoryError: Java heap space
4. JDK 1.7 及以前的(永久代)空间满
在 JDK 1.7 及以前,HotSpot 虚拟机中的方法区是用永久代实现的,永久代中存放的为一些 Class 的信息、常量、静
态变量等数据。
当系统中要加载的类、反射的类和调用的方法较多时,永久代可能会被占满,在未配置为采用 CMS GC 的情况下也会执行 Full GC。
如果经过 Full GC 仍然回收不了,那么虚拟机会抛出java.lang.OutOfMemoryError PermGen space
为避免以上原因引起的 Full GC,可采用的方法为增大Perm Gen或转为使用 CMS GC。
5. 空间分配担保失败
空间担保,下面两种情况是空间担保失败:
1、每次晋升的对象的平均大小 > 老年代剩余空间
2、Minor GC后存活的对象超过了老年代剩余空间
八、G1常用参数
参数/默认值 含义
-XX:+UseG1GC | 使用 G1 垃圾收集器 |
-XX:MaxGCPauseMillis=200 | 设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到) |
-XX:InitiatingHeapOccupancyPercent=45 | 启动并发GC周期时的堆内存占用百分比. G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示”一直执行GC循环”. 默认值为 45. |
-XX:NewRatio=n | 新生代与老生代(new/old generation)的大小比例(Ratio). 默认值为 2. |
-XX:SurvivorRatio=n | eden/survivor 空间大小的比例(Ratio). 默认值为 8. |
-XX:MaxTenuringThreshold=n | 提升年老代的最大临界值(tenuring threshold). 默认值为 15. |
-XX:ParallelGCThreads=n | 设置垃圾收集器在并行阶段使用的线程数,默认值随JVM运行的平台不同而不同. |
-XX:ConcGCThreads=n | 并发垃圾收集器使用的线程数量. 默认值随JVM运行的平台不同而不同. |
-XX:G1ReservePercent=n | 设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10. |
-XX:G1HeapRegionSize=n | 使用G1时Java堆会被分为大小统一的的区(region)。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为 1Mb, 最大值为 32Mb. |
九、重要默认值
G1 GC 是一个自适应垃圾回收器,其默认值使其无需修改即可高效工作。以下是重要选项及其默认值的列表。此列表适用于最新的 Java HotSpot VM,内部版本 24。您可以通过在 JVM 命令行上输入以下选项并更改设置来调整和调整 G1 GC 以满足您的应用程序性能需求。
-XX:G1HeapRegionSize=n
设置 G1 区域的大小。该值将是 1 的幂,范围从 32MB 到 2048MB。目标是根据最小 Java 堆大小拥有大约 <> 个区域。
-XX:MaxGCPauseMillis=200
设置所需最大暂停时间的目标值。默认值为 200 毫秒。指定的值不适合您的堆大小。
-XX:G1NewSizePercent=5
设置要用作年轻一代大小的最小堆的百分比。默认值为 Java 堆的 5%。这是一个实验标志。有关示例,请参阅“如何解锁实验性 VM 标志”。此设置将替换该设置。此设置在 Java HotSpot VM(内部版本 23)中不可用。
-XX:DefaultMinNewGenPercent
-XX:G1MaxNewSizePercent=60
设置要用作年轻一代大小的最大值的堆大小百分比。默认值为 Java 堆的 60%。这是一个实验标志。有关示例,请参阅“如何解锁实验性 VM 标志”。此设置将替换该设置。此设置在 Java HotSpot VM(内部版本 23)中不可用。
-XX:DefaultMaxNewGenPercent
-XX:ParallelGCThreads=n
设置 STW 工作线程的值。将 n 的值设置为逻辑处理器的数量。的值与逻辑处理器的数量相同,最大值为 8。
n
如果逻辑处理器超过 5 个,则将 的值设置为大约 8/5 的逻辑处理器。这在大多数情况下都有效,但较大的 SPARC 系统除外,其中的值大约是逻辑处理器的 16/<>。
n
n
-XX:ConcGCThreads=n
设置平行标记线程的数量。设置为大约 1/4 的并行垃圾回收线程数 ()。
n
ParallelGCThreads
-XX:InitiatingHeapOccupancyPercent=45
设置触发标记周期的 Java 堆占用阈值。默认占用是整个 Java 堆的 45%。
-XX:G1MixedGCLiveThresholdPercent=65
设置要包含在混合垃圾回收周期中的旧区域的占用阈值。默认入住率为 65%。这是一个实验标志。有关示例,请参阅“如何解锁实验性 VM 标志”。此设置将替换该设置。此设置在 Java HotSpot VM(内部版本 23)中不可用。
-XX:G1OldCSetRegionLiveThresholdPercent
-XX:G1HeapWastePercent=10
设置您愿意浪费的堆的百分比。当可回收百分比小于堆浪费百分比时,Java HotSpot 虚拟机不会启动混合垃圾回收周期。默认值为 10%。此设置在 Java HotSpot VM(内部版本 23)中不可用。
-XX:G1MixedGCCountTarget=8
设置标记周期后混合垃圾回收的目标数量,以收集最多包含实时数据的旧区域。默认值为 8 个混合垃圾回收。混合集合的目标是在此目标数量范围内。此设置在 Java HotSpot VM(内部版本 23)中不可用。
G1MixedGCLIveThresholdPercent
-XX:G1OldCSetRegionThresholdPercent=10
设置混合垃圾回收周期中要收集的旧区域数的上限。缺省值为 Java 堆的 10%。此设置在 Java HotSpot VM(内部版本 23)中不可用。
-XX:G1ReservePercent=10
设置要保持空闲的保留内存的百分比,以降低空间溢出的风险。默认值为 10%。增加或减少百分比时,请确保将 Java 堆总量调整相同的量。此设置在 Java HotSpot VM(内部版本 23)中不可用。
相关文章:

G1 GC详解及设置
一、概述 G1 GC,全称Garbage-First Garbage Collector,在JDK1.7中引入了G1 GC,从JAVA 9开始,G1 GC是默认的GC算法。通过-XX:UseG1GC参数来启用。G1收集器是工作在堆内不同分区上的收集器,分区既可以是年轻代也可以是老…...
GitHub详细教程
将代码推送到GitHub仓库涉及一系列的步骤。以下是详细的步骤说明: 创建一个新的仓库(如果还没有的话): 访问 GitHub。登录您的帐户。点击页面右上角的图标,然后选择“New repository”。填写仓库名称、描述等信息&…...

【小沐学Python】Python实现Web图表功能(Dash)
文章目录 1、简介2、安装3、功能示例3.1 Hello World3.2 连接到数据3.3 可视化数据3.4 控件和回调3.5 设置应用的样式3.5.1 HTML and CSS3.5.2 Dash Design Kit (DDK)3.5.3 Dash Bootstrap Components3.5.4 Dash Mantine Components 4、更多示例4.1 Basic Dashboard4.2 Using C…...

【RabbitMQ】docker rabbitmq集群 docker搭建rabbitmq集群
docker rabbitmq集群 docker搭建rabbitmq集群 RabbitMQ提供了两种常用的集群模式 1.普通集群模式 2.镜像集群模式 普通集群模式只能同步主节点上的交换机和队列信息,但对于队列中的消息不做同步,主节点宕机也不能进行切换(故障转移ÿ…...
Linux 网络驱动实验
本文章对Linux 网络驱动实验中的设备树进行介绍,Linux网络驱动程序比较复杂,只要学会应用。 1、I.MX6ULL 网络外设设备树 I.MX6ULL 有两个 10/100M 的网络 MAC 外设,因此 I.MX6ULL 网络驱动主要就是这两个网络 MAC 外设的驱动。 fec1…...

访问Apache Tomcat的虚拟主机管理页面
介绍 通过Tomcat Host Manager应用可以创建、删除、管理Tomcat内的虚拟主机(virtual hosts)。该应用是Tomcat安装的一部分,默认在<Tomcat安装目录>/webapps/host-manager: 配置用户名、密码、角色 要访问Host Manager应…...

【算法】排序——归并排序和计数排序
主页点击直达:个人主页 我的小仓库:代码仓库 C语言偷着笑:C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法头疼记:算法专栏…...

discuz封面设置失败的解决办法(centos系统+windows系统)
discuz封面设置失败的解决办法(centos系统windows系统) centos系统:1、开启/var/www/html 这个目录的读写权限chmod -R 777 /var/www/html然后重启httpd:service httpd restart如果discuz论坛发布帖子,还是显示封面设置失败的话…...

AI绘画-Stable Diffusion笔记
软件:Stable Diffusion 视频教程来自 https://www.bilibili.com/video/BV1As4y127HW/?spm_id_from333.337.search-card.all.click 提示词 提示词类别 内容型提示词 人物主题特征: 服饰穿搭:white dress 发型发色:blonde hair,l…...
中值滤波算法及例程
中值滤波是一种常用的非线性图像滤波算法,它能够有效去除图像中的椒盐噪声(即孤立的亮或暗像素点),同时保持图像边缘和细节的清晰度。中值滤波的主要思想是使用一个滑动窗口,在窗口内对像素值进行排序,并将…...

SpringBoot 如何使用 Ehcache 作为缓存
使用Spring Boot Sleuth进行分布式跟踪 在现代分布式应用程序中,跟踪请求和了解应用程序的性能是至关重要的。Spring Boot Sleuth是一个分布式跟踪解决方案,它可以帮助您在分布式系统中跟踪请求并分析性能问题。本文将介绍如何在Spring Boot应用程序中使…...

Stable Diffusion 图片换脸插件Roop保姆教程 附错误解决办法和API使用
换脸技术已经不是新鲜事物,但如何实现简单、快速、高效的换脸操作呢?Roop插件正是为解决这一问题而生的。 sd-webui-roop 插件适用于已经本地部署了SD的用户。相较于传统的换脸技术,Roop插件几乎不需要训练,只需一张照片,即可在10秒内完成换脸。 但是要注意到是必须注意…...

华为OD机试 - 组成最大数(Java 2023 B卷 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》…...

十一、2023.10.5.计算机网络(end).11
文章目录 17、说说 TCP 可靠性保证?18、简述 TCP 滑动窗口以及重传机制?19、说说滑动窗口过小怎么办?20、说说如果三次握手时候每次握手信息对方没收到会怎么样,分情况介绍?21、简述 TCP 的 TIME_WAIT,为什么需要有这个状态&…...

基于SpringBoot的网上摄影工作室
目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 作品分类管理 轮播图管理 摄影作品管理 摄影作品收藏 摄影圈 摄影作品发布 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统…...

Spring源码解析——IOC之bean 的初始化
正文 一个 bean 经历了 createBeanInstance() 被创建出来,然后又经过一番属性注入,依赖处理,历经千辛万苦,千锤百炼,终于有点儿 bean 实例的样子,能堪大任了,只需要经历最后一步就破茧成蝶了。…...
互联网摸鱼日报(2023-10-07)
互联网摸鱼日报(2023-10-07) 36氪新闻 小米汽车将研发增程式电动车,产品已有规划;LG新能源和丰田汽车北美公司签署电动汽车电池供应协议|36氪新能源日报1005 详解企业数字化转型建设过程中所需的七种能力 电商平台,如何让丰收「…...

深入理解RBAC
RBAC是一种基于角色实现访问控制的权限管理机制,通过定义角色和权限、用户和角色、角色和角色之间的关系,实现多层次、细粒度、可复用的权限管理系统。原文: Role-based Access Control (RBAC) Model[1] Bernard HermantUnsplash Avery Pennarun写的&quo…...
uniapp微信小程序蓝牙连接与设备数据对接
蓝牙连接并通信方法封装大致步骤。 初始化蓝牙并搜索;获取并启用service服务;数据读取和监听设备返回数据 需要使用uniapp官方提供api: // 关闭蓝牙 uni.closeBluetoothAdapter({}) // 打开蓝牙 uni.openBluetoothAdapter({}) // 搜索附近…...
HBase 计划外启动 Major Compaction 的原因
HBase 的 Compaction 有两个线程池,一个是为 Minor Compaction 准备的, 一个是为 Major Compaction 准备的,hbase.regionserver.thread.compaction.throttle 是决定 Compaction 请求放入哪个线程池的阈值,当待合并文件的总大小小于这个阈值时,就是一个 Minor Compaction,…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...