JVM 性能调优 -- CMS 垃圾回收器 GC 日志分析【Full GC】
前言:
上一篇我们分析了 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 虚拟机…...
重塑视频新语言,让每一帧都焕发新生——Video-Retalking,开启数字人沉浸式交流新纪元!
模型简介 Video-Retalking 模型是一种基于深度学习的视频再谈话技术,它通过分析视频中的音频和图像信息,实现视频角色口型、表情乃至肢体动作的精准控制与合成。这一技术的实现依赖于强大的技术架构和核心算法,特别是生成对抗网络࿰…...
C#中面试的常见问题001
1、c#访问修饰符有哪些 public:公共访问级别,成员可以被任何其他代码访问。private:私有访问级别,成员只能在定义它的类内部访问。protected:受保护的访问级别,成员可以被定义它的类及其子类访问。interna…...
webGis 气象站点数据解析渲染
1.站点数据说明 1.1 数据来源 站点数据来源多样。 1.2数据传输 实现前端的展示,数据传输的方式有: json等等 1.2数据格式 let arr [{ lat:1,//经纬度 lng:1, value:2//值 },{},...] 1.3站点数据转格点数据 turf.interpolate克里金插值qgis等ID…...
Vue3+Typescript+Axios+.NetCore实现导出Excel文件功能
前端代码 //导出Excel const exportMaintenanceOrderSettlementItemExcelClick async () > {let url ${VITE_APP_API_URL}/api/app/maintenance/settlement-service-item/${currentMaintenanceOrderId.value}/${currentMaintenanceOrderSettlementRow.value.id};let file…...
专属主机服务器和ECS服务器有什么区别?
专属主机服务器和ECS服务器的主要区别在于资源隔离、计费方式、管理权限等方面。 资源隔离 专属主机服务器:用户可以独享整台物理服务器资源,与其他租户的服务器物理隔离。这意味着用户不需要与其他租户共享物理资源,可以获取服务器…...
MySQL索引与分区:性能优化的关键
在开发过程中,随着数据量的不断增长,MySQL 查询的性能问题会逐渐显现。特别是在大数据量下,查询变得越来越慢,甚至可能导致系统崩溃。为了优化查询,MySQL 提供了 分区(Partitioning) 和 索引&am…...
VUE项目部署服务器之后刷新页面异常
情况: vue项目在本地完美运行,经过npm run build之后把dist目录上传到服务后。只有访问文件跟目录可以运行,但刷新之后会找不到相应的页面。 网上都说是hository路由的问题导致,需要修改成hash模式。如果不想修改为hash模式&…...
【实验13】使用预训练ResNet18进行CIFAR10分类
目录 1 数据处理 1.1 数据集介绍 1.2数据处理与划分 2 模型构建- Pytorch高层API中的Resnet18 3 模型训练 4 模型评价 5 比较“使用预训练模型”和“不使用预训练模型”的效果: 6 模型预测 7 完整代码 8 参考链接 1 数据处理 1.1 数据集介绍 数据规模&…...
如何将 GitHub 私有仓库(private)转换为公共仓库(public)
文章目录 如何将 GitHub 私有仓库转换为公共仓库步骤 1: 登录 GitHub步骤 2: 导航到目标仓库步骤 3: 访问仓库设置步骤 4: 更改仓库可见性步骤 5: 确认更改步骤 6: 验证更改注意事项 如何将 GitHub 私有仓库转换为公共仓库 在软件开发领域,GitHub 是一个广受欢迎的…...
进制的问题
蓝桥2015某题 计算数字x在进制p 下的各位数字之和 int calc(int x,int p) {int res0;while(x){resx%p;//取当前位累加x/p;//去掉最低位}return res; }...
【配置】如何下载和配置Android studio?
下载Android Studio 1、下载链接 https://developer.android.google.cn/studio?hlzh-cn 注意:下载的时候要关闭代理服务器 2、安装软件 根据提示进行安装 3、配置proxy 这里建议配置代理而不是配置国内镜像源 所以…...
CA系统(file.h---申请认证的处理)
#pragma once #ifndef FILEMANAGER_H #define FILEMANAGER_H #include <string> namespace F_ile {// 读取文件,返回文件内容bool readFilename(const std::string& filePath);bool readFilePubilcpath(const std::string& filePath);bool getNameFro…...
Redis开发04:Redis的INFO信息解析
命令解释redis_versionRedis 的版本号,这里是 3.2.100。redis_git_sha1Redis 使用的 Git SHA1 校验值,表示当前代码的版本。redis_git_dirty如果 Redis 当前运行的代码是脏版本(未提交的修改),该值为 1,否则…...
《Learn Three.js》学习(2)构建Three.js基本组件
前言: 本章将了解内容包括Three中的主要组件;THERE.SCENE对象的作用;几何图形和格网如何关联;区别正射/透视投影摄像机 基础理论知识: Three.scene(场景图)保存所有对象、光源和渲染所需的其他…...
VLLM 格式化LLM输出
文章目录 前言guided_jsonguided_choiceguided_regexguided_grammar总结 前言 vllm OpenAI Compatible Server 提供了格式化LLM输出的能力,默认的格式化解码后端应该是outlines 目前提供了四个参数来控制格式化输出,分别是: guided_json: …...
Java篇——Java通过JNA调用c++库时传参含有结构体时数据错乱的解决办法
Java通过JNA调用c库时传参含有结构体时,只继承Structure是不够的,还需要实现Structure.ByValue,或者强制指定结构体字节对齐。示例如下: 1、c库中的结构体定义: 2、java中结构体定义: 3、java中调用 如果没…...
sql分类
SQL(Structured Query Language)是一种用于管理和操作关系数据库管理系统(RDBMS)的编程语言。SQL 可以分为几个主要类别,每个类别都有其特定的用途和功能。以下是 SQL 的主要分类: 1. 数据定义语言&#x…...
LayaBox1.8.4实现战争迷雾效果
实现思路: 和Unity实现思路一样,可看我写的下面的一篇文章 战争迷雾FogOfWar---Unity中实现-CSDN博客 根据碰撞点可以计算出需要透明的位置,怎样计算如下: 根据迷雾mesh的长宽和纵向横向的的像素数可以得出,每个小方…...
Python打包元数据困境:约束的重要性
在Python社区中,一项旨在建立新的通用锁文件标准的努力正在展开,这一努力主要在Python讨论论坛上进行。此倡议凸显了创建一个让所有人都满意的标准化方案的难度。不同Python打包工具对锁文件应有的形态和用途有着略微不同的理解。然而,在这些…...
第29天 MCU入门
目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明: 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…...
三分钟快速掌握——Linux【vim】的使用及操作方法
一、vim的使用 vim是一个文本编辑器 非常小巧轻便 1.1如何进入vim编辑器 方法一: 首先使用touch 1.c 创建一个源文件 然后使用vim 1.c进入 方法二: 直接使用指令 vim 2.c 会直接创建一个2.c的源文件 退出时记得保存(使用wq或者x&am…...
安达发|制造业APS智能优化排产软件的四类制造模型解决方案
在制造业中,APS(高级计划和排程系统)智能优化排产软件的应用越来越广泛。它通过集成先进的算法和模型,帮助企业提高生产效率、降低成本并提升客户满意度。针对不同类型的生产需求,APS软件提供了四类制造模型解决方案&a…...
屏幕分辨率|尺寸|颜色深度指纹修改
一、前端通过window.screen接口获取屏幕分辨率 尺寸 颜色深度,横屏竖屏信息。 二、window.screen c接口实现: 1、third_party\blink\renderer\core\frame\screen.idl // https://drafts.csswg.org/cssom-view/#the-screen-interface[ExposedWindow ] …...
Mac安装及合规无限使用Beyond Compare
文章目录 Beyond CompareBeyond Compare简介Beyond Compare安装Beyond Compare到期后继续免费使用 Beyond Compare Beyond Compare简介 Beyond Compare 是一款由 Scooter Software 开发的文件和文件夹比较工具。它主要用于对比两个文件或文件夹之间的差异,并支持文…...
记录一次 k8s 节点内存不足的排查过程
背景:前端服务一直报404,查看k8s日志,没发现报错,但是发现pods多次重启。 排查过程: 查看pods日志,发现日志进不去。 kubectrl logs -f -n weave pod-name --tail 100查看pod describe kubectl describ…...
方差分析、相关分析、回归分析
第一章:方差分析 1.1 方差分析概述 作用: 找出关键影响因素,并进行对比分析,选择最佳组合方案。影响因素: 控制因素(人为可控)和随机因素(人为难控)。控制变量的不同水平: 控制变量的不同取值…...
【JavaEE初阶 — 网络原理】初识网络原理
目录 1. 网络发展史 1.1 独立模式 1.2 网络互连 1.2.1 网络互联的背景 1.2.2 网络互联的定义 1.3 局域网LAN 1.4 广域网WAN 2. 网络通信基础 2.1 IP地址 2.2 端口号 2.3 认识协议 2.4 五元组 2.5 协议分层 2.5.1 分…...
算法的NPU终端移植:深入探讨与实践指南
目录 编辑 引言 算法选择 模型压缩 权重剪枝 量化 知识蒸馏 硬件适配 指令集适配 内存管理 并行计算 性能测试 速度测试 精度测试 功耗测试 案例分析 图像识别算法的NPU移植案例 结论 引言 在人工智能技术的浪潮中,神经网络处理器(…...
Lombok :简化 Java 编程的得力工具
在 Java 开发过程中,常常需要编写大量的样板代码,例如构造函数、Getter 和 Setter 方法、equals 和 hashCode 方法等。这些代码虽然逻辑相对固定,但编写起来却较为繁琐且容易出错,并且会使代码显得冗长。Lombok 应运而生ÿ…...
C语言实例_14之求俩数的最大公约数和最小公倍数
1.最大公约数和最小公倍数概述 最大公约数(Greatest Common Divisor,简称GCD): 也称为最大公因数,是指两个或多个整数共有约数中最大的一个。例如,对于整数12和18,它们的约数分别为࿱…...
wxWidgets-ImageView
wxWidgets实现图片浏览、放大缩小、另存为新的图片格式等 #include "wx/wxprec.h"#ifndef WX_PRECOMP#include "wx/wx.h" #endif#include "wx/filename.h" #include "wx/zstream.h"#include "imageviewctrl.h"class MyFrame…...
什么是Axios,有什么特点
什么是 Axios? Axios 是一个基于 Promise 的 HTTP 客户端,可以用于浏览器和 Node.js 环境。它由 Matt Zabriskie 创建,旨在提供一个简单、灵活且功能强大的 HTTP 请求库。Axios 支持所有现代浏览器和 Node.js,可以用于发送 GET、…...
springboot331“有光”摄影分享网站系统pf(论文+源码)_kaic
毕 业 设 计(论 文) “有光”摄影分享网站设计与实现 摘 要 自互联网的发展至今,其基础理论与技术都已完善,并积极参与了整个社会各个领域。它容许信息根据媒体传播,并和信息可视化工具一起为大家提供优质的服务。对于…...
3D姿势和跟踪的人体行为识别
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月28日21点20分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…...
手机设置了卡2上网,卡1禁止上网,但是卡1还是会偷偷跑流量,这是什么情况???
双卡双待手机,卡2设置为默认上网卡,卡1却会偷偷跑流量,这就很迷。 双卡双待手机,不管是哪个牌子(网上有小米,华为,vivo出现这种情况,我的是华为mate20),都存在…...
基于单片机的温度控制系统设计
摘 要 当今社会不断发展,工业以及生活领域对温度控制系统的要求日益增加。以往的设计系统已经不能满足如今的社会需求,因此设计更加符合要求的温度控制系统是大势所趋。采用单片机进行温度控制系统的设计可以使温度的调节更简单、灵活,节约操…...
pjfun.top相册中上传图片获取github apiToken
1、登录github [登录](https://github.com/login) 没有账号就注册2、 点击头像,进入设置settings 3、进入Developer settings 4、点击Fine-grained tokens 再点击 Generate new token 5、填写相关基础信息 Token name(随意起名) Expiratio…...
S4 UPA of AA :新资产会计概览
通用并行会计(Universal Parallel Accounting)可以支持每个独立的分类账与其他模块集成,UPA主要是为了支持平行评估、多货币类型、财务合并、多准则财务报告的复杂业务需求 在ML层面UPA允许根据不同的分类账规则对物料进行评估,并…...
单片机学习笔记 11. 外部中断
更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...
C++中智能指针的使用及其原理 -- RAII,内存泄漏,shared_ptr,unique_ptr,weak_ptr
目录 1.智能指针的使用场景分析 2.RAII和智能指针的设计思路 3.C标准库智能指针的使用 4.智能指针的原理以及模拟实现 5.shared_ptr循环引用问题和weak_ptr 5.1shared_ptr循环引用问题 5.2weak_ptr的原理和部分接口 5.3weak_ptr的简单模拟实现 6. shared_ptr的线程安…...
DICOM医学影像应用篇——伪彩色映射 在DICOM医学影像中的应用详解
目录 引言 伪彩色映射的概念 基本原理 查找表(Look-Up Table, LUT) 步骤 示例映射方案 实现伪彩色映射的C代码 代码详解 伪彩色处理效果展示 总结 扩展知识 LUT 的基本概念 LUT 在伪彩色映射中的应用 示例 引言 在医学影像处理中,…...
注意http-proxy-middleware要解决跨域问题,想修改origin请求头不要设置changeOrigin=true
在使用http-proxy-middleware的时候,有一个配置是“changeOrigin”,通过名字来看这个字段是用来控制是否修改origin的,但是实际使用下来,你会发现,当设置为true的时候,header中的origin的值并不会修改&…...
SpringBoot宠物领养平台:设计与实现
摘 要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领养…...
qt 的udp发送和接收
udp要在.pro中加入 QT network udp接收 //QUdpSocket *udp1; udp1 new QUdpSocket(this); udp1->bind(2024,QUdpSocket::ShareAddress); connect(udp1,SIGNAL(readyRead()),this,SLOT(ReadyOut())); void MainWindow::ReadyOut() { while(udp1->hasPend…...
极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【五】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
中科亿海微SoM模组——波控处理软硬一体解决方案
本文介绍的波控处理软硬一体解决方案主要是面向相控阵天线控制领域,波控处理通过控制不同天线组件的幅相来调整天线波束的方向和增益,实现高精度角度控制和高增益。本方案由波控处理板、波控处理控制软件算法和上位机软件共同构成。波控处理SoM模组原型样…...
vue页面跟数据不同步this.$set
“Vue页面跟数据同步this.$set”可能是指在某些情况下,需要确保数据的响应式特性,即当数据发生变化时,页面上的显示也能实时更新。 如果你遇到数据已经设置,但页面没有更新,可能是因为你没有正确使用 Vue 的响应式系统…...
黑马2024AI+JavaWeb开发入门Day02-JS-VUE飞书作业
视频地址:哔哩哔哩 讲义作业飞书地址:飞书 一、作业1 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&l…...
(0基础保姆教程)-JavaEE开课啦!--12课程(Spring MVC注解 + Vue2.0 + Mybatis)-实验10
一、常见的SpringMVC注解有哪些? 1.Controller:用于声明一个类为 Spring MVC 控制器。 2.RequestMapping:用于将 HTTP 请求映射到特定的处理方法上。可以指定请求类型(GET、POST等)和URL路径。 3.GetMappingÿ…...