利用spring aop 检测方法执行时间,和所用内存

public class MethodTimeAdvice implements MethodInterceptor {  
    protected final Log log = LogFactory.getLog("actionInfoFile");  
    private final String delimiter=",";
    private final String headPrefix="[StartTime Operator Time(ms) Memory(kb) Method Class],";
    private SimpleDateFormat formator = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    /**   
     * 拦截要执行的目标方法   
     */    
    @SuppressWarnings("rawtypes")
	public Object invoke(MethodInvocation invocation) throws Throwable {     
        //用 commons-lang 提供的 StopWatch 计时,Spring 也提供了一个 StopWatch
    	StringBuilder sb = new StringBuilder();
        StopWatch clock = new StopWatch(); 
        
		sb.append( headPrefix );
		sb.append(" - ");
		sb.append( formator.format(new Date()) + delimiter );
		
		clock.start(); // 计时开始
		
		//记录方法调用前的空闲内存
		long startFreeMemory = Runtime.getRuntime().freeMemory();
		
		Object result = invocation.proceed();
		
		//记录方法调用后的空闲内存
		long endFreeMemory = Runtime.getRuntime().freeMemory();
		long usedMemory = getUsedMemory(startFreeMemory, endFreeMemory);
		
		clock.stop(); // 计时结束
        String usrname = SecurityUtil.getLoginUsername()+ "_" + SecurityUtil.getLoginUserNick();
        //方法参数类型,转换成简单类型     
        Class[] params = invocation.getMethod().getParameterTypes();     
        String[] simpleParams = new String[params.length];     
        for (int i = 0; i < params.length; i++) {     
            simpleParams[i] = params[i].getSimpleName();     
        }     
        sb.append( usrname + delimiter );
        sb.append( clock.getTime() + delimiter);
        sb.append(' ');
        sb.append( usedMemory + delimiter);
        sb.append( invocation.getMethod().getName()+ delimiter );
        sb.append( invocation.getThis().getClass().getName() );
        log.info(sb.toString());
        return result;     
    }     
  
    /**
     * 计算使用的内存
     * @param startFreeMemory 起始时使用内存
     * @param endFreeMemory 结束时使用内存
     * @return 返回使用的内存(单位:kb)
     */
    private long getUsedMemory(long startFreeMemory, long endFreeMemory){
    	long result = 0;
    	long diff = startFreeMemory - endFreeMemory;
    	result = diff/1024;
    	return result;
    }
  
}  

猜你喜欢

转载自xuyunti.iteye.com/blog/2226980