日志打印及简单的gc调优

最近在学习gc调优的相关知识,写一篇文章来整理一下思路,同时供以后的参考。
在idea中,有两种设置vm参数的方式,一种是通过help下的edit custom vm options下,设置相关参数。另一种是通过run下的edit configurations设置相关参数。
vm options
由于我们需要对gc进行调优,因此首先需要打印gc日志。通过在vm options中添加-XX:+PrintGCTimeStamps -XX:+PrintGCDetails。前者记录了从jvm启动开始到发生gc时的一个时间。后者表示详细的gc信息。以parallel收集器的gc日志为例。

1.186: [GC (Allocation Failure) [PSYoungGen: 24064K->3576K(27648K)] 24064K->5415K(90624K), 0.0104731 secs] [Times: user=0.02 sys=0.02, real=0.01 secs]
2.150: [GC (Allocation Failure) [PSYoungGen: 27640K->3576K(27648K)] 29479K->9961K(90624K), 0.0108785 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
2.568: [GC (Allocation Failure) [PSYoungGen: 27640K->3576K(27648K)] 34025K->15547K(90624K), 0.0116456 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
前面的时间及为时间戳所打印的内容。后面包括发生的gc类别,原因。young区的内存变化和堆内存的变化。发生此gc所花费的时间。时间同时精确到了用户态(user)和内核态(sys)。
想要打印日志,除了上面两个XX命令,还需确定一个gc日志的输出位置,-Xloggc:C:\xxxx\xxxx\gc.log,语法如前,我输出到了c盘桌面。输出日之后,就可以根据日志相关内容进行一些调整。比如young gc发生的次数过多。可以尝试改变YoungGenerationSizeIncrement的大小,减少young gc次数。但是这样很不直观,对于我这样的初学者其实很困难。这时候就需要一些将gc日志可视化的工具。我个人比较推荐gceasy.io。它是一个在线gc日志分析网站。能将你的gc日志,生成一份报告。
吞吐量及响应时间
比如我们调优时比较关心的数据,吞吐量及响应时间。从上图能看到,我的程序的吞吐量是92(吞吐量=gc时间/(总运行时间)),平均响应时间是39毫秒。相对来讲,如果你的程序比较注重一个运行的速度和效率,那么吞吐量比较重要。如果你的程序更重视和用户的交互,那么响应时间比较重要。当然,我们更希望两个参数都比较优秀,但是一般情况下,这两者是存在一定矛盾的。一般而言,并行parallel收集器系列在吞吐量上比较占优势,而并发收集器(用户程序和垃圾收集同时进行)g1,cms等在响应时间比较占优势。但从我个人的这个程序比较来看,g1的整体性能似乎更占优势,好于parallel组合。
不同种类gc的时间统计
同时,也可以生成各类gc的一个统计。比如我情况是分配失败造成的gc9次,由metaspace(jdk8以下permgen及永久代)的限制引起的有两次,其中有一次是fullgc。由此gceasy给我的建议(文档开头)是提高对metaspace的空间分配。-XX:MetaspaceSize 提高metaspace大小。更改后成功消去了两次metespace gc吞吐量提高到大约百分之96左右。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值