目录
1、什么是调优
调优简单说就是把整个系统进行优化:
- 根据需求进行JVM规划和预调优,比如为程序设置合适的内存、选择合适的垃圾回收器等
- 当程序出现慢或者卡顿现象时,优化JVM运行环境
- 解决JVM运行中出现的各种问题,比如OOM
2、吞吐量与响应时间
吞吐量:用户程序执行时间/(用户程序执行时间+垃圾回收时间)
- 单位时间内,STW 的时间最短 (发生2次STW,0.2+0.2=0.4),垃圾回收时间占比最低,这样就称吞吐量高.
- 业务场景:比如科学计算就要求吞吐量优先。
- 垃圾回收器:PS+PO
响应时间:STW越短,程序响应越快
- 单位时间内,可能发生5次STW,但是单次的STW时间最短(0.1+0.1+0.1+0.1+0.1=0.5)
- 业务场景:电商网站,CSDN,对外提供的API等这类服务响应时间要优先。
- 垃圾回收器:CMS,G1
3、如何进行预调优
1、熟悉业务场景,选择合适的垃圾回收器
- 如果是响应时间优先,选择CMS、G1、ZGC;
- 如果是吞吐量优先,就选择ParallelGC(PS+PO)
2、计算内存需求,给JVM设置合适的内存大小
- 新生代能容纳所有【并发量 * (请求-响应)】的数据
- 幸存区大到能保留【当前活跃对象+需要晋升对象】
- 年轻代应该占整个堆内存的25%到50%
- 晋升阈值配置得当,让长时间存活对象尽快晋升
3、选定CPU,越高越好
4、设定日志参数
-xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFile=5
-XX:GCLogFileSize=20M
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCCause
在生产环境中日志文件,日志名字按照系统时间产生,循环产生,日志个数5个,每个大小20M,这样整体大小100M,便于控制,方便查找问题。5、进行压测监控JMeter
4、系统cpu经常100%,如何调优
1、cpu100%那么一定是有线程在占用系统资源,先找到是哪个进程cpu占用高(top)
2、找到该进程中的哪个线程cpu高(top -H -p <PID>)
3、导出该线程的堆栈,需要将线程id从十进制转为十六进制,因为java线程栈文件中的线程id是十六进制(jstack PID 或 jstack PID > pid.tdump 导出文件)
4、查找哪个方法(栈帧)消耗时间(jstack)
5、工作线程占比高还是垃圾回收线程占比高参考:https://blog.csdn.net/wangjun5159/article/details/90414097
5、系统内存飙高,如何查找问题
1、通过jmap命令导出堆文件( jmap -dump:live,format=b,file=dump.hprof PID)
2、使用jhat、MAT、jvisualvm工具对dump文件进行分析
参考:https://blog.csdn.net/qq_34416191/article/details/118765057
6、面试题
案例一、每日百万订单电商网站,处理订单系统需要什么样的服务器配置?
- 首先估算高峰时期有多少订单,比如峰值时期1s有1000个订单,假设每个订单请求响应的数据大概1M;
- 那么新生代大小至少是1000*1M=1000M,再以此估算整个对空间大小。
案例二、某网站将服务器堆内存由2G增加到16G,用户反而反馈卡顿严重,为什么?
- 首先查一下GC日志,看是否是STW时间变长;
- 再看服务器是用的什么垃圾回收器,(PS+PO)内存越大,FGC时间越长;
- 选用响应时间快的垃圾回收器,比如CMS,G1。