如何排查java哪個(gè)程序耗時(shí)?
第一:
一般程序都有很多細(xì)小的功能模塊或者流程,首先需要定位是具體那個(gè)模塊/流程,判斷標(biāo)準(zhǔn),一是觀察實(shí)際執(zhí)行時(shí)間,如果時(shí)間差異很小無(wú)法區(qū)分,那就需要通過(guò)對(duì)代碼改造,打印每個(gè)流程所需要的時(shí)間。一般代碼如下:
常規(guī)寫法:
long begin = System.currentTimeMillis();
try {
// .... 具體的代碼段
} finally {
long end= System.currentTimeMillis();
System.out.println("cost: " + (end - begin));
}
此種方式需要在要記錄花費(fèi)時(shí)間的地方都加上上述代碼。

也可通過(guò)Spring AOP進(jìn)行實(shí)現(xiàn):
@Pointcut("execution(public * namespace.*.*(*))") public void point() { } @Around("point()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); try{ return joinPoint.proceed(); } finally {
long end= System.currentTimeMillis();
System.out.println("cost: " + (end - begin));
} }
如果java是通過(guò)Spring開發(fā)的建議可以通過(guò)AOP實(shí)現(xiàn),只需要要統(tǒng)計(jì)花費(fèi)時(shí)間方法上加上注解即可,不用修改源碼,常規(guī)的記錄時(shí)長(zhǎng)需要添加的代碼會(huì)更多。
AOP的機(jī)制入下圖:

代碼在改造后重新部署,觀察java的運(yùn)行日志log:查詢"cost: XXXXX"根據(jù)XXXXX大小就可以知道那個(gè)部分消耗的時(shí)間較多。然后根據(jù)消耗時(shí)間多的地方進(jìn)行代碼優(yōu)化。
一般問題可能是由java內(nèi)存問題,業(yè)務(wù)流程處理效率問題,數(shù)據(jù)庫(kù)sql問題引起,供參考。
第二:
程序耗時(shí)可能硬件環(huán)境也會(huì)有影響,查找了下網(wǎng)上給的標(biāo)準(zhǔn),供參考。
影響性能因素

通過(guò)vmstat、sar、iostat組合檢測(cè)是否是CPU瓶頸
通過(guò)free、vmstat組合檢測(cè)是否是內(nèi)存瓶頸
通過(guò)iostat檢測(cè)是否是磁盤I/O瓶頸
通過(guò)netstat檢測(cè)是否是網(wǎng)絡(luò)帶寬瓶頸
如果存在硬件上的瓶頸問題,可能就需要進(jìn)行硬件升級(jí)或者擴(kuò)容解決。

