简直不可思议,竟然还有人不会查看GC垃圾回收日志?

203 篇文章 8 订阅
105 篇文章 0 订阅

日志的重要性,不需要过多强调了。通过日志,我们可以发现程序可能有内存(泄露)问题。本文从案例出发,具体介绍这些日志信息,以期帮助大家更好地了解垃圾回收的运行情况。

还是先上图,看看本文的主要内容:

简直不可思议,竟然还有人不会查看GC垃圾回收日志?

 

我们先来看个案例,代码如下:

/** * 打印垃圾回收日志案例 * 参数设置: -XX:+PrintGCDetails * @author 田维常 * @version 1.0 * @date 2020/11/9 8:22 */public class PrintGCDetailsDemo {    public static void main(String[] args) {        System.out.println("Hello world");    }}

启动参数设置:

XX:+PrintGCDetails

运行main方法,输出

Hello world
Heap
 PSYoungGen      total 38400K, used 4670K [0x00000000d5f00000, 0x00000000d8980000, 0x0000000100000000)
  eden space 33280K, 14% used [0x00000000d5f00000,0x00000000d638fb98,0x00000000d7f80000)
  from space 5120K, 0% used [0x00000000d8480000,0x00000000d8480000,0x00000000d8980000)
  to   space 5120K, 0% used [0x00000000d7f80000,0x00000000d7f80000,0x00000000d8480000)
 ParOldGen       total 87552K, used 0K [0x0000000081c00000, 0x0000000087180000, 0x00000000d5f00000)
  object space 87552K, 0% used [0x0000000081c00000,0x0000000081c00000,0x0000000087180000)
 Metaspace       used 3525K, capacity 4498K, committed 4864K, reserved 1056768K
  class space    used 388K, capacity 390K, committed 512K, reserved 1048576K

关于GC日志的参数

-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径

参数案例

-XX:+PrintGCDetails -XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=8 -XX:NewSize=10M -XX:MaxNewSize=10M

参数解释:

-XX:+PrintGCDetails 启用日志

-XX:-UseAdaptiveSizePolicy 禁用动态调整,使SurvivorRatio可以起作用

-XX:SurvivorRatio=8设置Eden:Survivior=8:1

-XX:NewSize=10M -XX:MaxNewSize=10M设置整个新生代的大小为10M

写了一个Spring Boot项目,非常简单的项目,里面写了一个controller

package com.tian.my_code.controller; import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList;import java.util.List; /** * @author 田维常 * @version 1.0 * @date 2020/11/8 15:46 */@RestControllerpublic class GCController {     List<Object> strings = new ArrayList<>();     @GetMapping("/gc")    public String addObject() {        System.out.println("-------gc-------");        for (int i = 0; i < 1000000; i++){            try {                Thread.sleep(20);            } catch (InterruptedException e) {                e.printStackTrace();            }            int [] a=new int[500000];            strings.add(a);        }        return "ok";    }}

这段代码其实是想后面演示OOM用的,都行吧,这里先用他来看看GC垃圾回收日志。

在IDEA中设置

简直不可思议,竟然还有人不会查看GC垃圾回收日志?

 

输出结果

简直不可思议,竟然还有人不会查看GC垃圾回收日志?

 

抓出一段来聊聊

GC (minor )日志

[GC (Allocation Failure) [PSYoungGen: 8525K->352K(9216K)] 98695K->98486K(130048K), 0.0092873 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

(Allocation Failure):表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。

PSYoungGen:表示是GC类型

8525K:YoungGC前新生代内存占用

352K:YoungGC新生代内存占用

9216K:新生代总共大小

98695K:YoungGC前JVM内存占用

98486K:YoungGC后JVM内存使用

130048K:JVM堆总大小

0.0092873 secs:YoungGC耗时

user=0.00:YoungGC用户耗时

sys=0.00:YoungGC系统耗时

real=0.01:YoungGC实际耗时(这里居然四舍五入了)

Full GC 日志

[Full GC (Ergonomics) [PSYoungGen: 8051K->7817K(9216K)] [ParOldGen: 244969K->244969K(245760K)] 253020K->252786K(254976K), [Metaspace: 29386K->29386K(1077248K)], 0.0525381 secs] [Times: user=0.13 sys=0.00, real=0.05 secs] 

PSYoungGen: 8051K->7817K(9216K):新生代区GC前后和总大小

ParOldGen: 244969K->244969K(245760K):老年代GC前后和大小。

253020K->252786K(254976K):GC前后内存占用情况。

Metaspace: 29386K->29386K(1077248K):元空间GC前后和总大小

后面那几项和上面一样

GC垃圾回收日志就是这么简单么~蓝(nan)不蓝(nan)?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值