第一:
一般程序都有很多細小的功能模塊或者流程,首先需要定位是具體那個模塊/流程,判斷標準,一是觀察實際執行時間,如果時間差異很小無法區分,那就需要通過對代碼改造,打印每個流程所需要的時間。一般代碼如下:
常規寫法:
longbegin=System.currentTimeMillis();
try{
//....具體的代碼段
}finally{
longend=System.currentTimeMillis();
System.out.println("cost:"+(end-begin));
}
此種方式需要在要記錄花費時間的地方都加上上述代碼。
也可通過SpringAOP進行實現:
@Pointcut("execution(public*namespace.*.*(*))")publicvoidpoint(){}@Around("point()")publicObjectdoAround(ProceedingJoinPointjoinPoint)throwsThrowable{longstart=System.currentTimeMillis();try{returnjoinPoint.proceed();}finally{
longend=System.currentTimeMillis();
System.out.println("cost:"+(end-begin));
}}
如果java是通過Spring開發的建議可以通過AOP實現,只需要要統計花費時間方法上加上注解即可,不用修改源碼,常規的記錄時長需要添加的代碼會更多。
AOP的機制入下圖:
代碼在改造后重新部署,觀察java的運行日志log:查詢"cost:XXXXX"根據XXXXX大小就可以知道那個部分消耗的時間較多。然后根據消耗時間多的地方進行代碼優化。
一般問題可能是由java內存問題,業務流程處理效率問題,數據庫sql問題引起,供參考。
第二:
程序耗時可能硬件環境也會有影響,查找了下網上給的標準,供參考。
影響性能因素
通過vmstat、sar、iostat組合檢測是否是CPU瓶頸
通過free、vmstat組合檢測是否是內存瓶頸
通過iostat檢測是否是磁盤I/O瓶頸
通過netstat檢測是否是網絡帶寬瓶頸
如果存在硬件上的瓶頸問題,可能就需要進行硬件升級或者擴容解決。
以上為排查java那個耗時的2點,希望對你有幫助,謝謝~