解决问题思路
Java程序问题(运行慢)
先经过 top 查看整个CPU资源使用状况;
经过top -Hp pid查看java进程的每个线程占用CPU的状况;
若是有一个线程占用CPU太高,有两种可能:
没有内存了,Java垃圾回收线程不停地运行尝试回收内存,可是每次没法收回,确认:
jstat -gcutil pid 1s 观察10多秒钟就能发现了,看是否是内存使用率接近100%了
相似于死循环(hash冲突***),就是一个线程一直占用一个核的全部CPU资源(其实一个线程老是暂用一个核超过50%的资源都是不太正常的),解决:
用我课堂的checkPerf脚本,定位这个线程具体执行的任务(能具体到某一行),对应看代码解决。
若是有不少线程,每一个线程占用的CPU都很少,那基本是正常的。
若是死锁:
jstack -l pid 多执行几回,统计一下stack中老是在等待哪些锁,能够对锁id进行排序统计(sort uniq grep)
上面列出来的都是明显的瓶颈,最可怕的是哪里都没有明显的瓶颈,哪里都要偷一点点资源走,这是能够试试JProfiler这样更专业一点的工具,同时要配合本身对业务的了解来解决。
Java内存的问题,若是有内存泄露(就是执行完fgc/old gc后不能回收的内存不断地增长):
快速解决:jmap -histo:live pid 来统计全部对象的个数(String/char/Integer/HashEntry 这样的对象不少很正常,主要是盯着大家公司的包名下的那些对象)
每隔一分钟执行一次上面的命令,执行5次以上,看看大家公司报名下的对象数量哪一个在一直增长,那基本上就是这个对象引发了泄露;
用课堂上的工具HouseMD来动态监控建立这个对象的地方(通常来讲不少时候建立了这些对象把他们丢到一个HashMap而后就无论了),分析一下有没有释放!
上面的方法实在无法定位就用: jmap -dump 导出整个内存(耗时间,须要很大的内存的机器才能对这个导出文件进行分析,会将JVM锁住一段时间)
在Eclipse的插件EMA中打开这个文件(2G的物理文件须要4G以上的内存,5G以上的须要将近20G的内存来分析了)
盯着大家公司报名的那些对象,看看引用关系,谁拿着这些对象没释放(是不是必要的)
MySQL 数据库的性能问题
大部分状况下是磁盘IO的问题(索引没建好、查询太复杂);
索引问题的话分析慢查询日志,explain 他们挨个解决。
偶尔也有数据库CPU不够的状况,若是并发高CPU不够很正常,若是并发不高,那极可能就是group by/order by/random之类的操做严重消耗了数据库的CPU
mysql -e "show full processlist" | grep -v Sleep | sort -rnk6 查看那些SQL语句执行的太长
拿出这个SQL语句分析他们的执行计划: explain SQL 而后改进;
分析慢查询日志,统计top10性能杀手的语句,挨个explain他们,而后改进(具体改进办法具体分析,这里只谈思路)
总结一下数据库问题就只有这三招:show full processlist/分析慢查询日志/explain(而后建好联合索引)