概述
为什么要调优
- 防止出现OOM
- 解决OOM
- 减少Full GC出现的频率
监控的依据
- 运行日志
- 异常堆栈
- GC日志
- 线程快照
- 堆转储快照
性能优化的步骤
第1步(发现问题):性能监控
- GC频繁
- cpu load过高
- OOM
- 内存泄露
- 死锁
- 程序响应时间较长
第2步(排查问题):性能分析
- 打印GC日志,通过GCviewer或者http://gceasy.io来分析异常信息
- 灵活运用命令行工具、jstack、jmap、jinfo等
- dump出堆文件,使用内存分析工具分析文件
- 使用阿里Arthas、jconsole、JVisualVM来实时查看JVM状态
- jstack查看堆栈信息
第3步(解决问题):性能调优
- 适当增加内存,根据业务背景选择垃圾回收器
- 优化代码,控制内存使用
- 增加机器,分散节点压力
- 合理设置线程池线程数量
- 使用中间件提高程序效率,比如缓存、消息队列等
性能评价/测试指标
- 1-停顿时间(或响应时间)
- 2-吞吐量
- 对单位时间内完成的工作量(请求)的量度
- 在GC中:运行用户代码的事件占总运行时间的比例
总运行时间:程序的运行时间+内存回收的时间)
吞吐量为1-1/(1+n),其中-XX::GCTimeRatio=n
假设-XX:GCTimeRatio=19 ,则垃圾收集时间为1/(1+19),默认值为99,即1%时间用于垃圾收集
GCTimeRatio参数的值是一个大于0且小于100的整数,也就是垃圾收集时间占总时间的比率
,相当于是吞吐量的倒数,如果把此参数设置为19,那允许的最大GC时间就占总时间的5%(即1/(1+19)),默认值为99,就是允许最大1%(即1/(1+99))的垃圾收集时间。(引自《深入理解java虚拟机》)
- 3-并发数
同一时刻,对服务器有实际交互的请求数
- 4-内存占用
Java堆区所占的内存大小 - 5-相互间的关系