如何从gc.out日志获取JVM堆使用率?请求解释日志各字段含义
我来帮你把这些GC日志的字段拆解得明明白白,搞清楚每个部分和堆使用率的关系~
先把你提供的日志整理成更易读的格式:
178.658: [GC (Metadata GC Threshold) 127089K->17827K(502784K), 0.0398140 secs] 178.698: [Full GC (Metadata GC Threshold) 17827K->17031K(502784K), 0.0482840 secs] 180.498: [GC (Allocation Failure) 148615K->20762K(502784K), 0.0082820 secs]
GC日志字段逐段解析
1. 时间戳:178.658:
这是JVM启动后的累计时间(单位:秒),意思是这条GC日志发生在JVM启动后的178.658秒,方便你定位GC发生的时间节点。
2. GC类型与触发原因:[GC (Metadata GC Threshold)]
GC:代表这是一次年轻代垃圾回收(Minor GC),只回收年轻代区域的垃圾;如果是Full GC,就是整堆回收,会涉及年轻代、老年代以及元空间(或永久代),停顿时间通常更长。(Metadata GC Threshold):这是触发本次GC的具体原因。比如这里是因为元空间(存放类元数据的区域)不足,达到了系统设定的GC阈值,所以触发了回收;后面的(Allocation Failure)则是因为年轻代内存分配失败(比如新对象放不下了),触发了Minor GC。
3. 堆内存核心数据(和堆使用率直接相关):127089K->17827K(502784K)
这三个数字是你关注堆使用率的关键:
127089K:GC开始前,JVM堆已经使用的内存大小(单位:KB)17827K:GC结束后,JVM堆剩余的已使用内存大小(单位:KB)—— 两者的差值就是本次GC回收掉的内存量,比如第一条日志就回收了约109MB的内存502784K:当前JVM的堆总容量(单位:KB)—— 用结束后的已使用量除以总容量,就能算出GC后的堆使用率,比如第一条日志GC后的使用率大概是3.55%
4. GC耗时:0.0398140 secs
这是本次GC的总耗时(单位:秒),这里表示这次GC花了约0.04秒。耗时越短,对业务程序的停顿影响越小,毕竟GC期间应用线程会暂停(Stop-The-World)。
内容的提问来源于stack exchange,提问作者user1471980
相关产品推荐
相关产品推荐

