스프링 컨테이너가 자바의 가비지 컬렉션(Garbage Collection)에서 메모리 삭제 당하지 않는 이유는 스프링 컨테이너가 애플리케이션 실행 동안 강한 참조(strong reference)를 유지하기 때문입니다. 이 이유를 좀 더 자세히 설명하자면 다음과 같습니다.
강한 참조(Strong Reference)
- 자바의 가비지 컬렉터는 강한 참조가 없는 객체만을 가비지 컬렉션 대상으로 삼습니다. 스프링 컨테이너는 애플리케이션의 생명주기 동안 여러 객체를 강한 참조로 유지합니다. 즉, 스프링 컨테이너가 생성한 빈(bean) 객체들은 애플리케이션이 종료되기 전까지는 참조를 계속 유지하므로 가비지 컬렉터에 의해 수거되지 않습니다.
ApplicationContext의 생명주기
- 스프링 컨테이너는 ApplicationContext 인터페이스를 구현한 객체를 통해 관리됩니다. 이 ApplicationContext 객체는 애플리케이션이 실행되는 동안 메모리에 유지되며, 이 객체가 참조하고 있는 모든 빈들도 메모리에 유지됩니다. 따라서 애플리케이션이 실행 중인 동안 ApplicationContext는 가비지 컬렉션의 대상이 되지 않습니다.
루트 컨텍스트와 웹 애플리케이션 컨텍스트
- 웹 애플리케이션의 경우, 스프링 컨테이너는 서블릿 컨텍스트에 의해 참조됩니다. 서블릿 컨텍스트는 웹 애플리케이션이 배포되는 동안 유지되므로, 스프링 컨테이너도 마찬가지로 가비지 컬렉션의 대상이 되지 않습니다.
디펜던시 인젝션과 빈 관리
- 스프링은 객체의 생성을 컨테이너가 관리하도록 하여, 각 객체의 생명주기를 컨트롤합니다. 이는 단순히 객체의 생성과 소멸을 관리하는 것을 넘어, 객체들 간의 의존성을 관리함으로써 애플리케이션의 상태를 지속적으로 유지합니다. 이러한 관리 메커니즘 덕분에 객체들이 필요 이상으로 소멸되지 않습니다.