目录
一 调优总结
1.1 调优的目的
减少full gc的次数,防止出现oom;解决运行缓慢、卡顿问题。
1.2 调优的依据
1调优的依据:运行日志;异常堆栈;GC日志;线程快照;堆转存储快照
1.3 调优的具体部署
1.熟悉业务场景:没有业务场景的调优都是耍流氓
2.性能监控,发现问题: 对【GC频繁、cpuload过高、OOM、内存泄漏、死锁】等问题进行监控发现
3.性能分析,排查问题:
通过命令行方式: jstack,jmap,jstat,jinfo等命令查看堆,线程、cpu资源的变化情况
通过可视化工具,jvisulvm,arthas,MAT等工具实时分享查看jvm状态。
4.解决问题,调优实施:
1.合理优化代码
2.适当增加内存,根据业务场景选择垃圾回收器。
1)设置必要的内存参数。比如: -Xms200m -Xmx200m -XX:+PrintGC 等
2)jstat -gc 动态观察gc情况 / 阅读GC日志发现频繁GC / arthas观察 / jconsole
jstat -gc pid 500 : 每隔500毫秒打印GC的情况
3) jmap -histo pid | head -20 查找有多少对象产生
4) jmap -dump:format=b,file=xxx pid / jmap -histo
5) 修改参数: -Xms20m -Xmx20m -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError
3.合理设置线程池数量
1)top命令观察到问题:内存不断增长,CPU占用率居高不下的进程。
top 查看所有的进程的cpu、内存占比。
top -Hp pid 查看指定pid下各个线程的cpu、内存占比。关注谁比较高(有可能是gc的线程)
2)jps定位具体java进程
进一步可以使用jstack pid 对进程中的各个线程查看。尤其对WAITING的多个线程要关注。
4.根据情况使用中间件,如缓存,消息队列。