JVM调优技巧与经验

本文探讨了JVM调优的目标,强调了吞吐量和响应时间的重要性。介绍了如何通过减少Full GC次数和时间来优化JVM,以避免STW导致的卡顿。分享了配置JVM参数以输出GC日志的方法,并提到了几个开源工具用于离线分析。文章还提醒注意老年代大小设置以及元空间的调优,以防止启动缓慢和不必要的Full GC。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

吞吐量:用户代码时间/(用户代码时间 + 垃圾回收时间)
响应时间:STW越短,响应时间越好
调优追求的是什么?吞吐量优先还是响应时间优先,还是在满足一定响应时间的情况下,达到多大的吞吐量。

科学计算,吞吐量

什么是调优?

  • 根据需求进行JVM规划和预调优
  • 优化JVM运行环境(慢、卡顿)
  • 解决JVM运行过程中的各种问题,如OOM
  1. JVM调优其实就是尽量减少Full GC次数和时间。
    Full GC会导致STW(stop the world),Java所有线程挂起,,用户就会有卡顿的感觉。
    minor GC也会导致STW,但是时间很短对程序运行影响较小。而Full GC时间较长,一般比minor GC
    慢10倍以上,应该尽量避免。
    一般生产环境中,几天才会触发一次FGC,甚至一周。

  2. 在jvm参数中配置,可以打印GC日志

    -XX:+PrintGCDetails
    -Xloggc:/{path}/gc.log

    参数总结:
    -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 日志文件的输出路径

在这里插入图片描述
[Times: user=0.00 sys=0.00, real=0.00 secs]分别表示
用户消耗的CPU时间 内核态消耗的CPU时间 操作从开始到结束所经过的墙钟时间(Wall Clock Time)

user是用户态耗费的时间,sys是内核态耗费的时间,real是整个过程实际花费的时间。user+sys是CPU时间,每个CPU core单独计算,所以这个时间可能会是real的好几倍。
CPU时间和墙钟时间的差别是,墙钟时间包括各种非运算的等待耗时,例如等待磁盘I/O、等待线程阻塞,而CPU时间不包括这些耗时

可以使用一些离线的工具来对GC日志进行分析,比如sun的gchisto( https://java.net/projects/gchisto),gcviewer( https://github.com/chewiebug/GCViewer ),这些都是开源的工具,用户可以直接通过版本控制工具下载其源码,进行离线分析。
必看:
https://www.jianshu.com/p/fd1d4f21733a
https://www.jianshu.com/p/088d71f20a47
https://www.jianshu.com/p/5bad514071ab
https://www.jianshu.com/p/8eabaf631d15
https://www.jianshu.com/p/26f95965320e
https://www.jianshu.com/p/fd1d4f21733a
https://www.jianshu.com/p/dbaabe4554b6

老年代默认是占整个堆的2/3的大小

如果程序启动时,频繁发生元空间的Full GC,就会启动很慢,需要调大元空间值。
每秒产生的对象较大,survior区放不下,所以放到老年代,但是这些对象其实都是垃圾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值