GC的查看
gc日志:📎log.txt
看法简述:
内存的状况(只是展示堆用,不对应任何日志信息)
示例片段1
[GC (Allocation Failure) [PSYoungGen: 64604K->10120K(75776K)] 64604K->61328K(249344K), 0.0114108 secs] [Times: user=0.06 sys=0.03, real=0.01 secs]
- 事件类型:
-
[GC (Allocation Failure)]
:这表示这是一个垃圾回收事件,具体原因是分配失败(即没有足够的内存来分配新对象)。
- 垃圾回收范围:
-
[PSYoungGen: 64604K->10120K(75776K)]
:这是年轻代(PSYoungGen)的垃圾回收详情。
-
-
64604K
是垃圾回收前年轻代使用的总内存。10120K
是垃圾回收后年轻代使用的总内存。(75776K)
是年轻代的总大小。
-
- 整体堆信息:
-
64604K->61328K(249344K)
:整个Java堆的信息。
-
-
64604K
垃圾回收前整个堆使用的内存。61328K
垃圾回收后整个堆使用的内存。(249344K)
Java堆的总大小。
-
- 消耗时间:
-
0.0114108 secs
:这次垃圾回收总共花费的时间是0.0114108秒。
- CPU时间:
-
[Times: user=0.06 sys=0.03, real=0.01 secs]
:提供了关于CPU使用情况的更详细信息。
-
-
user=0.06
用户模式下CPU使用的时间。sys=0.03
系统模式下CPU使用的时间。real=0.01
实际经过的时间,与前面提到的总的GC时间相同。
-
示例片段2
[GC (System.gc()) [PSYoungGen: 1300K->32K(75776K)] 2126K->857K(249344K), 0.0003581 secs]
[Full GC (System.gc()) [PSYoungGen: 32K->0K(75776K)] [ParOldGen: 825K->825K(173568K)] 857K->825K(249344K), [Metaspace: 3578K->3578K(1056768K)], 0.0059335 secs]
1. GC事件类型
- Minor GC(年轻代垃圾回收):在日志中表现为
[GC (System.gc()) [PSYoungGen: ...]
或者不带(System.gc())
的类似行。 - Full GC(全堆垃圾回收):通常会看到
[Full GC (System.gc()) [PSYoungGen: ...] [ParOldGen: ...]
这样的条目。
上面的第一条是Minor GC,它清理了年轻代的部分对象。
第二条是一个Full GC,它同时清理了年轻代和老年代的对象。
2. 内存使用情况
每个GC事件都会报告内存使用前后的情况:
PSYoungGen: 1300K->32K(75776K)
表示年轻代从使用了1300KB减少到32KB,总容量为75776KB。- 2126K->857K(249344K):堆总空间249344k,回收前使用2126k,回收后使用857k
ParOldGen: 825K->825K(173568K)
显示老年代在GC前后大小没有变化,说明老年代中没有可以回收的对象或空间已经非常紧张。(249344K)
是整个堆的大小,包括年轻代和老年代。
3. GC的频率和耗时
- 每次GC都有一个时间记录,比如
0.0003581 secs
或0.0059335 secs
,这表示该次GC操作花费的时间。 - 频繁出现的GC事件(尤其是Full GC),如果每次耗时较长,则可能是潜在的问题,因为它会影响应用性能。
示例片段3
[Full GC (Ergonomics) [PSYoungGen: 10272K->0K(140800K)] [ParOldGen: 249894K->250919K(525312K)] 260166K->250919K(666112K), [Metaspace: 3941K->3941K(1056768K)], 0.0146315 secs] [Times: user=0.08 sys=0.00, real=0.02 secs]
- 事件类型:
-
[Full GC (Ergonomics)]
:这是一次由JVM为了优化性能(根据Ergonomics算法)而触发的Full GC。这意味着JVM自动决定进行一次完整的垃圾回收来释放内存。
- 年轻代(PSYoungGen)信息:
-
[PSYoungGen: 10272K->0K(140800K)]
:
-
-
10272K
表示GC前年轻代使用的内存。0K
表示GC后年轻代使用的内存,即所有存活的对象都被移到了老年代或其他地方,当前年轻代没有占用任何内存。(140800K)
是年轻代的总大小。
-
- 老年代(ParOldGen)信息:
-
[ParOldGen: 249894K->250919K(525312K)]
:
-
-
249894K
表示GC前老年代使用的内存。250919K
表示GC后老年代使用的内存,可以看到实际上老年代使用的内存量有所增加,这可能是因为从年轻代移动过来的对象。(525312K)
是老年代的总大小。
-
- 整体堆信息:
-
260166K->250919K(666112K)
:
-
-
260166K
表示GC前整个Java堆使用的内存总量(年轻代+老年代)。250919K
表示GC后整个Java堆使用的内存总量。(666112K)
是整个Java堆的最大容量。
-
- Metaspace信息:
-
[Metaspace: 3941K->3941K(1056768K)]
:表示Metaspace(元空间,用于存储类的元数据)在GC前后使用量没有变化,分别为3941KB,最大容量为1056768KB。
- 消耗时间:
-
0.0146315 secs
:这次Full GC总共花费的时间是0.0146315秒。
- CPU时间:
-
[Times: user=0.08 sys=0.00, real=0.02 secs]
:提供了关于CPU使用情况的更详细信息。
-
-
user=0.08
用户模式下CPU使用的时间。sys=0.00
系统模式下CPU使用的时间。real=0.02
实际经过的时间,与前面提到的总的GC时间相同。
-