@@ -363,28 +363,28 @@ CMS 收集器运行步骤如下:
363363
364364** (1)堆空间被分割为三块空间**
365365
366- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081724119.PNG )
366+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/c68f9afdd16544b381229b8e3cab978a.png )
367367
368368年轻代分割成一个 Eden 区和两个 Survivor 区。年老代一个连续的空间。就地完成对象收集。除非有 FullGC 否则不会压缩。
369369
370370** (2)CMS 年轻代垃圾收集如何工作**
371371
372372年轻代被标为浅绿色,年老代被标记为蓝色。如果你的应用已经运行了一段时间,CMS 的堆看起来应该是这个样子。对象分散在年老代区域里。
373373
374- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081725568.PNG )
374+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/fda8eb230d544ddfa5d6d9101d7b604c.png )
375375
376376使用 CMS,年老代对象就地释放。它们不会被来回移动。这个空间不会被压缩除非发生 FullGC。
377377
378378** (3)年轻代收集**
379379
380380从 Eden 和 Survivor 区复制活跃对象到另一个 Survivor 区。所有达到他们的年龄阈值的对象会晋升到年老代。
381381
382- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081725559.PNG )
382+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/b5a35acac1374de18eeb8e78d8d8c971.png )
383383** (4)年轻代回收之后**
384384
385385一次年轻代垃圾收集之后,Eden 区和其中一个 Survivor 区被清空。
386386
387- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081725941.PNG )
387+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/e93290ecb3e94e21a035f51fb38c685a.png )
388388最近晋升的对象以深蓝色显示在上图中,绿色的对象是年轻代幸免的还没有晋升到老年代对象。
389389
390390##### CMS 回收年老代详细步骤
@@ -393,7 +393,7 @@ CMS 收集器运行步骤如下:
393393
394394发生两次 stop the world 事件:初始标记和重新标记。当年老代达到特定的占用比例时,CMS 开始执行。
395395
396- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081726287.PNG )
396+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/4acf6b83a417432db892cbc5a6267b96.png )
397397
398398- 初始标记是一个短暂暂停的、可达对象被标记的阶段。
399399- 并发标记寻找活跃对象在应用连续执行时。
@@ -403,15 +403,15 @@ CMS 收集器运行步骤如下:
403403
404404在之前阶段没有被标记的对象会被就地释放。不进行压缩操作。
405405
406- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081726220.PNG )
406+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/da098e6570be494e953c450e6d931bd8.png )
407407
408408** 注意:** 未被标记的对象等于死亡对象
409409
410410** (3)年老代收集-清除之后**
411411
412412清除阶段之后,你可以看到大量内存被释放。你还可以注意到没有进行压缩操作。
413413
414- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081726500.PNG )
414+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/2abd98df7b054b448b9d346467f4f6d0.png )
415415
416416最后,CMS 收集器会再次进入重新设置阶段,等待下一次垃圾收集时机的到来。
417417
@@ -483,15 +483,15 @@ G1 取消了永久代,并把年轻代和老年代划分成多个大小相等
483483
484484堆空间是一个被分成许多固定大小区域的内存块。
485485
486- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081730800.PNG )
486+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/7774f99b61d843939f285115f8ad7895.png )
487487
488488Java 虚拟机启动时选定区域大小。Java 虚拟机通常会指定 2000 个左右的大小相等、每个大小范围在 1 到 32M 的区域。
489489
490490** (2)G1 堆空间分配**
491491
492492实际上,这些区域被映射成 Eden、Survivor、年老代空间的逻辑表述形式。
493493
494- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081730251.PNG )
494+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/d8d3e1f31c334c1e8fba9f44f9f3c22a.png )
495495
496496图片中的颜色表明了哪个区域被关联上什么角色。活跃对象从一个区域疏散(复制、移动)到另一个区域。区域被设计为并行的方式收集,可以暂停或者不暂停所有的其它用户线程。
497497
@@ -503,15 +503,15 @@ Java 虚拟机启动时选定区域大小。Java 虚拟机通常会指定 2000
503503
504504堆空间被分割成大约 2000 个区域。最小 1M,最大 32M,蓝色区域保持年老代对象,绿色区域保持年轻代对象。
505505
506- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081730610.PNG )
506+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/67e6a1a4dc8c4e569712934570d5c92d.png )
507507
508508** 注意:** 区域没有必要像旧的收集器一样是保持连续的。
509509
510510** (4)G1 的年轻代收集**
511511
512512活跃对象会被疏散(复制、移动)到一个或多个 survivor 区域。如果达到晋升总阈值,对象会晋升到年老代区域。
513513
514- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081731624.PNG )
514+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/7fe0b0b51674407dafa82cd45c1d0ad3.png )
515515
516516这是一个 stop the world 暂停。为下一次年轻代垃圾回收计算 Eden 和 Survivor 的大小。保留审计信息有助于计算大小。类似目标暂停时间的事情会被考虑在内。
517517
@@ -521,7 +521,7 @@ Java 虚拟机启动时选定区域大小。Java 虚拟机通常会指定 2000
521521
522522活跃对象被疏散到 Survivor 或者年老代区域。
523523
524- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081731782.PNG )
524+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/daf36ad8bd8b4e078610f3ef650ba8b7.png )
525525
526526最近晋升的对象显示为深蓝色。Survivor 区域显示为绿色。
527527
@@ -539,31 +539,31 @@ Java 虚拟机启动时选定区域大小。Java 虚拟机通常会指定 2000
539539
540540年轻代垃圾收集肩负着活跃对象初始标记的任务。在日志文件中被标为* GC pause (young)(inital-mark)*
541541
542- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081731007.PNG )
542+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/b69e620775e748de87b001209b2c89bf.png )
543543
544544** (2)并发标记阶段**
545545
546546如果发现空区域 (“X”标示的),在重新标记阶段它们会被马上清除掉。当然,决定活性的审计信息也在此时被计算。
547547
548- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081731904.PNG )
548+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/8711eeb3c8c343fbbb203ca67dfd5812.png )
549549
550550** (3)重新标记阶段**
551551
552552空的区域被清除和回收掉。所有区域的活性在此时计算。
553553
554- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081732338.PNG )
554+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/509fc4c28157403588b0819ef01222cc.png )
555555
556556** (4)复制/清理阶段**
557557
558558G1 选择活性最低的区域,这些区域能够以最快的速度回收。然后这些区域会在年轻代垃圾回收过程中被回收。在日志中被指示为* [ GC pause (mixed)] * 。所以年轻代和年老代在同一时间被回收。
559559
560- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081732946.PNG )
560+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/614edc61b0a54b758ea8d7632a76d1c4.png )
561561
562562** (5)复制/清理阶段之后**
563563
564564被选择的区域已经被回收和压缩到图中显示的深蓝色区和深绿色区中。
565565
566- ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/202602081732852.PNG )
566+ ![ ] ( https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/244ee999971f478fbc4b2eb8a514e4e6.png )
567567
568568### 总结
569569
@@ -657,4 +657,4 @@ JVM 规范中运行时数据区域中的**方法区**,在 HotSpot 虚拟机中
657657- [ 从表到里学习 JVM 实现] ( https://www.douban.com/doulist/2545443/ )
658658- [ 详解 JVM Garbage First(G1) 垃圾收集器] ( https://blog.csdn.net/coderlius/article/details/79272773 )
659659- [ G1 垃圾收集器入门] ( https://blog.csdn.net/zhanggang807/article/details/45956325 )
660- - [ Getting Started with the G1 Garbage Collector] ( https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html )
660+ - [ Getting Started with the G1 Garbage Collector] ( https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html )
0 commit comments