Spring AOP 로깅 메모리 누수 문제 해결

2026. 1. 20. 14:30문제해결

배경

현재 배포되고 있는 Spring 서버를 대상으로 힙덤프를 이용한 MemoryAnalyzer 툴의 메모리 누수 의심 보고서가 다음과 같았습니다.

 

세번째 메모리 누수 의심은 AspectJExpressionPointcut 인스턴스가 10.35% 메모리 점유하고 있습니다. 해당 인스턴스들은 대부분 `ConcurrentHashMap$Node[]` 배열에서 참조하고 있습니다. 그리고 이러한 배열 데이터는 DefaultListableBeanFactory에 의해서 참조되고 있습니다.

 

원인

메모리 누수가 발생한 원인은 fineAnts Spring 서버의 기능중에서 service 패키지에 존재하는 클래스의 메서드가 실행될때마다 AOP가 과도하게 로깅을 수행하기 때문이었습니다. 그중에서 가장 많이 발생한 것은 종목의 현재가를 5초 간격으로 갱신하는 스케줄러 부분에서 많이 발생하였습니다. 로깅 AOP의 코드는 다음과 같습니다.

@Component  
@Aspect  
@Slf4j  
@Profile("!test")  
public class ServiceLogAspect {  
    private long startTime;  
  
    // service의 모든 메서드에 대해 적용  
    @Pointcut("execution(* co.fineants..service.*.*(..))")  
    public void pointCut() {  
  
    }  
  
    // 메서드 호출 전 로그 남기기  
    @Before("pointCut()")  
    public void logBefore(JoinPoint joinPoint) {  
       startTime = System.currentTimeMillis();  
       String methodName = ((MethodSignature)joinPoint.getSignature()).getMethod().getName();  
       String args = Arrays.toString(joinPoint.getArgs());  
       log.info("Entering Service: Method={} with Args={}", methodName, args);  
    }  
  
    // 메서드 호출 후 정상적으로 반환된 경우 로그 남기기  
    @AfterReturning(pointcut = "pointCut()", returning = "result")  
    public void logAfterReturning(JoinPoint joinPoint, Object result) {  
       String methodName = ((MethodSignature)joinPoint.getSignature()).getMethod().getName();  
       log.info("Exiting Service: Method={}, with Return={}", methodName, result);  
    }  
  
    // 완전히 종료된후 메서드 실행시간 측정하기  
    @After("pointCut()")  
    public void logAfter(JoinPoint joinPoint) {  
       long executionTime = System.currentTimeMillis() - startTime;  
       String methodName = ((MethodSignature)joinPoint.getSignature()).getMethod().getName();  
       log.info("Method={}, ExecutionTime={}ms", methodName, executionTime);  
    }  
}

 

해결방법

해당 로깅 내용은 실효성이 없고 메모리 누수 문제 또한 발생하였기 때문에 해당 클래스를 제거하기로 결정하였습니다.

 

실행결과

AOP 클래스를 제거한 다음에 배포하고 다시 메모리 누수 보고서를 실행한 결과는 다음과 같습니다.

실행 결과를 보면 AOP 관련된 메모리 누수가 제거된 것을 볼수 있습니다.

 

References