日志打印及简单的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左右。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GC(Garbage Collection)调优是针对Java应用程序中的垃圾回收机制进行优化的过程。GC调优的目的是为了减少应用程序中的GC暂停时间,提高应用程序的性能和吞吐量。下面是一些常见的GC调优方法: 1. 选择最合适的GC算法。Java虚拟机提供了多种GC算法,如Serial GC、Parallel GC、CMS GC、G1 GC等。不同的GC算法适用于不同的应用场景,应根据应用程序的特点和运行环境选择最合适的GC算法。 2. 调整堆大小。堆大小的设置会影响到GC的频率和执行时间。如果堆过小,GC会频繁执行,导致应用程序的性能下降;如果堆过大,GC执行时间会增加,导致应用程序的响应时间变长。因此,应根据应用程序的特点和运行环境调整堆大小。 3. 减少对象的创建。对象的创建会占用内存空间,使得GC的频率增加。因此,应尽量减少对象的创建,可以使用对象池等技术来重复利用对象。 4. 避免过度使用finalize方法。finalize方法会导致对象在GC时需要执行额外的操作,会影响GC的执行时间。应尽量避免过度使用finalize方法。 5. 使用并发GC算法。并发GC算法可以在GC执行时不影响应用程序的运行,从而减少GC暂停时间。应根据应用程序的特点和运行环境选择合适的并发GC算法。 6. 使用GC日志进行分析。GC日志可以记录GC的执行情况,可以通过分析GC日志来找出GC执行时间长的原因,进而进行优化。 7. 使用GC调优工具。Java虚拟机提供了多种GC调优工具,如jstat、jmap、jstack等,可以通过这些工具来监视和分析GC的执行情况,从而进行优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值