第一:

一般程序都有很多细小的功能模块或者流程,首先需要定位是具体那个模块/流程,判断标准,一是观察实际执行时间,如果时间差异很小无法区分,那就需要通过对代码改造,打印每个流程所需要的时间。一般代码如下:

常规写法:

long begin = System.currentTimeMillis();

try {

// .... 具体的代码段

} finally {

long end= System.currentTimeMillis();

System.out.println("cost: " + (end - begin));

}

此种方式需要在要记录花费时间的地方都加上上述代码。

如何排查java哪个程序耗时

也可通过Spring AOP进行实现:

@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是通过Spring开发的建议可以通过AOP实现,只需要要统计花费时间方法上加上注解即可,不用修改源码,常规的记录时长需要添加的代码会更多。

AOP的机制入下图:

如何排查java哪个程序耗时

代码在改造后重新部署,观察java的运行日志log:查询"cost: XXXXX"根据XXXXX大小就可以知道那个部分消耗的时间较多。然后根据消耗时间多的地方进行代码优化。

一般问题可能是由java内存问题,业务流程处理效率问题,数据库sql问题引起,供参考。

第二:

程序耗时可能硬件环境也会有影响,查找了下网上给的标准,供参考。

影响性能因素
 

如何排查java哪个程序耗时

通过vmstat、sar、iostat组合检测是否是CPU瓶颈

通过free、vmstat组合检测是否是内存瓶颈

通过iostat检测是否是磁盘I/O瓶颈

通过netstat检测是否是网络带宽瓶颈

如果存在硬件上的瓶颈问题,可能就需要进行硬件升级或者扩容解决。