故城建设局政府网站/制作一个小型网站
前言:
上一篇我们分析了 Minor GC 的发生过程,因为 GC 日志没有按我们预估的思路进行打印,其中打印了 CMS 垃圾回收器的部分日志,本篇我们就来分析一下 CMS 垃圾收集日志。
JVM 系列文章传送门
初识 JVM(Java 虚拟机)
深入理解 JVM(Java 虚拟机)
一文搞懂 JVM 垃圾回收(JVM GC)
深入理解 JVM 垃圾回收算法
一文搞懂 JVM 垃圾收集器
JVM 调优相关参数
JVM 场景面试题【强烈推荐】
JVM 性能调优 – 线上应用 JVM 内存的的预估设置【实战】
JVM 性能调优 – 线上应用 JVM 内存调优【实战】
JVM 性能调优 – 模拟触发 Minor GC【GC 日志分析】
JVM 性能调优 – 模拟触发 Minor GC(2)【GC 日志分析】
CMS 垃圾收集器出发的条件
我们知道 CMS 垃圾收集器是老年代的垃圾回收器,因此想要触发 CMS 垃圾回收,就必须触发老年代的 GC,也就是 Full GC,因此 CMS 垃圾收集器出发的条件就是 Full GC 的触发条件,如下:
- 老年代空间不足:Minor GC 后,有对象要晋升到老年代,此时老年代空间也不足,触发 Full GC。大对象直接在老年代创建的时候,发现老年代内存不足,直接触发 Full GC。
- 永久代空间不足:永久代默认空间是 21MB,如果永久代空间不足,也会触发 Full GC。
- 代码中显示调用 System.gc(),这种方式也会触发 Full GC,但是不会马上出发 Full GC。
可以知道简单的方式是调用 System.gc() 方法,不过本篇我们采用让老年代空间不足的方式来触发 Full GC。
JVM 配置
为了尽快触发 Full GC 我们调整年轻代老年代的空间占比,具体 JVM 参数如下:
-XX:NewSize=2m -XX:MaxNewSize=2m -Xms4m -Xmx4m -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=3m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:gc.log
上述 JVM 的参数在上一篇都逐个解释过,这里就不在逐个解释了,这里只简单陈述一下堆空间内存分配情况,新生代初始内存空间大小 2MB,新生代最大内存空间大小 2MB,初始堆内存大小 4MB,最大堆内存大小 4MB。
案例代码
案例代码我们还是使用上一篇中使用的案例代码,如下:
@Slf4j
public class MinorGcDemo {public static void main(String[] args) {byte[] array = new byte[1024 * 1024];array = new byte[1024 * 1024];array = new byte[1024 * 1024 * 2];log.info("结束了");}
}
我们创建了 2个 1MB 对象和 1个 2MB 对象,一共 4MB 的对象,整个堆内存我只分配了 4MB 的内存空间(内存占用情况的演进就不演示了),在加上对象的对象头等占用的内存,整个堆内存空间肯定是不足的,一定会发生 Full GC 并发生 OutOfMemoryError 错误,我们启动程序验证一下。
启动程序验证
启动程序后控制台如下:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat com.order.service.controller.MinorGcDemo.main(MinorGcDemo.java:17)
是按着我们的推理来打印的,控制台打印了 OutOfMemoryError 错误。结果符合预期。
GC 日志文件详情如下:
Java HotSpot(TM) 64-Bit Server VM (25.121-b13) for windows-amd64 JRE (1.8.0_121-b13), built on Dec 12 2016 18:21:36 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 33379636k(6965084k free), swap 61458536k(11599036k free)
CommandLine flags: -XX:InitialHeapSize=4194304 -XX:MaxHeapSize=4194304 -XX:MaxNewSize=2097152 -XX:NewSize=2097152 -XX:OldPLABSize=16 -XX:PretenureSizeThreshold=31457280 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:-UseLargePagesIndividualAllocation -XX:+UseParNewGC
2024-11-19T20:06:06.078+0800: 0.152: [GC (Allocation Failure) 2024-11-19T20:06:06.078+0800: 0.153: [ParNew: 1655K->192K(1856K), 0.0019913 secs] 1655K->857K(3904K), 0.0021878 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.109+0800: 0.183: [GC (Allocation Failure) 2024-11-19T20:06:06.109+0800: 0.183: [ParNew: 1845K->192K(1856K), 0.0005122 secs] 2510K->1415K(3904K), 0.0005720 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.109+0800: 0.184: [GC (CMS Initial Mark) [1 CMS-initial-mark: 1223K(2048K)] 1905K(3904K), 0.0001422 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.110+0800: 0.184: [CMS-concurrent-mark-start]
2024-11-19T20:06:06.110+0800: 0.185: [CMS-concurrent-mark: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.110+0800: 0.185: [CMS-concurrent-preclean-start]
2024-11-19T20:06:06.110+0800: 0.185: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.110+0800: 0.185: [GC (CMS Final Remark) [YG occupancy: 682 K (1856 K)]2024-11-19T20:06:06.110+0800: 0.185: [Rescan (parallel) , 0.0002234 secs]2024-11-19T20:06:06.111+0800: 0.185: [weak refs processing, 0.0000306 secs]2024-11-19T20:06:06.111+0800: 0.185: [class unloading, 0.0002078 secs]2024-11-19T20:06:06.111+0800: 0.185: [scrub symbol table, 0.0003043 secs]2024-11-19T20:06:06.111+0800: 0.186: [scrub string table, 0.0000963 secs][1 CMS-remark: 1223K(2048K)] 1905K(3904K), 0.0009979 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.111+0800: 0.186: [CMS-concurrent-sweep-start]
2024-11-19T20:06:06.112+0800: 0.186: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.112+0800: 0.186: [CMS-concurrent-reset-start]
2024-11-19T20:06:06.112+0800: 0.186: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.146+0800: 0.222: [GC (Allocation Failure) 2024-11-19T20:06:06.146+0800: 0.222: [ParNew: 1856K->192K(1856K), 0.0006090 secs] 3078K->1675K(3904K), 0.0006961 secs] [Times: user=0.14 sys=0.02, real=0.00 secs]
2024-11-19T20:06:06.147+0800: 0.222: [GC (CMS Initial Mark) [1 CMS-initial-mark: 1483K(2048K)] 1692K(3904K), 0.0001575 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.147+0800: 0.223: [CMS-concurrent-mark-start]
2024-11-19T20:06:06.148+0800: 0.223: [CMS-concurrent-mark: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.148+0800: 0.223: [CMS-concurrent-preclean-start]
2024-11-19T20:06:06.148+0800: 0.223: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.148+0800: 0.224: [GC (CMS Final Remark) [YG occupancy: 268 K (1856 K)]2024-11-19T20:06:06.148+0800: 0.224: [Rescan (parallel) , 0.0001757 secs]2024-11-19T20:06:06.148+0800: 0.224: [weak refs processing, 0.0000291 secs]2024-11-19T20:06:06.148+0800: 0.224: [class unloading, 0.0002782 secs]2024-11-19T20:06:06.149+0800: 0.224: [scrub symbol table, 0.0005185 secs]2024-11-19T20:06:06.149+0800: 0.225: [scrub string table, 0.0001561 secs][1 CMS-remark: 1483K(2048K)] 1752K(3904K), 0.0012909 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.149+0800: 0.225: [CMS-concurrent-sweep-start]
2024-11-19T20:06:06.150+0800: 0.225: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.150+0800: 0.225: [CMS-concurrent-reset-start]
2024-11-19T20:06:06.150+0800: 0.225: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.177+0800: 0.252: [GC (Allocation Failure) 2024-11-19T20:06:06.177+0800: 0.252: [ParNew: 1849K->192K(1856K), 0.0006571 secs] 2895K->1470K(3904K), 0.0007809 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.178+0800: 0.253: [GC (CMS Initial Mark) [1 CMS-initial-mark: 1278K(2048K)] 1477K(3904K), 0.0001639 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.178+0800: 0.253: [CMS-concurrent-mark-start]
2024-11-19T20:06:06.179+0800: 0.254: [CMS-concurrent-mark: 0.001/0.001 secs] [Times: user=0.05 sys=0.01, real=0.00 secs]
2024-11-19T20:06:06.179+0800: 0.254: [CMS-concurrent-preclean-start]
2024-11-19T20:06:06.179+0800: 0.254: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.180+0800: 0.256: [GC (CMS Final Remark) [YG occupancy: 229 K (1856 K)]2024-11-19T20:06:06.180+0800: 0.256: [Rescan (parallel) , 0.0001408 secs]2024-11-19T20:06:06.180+0800: 0.256: [weak refs processing, 0.0000134 secs]2024-11-19T20:06:06.180+0800: 0.256: [class unloading, 0.0002569 secs]2024-11-19T20:06:06.181+0800: 0.256: [scrub symbol table, 0.0003719 secs]2024-11-19T20:06:06.181+0800: 0.256: [scrub string table, 0.0000988 secs][1 CMS-remark: 1278K(2048K)] 1508K(3904K), 0.0009640 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.181+0800: 0.257: [CMS-concurrent-sweep-start]
2024-11-19T20:06:06.182+0800: 0.257: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.182+0800: 0.257: [CMS-concurrent-reset-start]
2024-11-19T20:06:06.182+0800: 0.257: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.211+0800: 0.286: [GC (Allocation Failure) 2024-11-19T20:06:06.211+0800: 0.286: [ParNew: 1856K->191K(1856K), 0.0005452 secs] 3044K->1611K(3904K), 0.0006334 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.211+0800: 0.287: [GC (CMS Initial Mark) [1 CMS-initial-mark: 1419K(2048K)] 1645K(3904K), 0.0002982 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.212+0800: 0.287: [CMS-concurrent-mark-start]
2024-11-19T20:06:06.213+0800: 0.288: [CMS-concurrent-mark: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.213+0800: 0.288: [CMS-concurrent-preclean-start]
2024-11-19T20:06:06.213+0800: 0.288: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.213+0800: 0.288: [GC (CMS Final Remark) [YG occupancy: 284 K (1856 K)]2024-11-19T20:06:06.213+0800: 0.288: [Rescan (parallel) , 0.0002925 secs]2024-11-19T20:06:06.213+0800: 0.288: [weak refs processing, 0.0000151 secs]2024-11-19T20:06:06.213+0800: 0.288: [class unloading, 0.0002927 secs]2024-11-19T20:06:06.214+0800: 0.289: [scrub symbol table, 0.0004106 secs]2024-11-19T20:06:06.214+0800: 0.289: [scrub string table, 0.0000977 secs][1 CMS-remark: 1419K(2048K)] 1703K(3904K), 0.0011965 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.214+0800: 0.289: [CMS-concurrent-sweep-start]
2024-11-19T20:06:06.214+0800: 0.290: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.214+0800: 0.290: [CMS-concurrent-reset-start]
2024-11-19T20:06:06.214+0800: 0.290: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.234+0800: 0.309: [GC (Allocation Failure) 2024-11-19T20:06:06.234+0800: 0.310: [ParNew (promotion failed): 1521K->1521K(1856K), 0.0009737 secs]2024-11-19T20:06:06.235+0800: 0.311: [CMS: 1520K->1648K(2048K), 0.0036692 secs] 2855K->1648K(3904K), [Metaspace: 5082K->5082K(1056768K)], 0.0047468 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
2024-11-19T20:06:06.239+0800: 0.314: [GC (CMS Initial Mark) [1 CMS-initial-mark: 1648K(2048K)] 2672K(3904K), 0.0007071 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2024-11-19T20:06:06.240+0800: 0.315: [CMS-concurrent-mark-start]
2024-11-19T20:06:06.240+0800: 0.315: [GC (Allocation Failure) 2024-11-19T20:06:06.240+0800: 0.316: [ParNew: 1024K->1024K(1856K), 0.0000221 secs]2024-11-19T20:06:06.240+0800: 0.316: [CMS2024-11-19T20:06:06.249+0800: 0.325: [CMS-concurrent-mark: 0.001/0.009 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] (concurrent mode failure): 1648K->1648K(2048K), 0.0120389 secs] 2672K->2672K(3904K), [Metaspace: 5082K->5082K(1056768K)], 0.0121408 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
2024-11-19T20:06:06.253+0800: 0.328: [Full GC (Allocation Failure) 2024-11-19T20:06:06.253+0800: 0.328: [CMS: 1648K->1572K(2048K), 0.0025655 secs] 2672K->2596K(3904K), [Metaspace: 5082K->5082K(1056768K)], 0.0026041 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heappar new generation total 1856K, used 1072K [0x00000000ffc00000, 0x00000000ffe00000, 0x00000000ffe00000)eden space 1664K, 64% used [0x00000000ffc00000, 0x00000000ffd0c3b8, 0x00000000ffda0000)from space 192K, 0% used [0x00000000ffda0000, 0x00000000ffda0000, 0x00000000ffdd0000)to space 192K, 0% used [0x00000000ffdd0000, 0x00000000ffdd0000, 0x00000000ffe00000)concurrent mark-sweep generation total 2048K, used 1572K [0x00000000ffe00000, 0x0000000100000000, 0x0000000100000000)Metaspace used 5113K, capacity 5224K, committed 5504K, reserved 1056768Kclass space used 574K, capacity 596K, committed 640K, reserved 1048576K
GC 日志的开头同样是一些 JVM 信息、运行环境信息、JVM 参数等,接下来来的两行看到了我们熟悉的 Minor GC 的日志,再往下就看到了 CMS 相关的字样,我们在 JVM 参数中指定了老年代使用 CMS 垃圾收集器,结果符合预期。
CMS 垃圾收集器的工作流程
前面系列文章中对各种垃圾收集器进行了分析,我们这里再回忆一下 CMS 垃圾收集器的工作流程,具体如下:
- 初始标记:暂停所有用户线程(STW),并记录所有直接与根(GC ROOTS)对象相连接的对象,这个阶段速度很快。
- 并发标记:同时开始用户线程和垃圾回收线程,用一个闭包去记录可达对象,但这个闭包不能保证所有的可达对象,因此工作线程还在工作中,会不断地更新对象的引用,垃圾回收线程无法保证保证可达性分析的实时性,因此算法会记录发生引用更新的对象(这个在前面分享垃圾回收算法的时候提到过)。
- 重新标记:重新标记这个阶段是 STW 的,重新标记就是为了处理在并发标记阶段发生引用变更的对象,因为发生变更的引用变更的对象毕竟是少数,因此 STW 的时间不会太长,远比并发标记阶段的时间短,可能会略长于初始标记阶段。
- 并发清除:用户线程开始工作,垃圾回收线程会开始进行垃圾回收。
总的来说 CMS 垃圾收集器分为四个阶段,分别是初始标记、并发标记、最终标记、并发清除这四个阶段,我们围绕这四个阶段来分析 CMS 的 GC 日志。
分析 CMS 垃圾回收器 GC 日志
分析 CMS 垃圾回收器的 GC 日志我们根据 CMS 垃圾回收器的工作流程来分析。
CMS Initial Mark(初始标记)
2024-11-19T20:06:06.109+0800: 0.184: [GC (CMS Initial Mark) [1 CMS-initial-mark: 1223K(2048K)] 1905K(3904K), 0.0001422 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
- 2024-11-19T20:06:06.109+0800:GC 日志日志的时间。
- 0.184:距离程序运行多久发生了本次 GC。
- CMS Initial Mark:CMS 初始标记,这个阶段会 STW(Stop The World),会找出所有老年代的 GC ROOTS 和被年轻代或者的对象引用的对象。
- 1223K:当前老年代已使用的内存。
- (2048K):老年代的总内存。
- 1905K:整个堆已经使用的内存。
- (3904K):整个堆的总内存。
- 0.0001422 secs:初始标记耗时,大概 0.1 毫秒,初始标记是很快的。
CMS-concurrent-mark(并发标记)
2024-11-19T20:06:06.110+0800: 0.184: [CMS-concurrent-mark-start]
2024-11-19T20:06:06.110+0800: 0.185: [CMS-concurrent-mark: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
- CMS-concurrent-mark-start:并发标记开始。
- CMS-concurrent-mark:并发标记阶段,会扫描整个老年代对象,并标记出活着的对象。
- 0.001/0.001 secs:并发标记消耗的时间,大概 1毫秒。
CMS-concurrent-preclean(并发预清理)
2024-11-19T20:06:06.110+0800: 0.185: [CMS-concurrent-preclean-start]
2024-11-19T20:06:06.110+0800: 0.185: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
- CMS-concurrent-preclean-start:并发预清理开始。
- CMS-concurrent-preclean:并发预清理,主要是做清理之前的一些准备工作。
- 0.000/0.000 secs:并发预清理消耗的时间。
CMS Final Remark(重新标记)
2024-11-19T20:06:06.110+0800: 0.185: [GC (CMS Final Remark) [YG occupancy: 682 K (1856 K)]2024-11-19T20:06:06.110+0800: 0.185: [Rescan (parallel) , 0.0002234 secs]2024-11-19T20:06:06.111+0800: 0.185: [weak refs processing, 0.0000306 secs]2024-11-19T20:06:06.111+0800: 0.185: [class unloading, 0.0002078 secs]2024-11-19T20:06:06.111+0800: 0.185: [scrub symbol table, 0.0003043 secs]2024-11-19T20:06:06.111+0800: 0.186: [scrub string table, 0.0000963 secs][1 CMS-remark: 1223K(2048K)] 1905K(3904K), 0.0009979 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
- CMS Final Remark:重新标记,这个阶段会是第二个 STW(Stop The World),前面初始标记的时候出现了一次 STW,因为前面是并发进行标记的,在整个过程中对象的引用发生了变化,因此需要再次进行 STW 进行标记,该阶段的 STW 时长会略大于初始标记阶段。
- [YG occupancy: 682 K (1856 K)]:年轻代内存情况,682 K 表示年轻代已经使用的内存,1856 K 表示年轻代总内存。
- [Rescan (parallel):重新扫描,也就是 STW 阶段。
- 0.0002234 secs:重新扫描,也就是 STW 阶段消耗的时间,这里大约是 0.2毫秒(初始标记的时间大概是 0.1 毫秒)。
- weak refs processing:弱引用处理,我们知道如果一个对象只有弱引用,即使系统内存充足,垃圾回收器也会立即回收它。
- 0.0000306 secs:处理弱引用消耗的湿巾,大概四0.03毫秒。
- class unloading:卸载未使用的类。
- 0.0002078 secs:类卸载消耗的时间,大概是 0.2毫秒。
- scrub symbol table:清理类元数据和内部字符串的符号表和字符串表等。
- 0.0000963 secs:清理类元数据和内部字符串的符号表和字符串表消耗的时间,这里大概是 0.09毫秒。
- CMS-remark: 1223K(2048K)] 1905K(3904K):重新标记之后老年代已经使用的内存大小为 1223K,老年代总内存大小为 2048K,JVM 堆内存已使用大小为 1905K,JVM 堆总内存大小为 3904K。
- 0.0009979 secs:重新标记持续的总时间,大概是 0.9毫秒。
CMS-concurrent-sweep(并发清理)
2024-11-19T20:06:06.111+0800: 0.186: [CMS-concurrent-sweep-start]
2024-11-19T20:06:06.112+0800: 0.186: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
- CMS-concurrent-sweep-start:并发清理开始,应用线程同时也在工作。
- CMS-concurrent-sweep:并发清理垃圾对象,并回收空间。
- 0.000/0.000 secs:并发清理消耗的时间。
CMS-concurrent-reset(并发重置)
2024-11-19T20:06:06.112+0800: 0.186: [CMS-concurrent-reset-start]
2024-11-19T20:06:06.112+0800: 0.186: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
- [CMS-concurrent-reset-start]:CMS 垃圾收集器并发重置开始,因为是并发,应用程序工作线程在同步运行。
- CMS-concurrent-reset:CMS 垃圾收集器进行并发重置,重新设置 CMS 垃圾回收算法的中的数据结构,为下一次垃圾回收做准备。
- 0.000/0.000 secs:并发重置消耗的时间。
以上就是一个完整的 CMS 垃圾回收的过程,CMS 的垃圾回收日志把我们熟知的 4个阶段拆分为了 6个阶段,这里提一下 CMS 垃圾回收器使用的是标记-清除算法,因为 CMS 垃圾收集器准求的低停顿,所以标记-清除算法更符合需求。
类的卸载条件
刚刚在分析 CMS GC 日志中有一个阶段涉及到了类的卸载,最后这里附上类的卸载条件如下:
- 该类的所有对象都已经被 GC,JVM 中不存在任何该类的 Class 实例。
- 加载该类的类加载器 ClassLoad 已经被 GC。
- 该类的 Class 对象没有被任何地方引用,也不能通过反射来访问该类的任何方法。
类的卸载需要满足以上三个条件。
总结:本篇分析了 CMS 垃圾回收的过程,一行一行的分析 GC 日志,希望可以帮助到不会看 GC 日志朋友。
如有不正确的地方欢迎各位指出纠正。
相关文章:

JVM 性能调优 -- CMS 垃圾回收器 GC 日志分析【Full GC】
前言: 上一篇我们分析了 Minor GC 的发生过程,因为 GC 日志没有按我们预估的思路进行打印,其中打印了 CMS 垃圾回收器的部分日志,本篇我们就来分析一下 CMS 垃圾收集日志。 JVM 系列文章传送门 初识 JVM(Java 虚拟机…...

PS的学习
背景差色较大,就魔棒 魔棒的连续就是倒水点的跨越问题 魔棒的容差的选择就有点看经验了,看颜色的统一程度选择 Ctrl D 取消当前所有的选区 至于快速选择工具,和对象选择工具也差不多,只不过控制范围变成了一块一块的&#x…...

数据集搜集器(百科)008
对数据集搜集器(百科)007进行一下改进: 错误处理:增加更多的错误处理,比如网络请求超时、解析错误等。 用户界面:增加一些提示信息,让用户更清楚当前的操作状态。 多线程处理:确保多…...

Java学习,反射
Java反射是Java编程语言的一个重要特性,它允许程序在运行时查看任意对象所属的类,获取类的内部信息(包括构造器、字段和方法等),并能动态地调用对象的方法或构造器。 反射概念 反射(Reflection)…...

数据结构 (18)数的定义与基本术语
前言 数据结构是计算机科学中的一个核心概念,它描述了数据元素之间的关系以及这些元素在计算机中的存储方式。 一、数的定义 在计算机科学中,“数”通常指的是树形数据结构,它是一种非线性的数据结构,由节点(或称为元素…...

Flink的双流join理解
如何保证Flink双流Join准确性和及时性、除了窗口join还存在哪些实现方式、究竟如何回答才能完全打动面试官呢。。你将在文中找到答案。 1 引子 1.1 数据库SQL中的JOIN 我们先来看看数据库SQL中的JOIN操作。如下所示的订单查询SQL,通过将订单表的id和订单详情表ord…...

《使用Python进行数据挖掘:理论、应用与案例研究》
嘿,今天我要给你们介绍一本使用Python进行数据挖掘的好书。这本书是由吴迪博士撰写的,他是雷曼学院商学院的助理教授,也是数据科学的实战派。 在这个时代,数据多得让人眼花缭乱,要从中找出有用的信息,那可不…...

Go语言技巧:快速统一字符串中的换行符,解决跨平台问题
统一字符串中的 Windows \r\n 换行符 — Go语言实现 在编程中,尤其是处理跨平台的文本数据时,换行符的处理是一个常见的问题。Windows 系统使用 \r\n 作为换行符,而 Unix-like 系统(如 Linux 和 macOS)使用 \n。在 Go…...

算法训练营day20(二叉树06:最大二叉树,合并二叉树,搜索二叉树,验证搜索二叉树)
第六章 二叉树 part06 今日内容 ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树 详细布置 654.最大二叉树 又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视…...

Leetcode(区间合并习题思路总结,持续更新。。。)
讲解题目:合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间, 并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:输入&a…...

『python爬虫』使用docling 将pdf或html网页转为MD (保姆级图文)
目录 预览效果安装下载模型测试代码总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 预览效果 支持转化pdf的表格 安装 Docling 本身是专注于文档转换的工具,通常用于将文件(如 PDF&…...

elasticsearch现有集群扩展节点
原文地址:elasticsearch现有集群扩展节点 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 给现有的 elasticsearch 集群扩展节点比较容易,已有的集群不需要做任何修改,也不用对服务做任何处理,只需…...

力扣162:寻找峰值
峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时间复杂度为 O(…...

Kafka-Connect
一、概述 Kafka Connect是一个在Apache Kafka和其他系统之间可扩展且可靠地流式传输数据的工具。细心的你会发现,我们编写的producer、consumer都有很多重复的代码,KafkaConnect就是将这些通用的api进行了封装。让我们可以只关心业务部分(数…...

递归、搜索与回溯算法 - 3 ( floodfill 记忆化搜素 9000 字详解 )
一:floodfill 算法 1.1 图像渲染 题目链接:图像渲染 class Solution {// 首先先定义四个方向的向量int[] dx {0, 0, 1, -1};int[] dy {1, -1, 0, 0};// 接着用 m 记录行数,n 记录列数,prev 记录 (sr, sc) 位置的…...

YOLOv9改进,YOLOv9引入CAS-ViT(卷积加自注意力视觉变压器)中AdditiveBlock模块,二次创新RepNCSPELAN4结构
摘要 CAS-ViT 是一种为高效移动应用设计的视觉Transformer。模型通过结合卷积操作与加性自注意机制,在保持高性能的同时显著减少计算开销,适合资源受限的设备如手机。其核心组件 AdditiveBlock 通过多维度信息交互和简化的加性相似函数,实现了高效的上下文信息整合,避免了…...

HDLCPPP原理与配置
前言: 广域网中经常会使用串行链路来提供远距离的数据传输,高级数据链路控制HDLC( High-Level Data Link Control )和点对点协议PPP( Point to Point Protocol)是两种典型的串口封装协议。 HDLC协议: 原理…...

react + vite 中的环境变量怎么获取
一、Vite 环境变量基础 创建一个.env文件,Vite 定义的环境变量需要以VITE_开头。 VITE_API_URL "http://localhost:3000/api" 生产模式创建.env.production。 VITE_API_URL "https://production-api-url.com/api" 二、在 React 组件中获…...

知识蒸馏中有哪些经验| 目标检测 |mobile-yolov5-pruning-distillation项目中剪枝知识分析
项目地址:https://github.com/Syencil/mobile-yolov5-pruning-distillation 项目时间:2022年 mobile-yolov5-pruning-distillation是一个以yolov5改进为主的开源项目,主要包含3中改进方向:更改backbone、模型剪枝、知识蒸馏。这里…...

Oracle 19c RAC单节点停机维护硬件
背景 RAC 环境下一台主机硬件光纤卡不定时重启,造成链路会间断几秒,期间数据库会话响应时间随之变长,该光纤卡在硬件厂商的建议下,决定停机更换备件,为保证生产影响最小,决定停掉该节点,另外节…...

Linux系统 进程
Linux系统 进程 进程私有地址空间用户模式和内核模式上下文切换 进程控制系统调用错误处理进程控制函数获取进程 ID创建和终止进程回收子进程让进程休眠加载并运行程序 进程 异常是允许操作系统内核提供进程(process)概念的基本构造块,进程是…...

机载视频流回传+编解码方案
无线网络,低带宽场景。不能直接转发ROS raw image(10MB/s),而要压缩(编码)后再传输。可以用rtsp的udp传输或者直接传输话题,压缩方法有theora(ROS image_transport默认支持ÿ…...

Ubuntu 20.04 Server版连接Wifi
前言 有时候没有网线口插网线或者摆放电脑位置不够时,需要用Wifi联网。以下记录Wifi联网过程。 环境:Ubuntu 20.04 Server版,无UI界面 以下操作均为root用户,如果是普通用户,请切换到root用户,或者在需要权…...

【VRChat 改模】开发环境搭建:VCC、VRChat SDK、Unity 等环境配置
一、配置 Unity 相关 1.下载 UnityHub 下载地址:https://unity.com/download 安装打开后如图所示: 2.下载 VRChat 官方推荐版本的 Unity 跳转界面(VRChat 官方推荐页面):https://creators.vrchat.com/sdk/upgrade/…...

人工智能的微积分基础
目录 编辑 引言 微积分的基本概念 1. 导数 2. 积分 3. 微分方程 微积分在人工智能中的应用 1. 机器学习中的优化 2. 反向传播算法 3. 概率与统计 4. 控制理论 5. 自然语言处理中的梯度 6. 计算机视觉中的积分 7. 优化算法中的微积分 8. 微分几何在深度学习中的…...

Android 基础类(01)- Thread类 - readyToRun和threadLoop
一、前言: 在阅读AOSP代码过程中,我们经常会看到Thread子类重写两个方法:readyToRun和threadLoop,不清楚的同学,可能在这儿连调用逻辑都搞不清楚了,因为找不到谁调用了它。我这儿先不去深究Thread内部逻辑…...

C++设计模式之构造器
动机 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。 如何…...

红日靶场-5
环境搭建 这个靶场相对于前几个靶场来说较为简单,只有两台靶机,其中一台主机是win7,作为我们的DMZ区域的入口机,另外一台是windows2008,作为我们的域控主机,所以我们只需要给我们的win7配置两张网卡&#…...

做异端中的异端 -- Emacs裸奔之路3: 上古神键Hyper
谈一下快捷捷冲突的问题。 Emacs几乎穷尽所有组合键 我用下面命令,在Fundamental模式下,枚举所有绑定。 (defun keymap-lookup-test-fn(); printable keys(setq printable-chars (number-sequence 33 126))(setq i 0)(while (< i (length printable…...

Java多线程介绍及使用指南
“多线程”:并发 要介绍线程,首先要区分开程序、进程和线程这三者的区别。 程序:具有一定功能的代码的集合,但是是静态的,没有启动运行 进程:启动运行的程序【资源的分配单位】 线程:进程中的…...