吞吐量:用户代码时间/(用户代码时间 + 垃圾回收时间)
响应时间:STW越短,响应时间越好
调优追求的是什么?吞吐量优先还是响应时间优先,还是在满足一定响应时间的情况下,达到多大的吞吐量。
科学计算,吞吐量
什么是调优?
- 根据需求进行JVM规划和预调优
- 优化JVM运行环境(慢、卡顿)
- 解决JVM运行过程中的各种问题,如OOM
-
JVM调优其实就是尽量减少Full GC次数和时间。
Full GC会导致STW(stop the world),Java所有线程挂起,,用户就会有卡顿的感觉。
minor GC也会导致STW,但是时间很短对程序运行影响较小。而Full GC时间较长,一般比minor GC
慢10倍以上,应该尽量避免。
一般生产环境中,几天才会触发一次FGC,甚至一周。 -
在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区放不下,所以放到老年代,但是这些对象其实都是垃圾。