language/java

Resouce leak: 'applicationContext' is never closed

아르르르를를르 2022. 1. 27. 19:16

자바 스프링 공부를 하다 다음과 같이 ApplicationContext를 사용할 때 resource leak 오류를 볼 수 있다.

스프링 컨테이너가 중지되면 암시적으로 닫히므로 실행되는데는 문제가 없지만 warning으로 뜨는 것이 꽤 신경쓰여 한번 알아보았다.

 

- ApplicationContext란?

해당 어플리케이션에 대한 구성정보를 제공하는 인터페이스이다. 객체를 생성하고 스프링 컨테이너를 초기화하기 위해 Bean들을 불러오는데 BeanFactory interface를 상속 받은 인터페이스이다.

BeanFactory와의 차이점이라면 BeanFactory는 lazy-loading 방식인데 반해 ApplicationContext는 pre-loading 방식으로 더 좋은 성능을 보인다.

 

아래가 내가 작성한 코드 예시이다.

    public static void main(String[] args) {
        // BeanFactory xmlFactory = new ClassPathXmlApplicationContext("config.xml"); // 에러 발생
        ApplicationContext xmlFactory = new ClassPathXmlApplicationContext("config.xml");
        String hello = xmlFactory.getBean("hello", String.class);
        System.out.println(hello);

 

여기서 '아 close하면 되겠네' 하고 단순히 xmlFactory.close()를 추가하면 해당 메소드가 없다고 나온다.

The method close() is undefined for the type ApplicationContext

 

 

다음 코드처럼 형변환 Downcast 시켜줘야 해결된다. ApplicationContext 에는 close method가 없다. AbstractApplicationContext에 구현되어 있는 close method를 사용하게 된다.

        ((ClassPathXmlApplicationContext) xmlFactory).close(); // 추가로 해결한 코드

 

 

문제 해결@@!

 

 

 

 

참고: https://stackoverflow.com/questions/14423980/how-to-close-a-spring-applicationcontext

'language > java' 카테고리의 다른 글

Java PermGen 영역  (0) 2022.03.20
Annotation 생성시 @Retention  (0) 2022.02.13
oom 발생시 jvm dump 뜨기  (0) 2021.10.21
VScode Junit에서 test용 application.yml 못읽어올 때  (0) 2021.10.02
java 장애 hang up 걸렸을 때  (0) 2021.07.17