首先JVM调优是根据你的服务器以及你代码本身的设计来调整JVM参数来减少FULLGC次数以及内存溢出,堆栈溢出等问题,调优的最大方向是什么?
合理高质量的代码编写
充分利用服务器资源
JVM参数合理
那么为什么要去调优
结合上面所说,调优可以去防止预防出现OOM以及堆栈溢出
减少Full GC出现的频率,因为我们知道Full GC的时间是相比较长的,会跟用户体验上带来不爽
调优实际上也是为了给程序设置较为合理的运行时参数配置,参数如堆内存设置过小,因为运行时产出大量数据,导致年轻代很快爆满,老年代大小又不够,造成FUll GC Yong GC 的频率都很高,而参数设置过大,这是对服务器资源的浪费,而且这些空间并没得到合理利用
监控的依据
我们线上的服务监控异常一般采用这些方法:
1:运行时的log日志打印来了解运行时的一些信息
2:监控分析,自己搭建的日志监控,如果出现异常会通过邮件的形式去通知
3:GC日志 通过JVM参数将运行是出现的OOM等异常信息dump到文件里
4:分析异常的堆栈信息
通过监控发现问题
通过日志或者监控工具发现程序运行中出现的问题,一般会出现这些问题:
GC频繁
cpu load 过高
OOM
内存泄漏
死锁
程序响应时间较长
进行性能分析
通过打印GC日志 通过
GCview
或者http://gceasy.io
来分析日志信息灵活运用,命令行工具,
jstack
、jmap
、jinfo
等
dump
出堆文件,使用内存分析工具分析文件使用阿里
Arthas
, 或jconsole
,JVisualVM
来实时查看 JVM 状态
jstack
查看堆栈信息
性能调优
一种为改善应用响应性或吞吐量而更改参数、源代码、属性配置的活动,性能调优是在性能监控、性能分析之后的活动。
适当增加内存,根据业务背景选择垃圾回收器
优化代码,控制内存使用
增加机器,分散节点压力
合理设置线程池线程数量
使用中间件提高程序效率,比如缓存,消息队列等
....
性能评价/测试指标
响应时间
平均响应时间关系到客户的体验感,如打开一个网页或者请求一个接口
吞吐量
对单位时间内完成的工作量(请求)的量度
在 GC 中:运行用户代码的时间占总运行时间的比例(总运行时间:程序的运行时间+内存回收的时间)
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
吞吐量为:1-1/(1+n)
并发数
同一时刻,对服务器有实际交互的请求数。1000 个人同时在线,估计并发数在 5%-15%之间,也就是同时并发量:50-150 之间。
内存占用
Java 堆区所占的内存大小。
相互间的关系
以高速公路通行状况为例
- 吞吐量:每天通过高速公路收费站的车辆的数据
- 并发数:高速公路上正在行驶的车辆的数
- 响应时间:车速
随着并发数越来越多,响应时间也就是车速会慢慢降低,吞吐量也可能会反而降低。