如何排查java哪个程序耗时?
第一:
一般程序都有很多细小的功能模块或者流程,首先需要定位是具体那个模块/流程,判断标准,一是观察实际执行时间,如果时间差异很小无法区分,那就需要通过对代码改造,打印每个流程所需要的时间。一般代码如下:
常规写法:
long begin = System.currentTimeMillis();
try {
// .... 具体的代码段
} finally {
long end= System.currentTimeMillis();
System.out.println("cost: " + (end - begin));
}
此种方式需要在要记录花费时间的地方都加上上述代码。
也可通过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的运行日志log:查询"cost: XXXXX"根据XXXXX大小就可以知道那个部分消耗的时间较多。然后根据消耗时间多的地方进行代码优化。
一般问题可能是由java内存问题,业务流程处理效率问题,数据库sql问题引起,供参考。
第二:
程序耗时可能硬件环境也会有影响,查找了下网上给的标准,供参考。
影响性能因素
通过vmstat、sar、iostat组合检测是否是CPU瓶颈
通过free、vmstat组合检测是否是内存瓶颈
通过iostat检测是否是磁盘I/O瓶颈
通过netstat检测是否是网络带宽瓶颈
如果存在硬件上的瓶颈问题,可能就需要进行硬件升级或者扩容解决。