인프런 커뮤니티 질문&답변

이주경님의 프로필 이미지
이주경

작성한 질문수

스프링 핵심 원리 - 기본편

프로토타입 스코프

프로토타입 인스턴스 생성 질문

작성

·

192

0

[질문 내용]
스프링이 생성해주는 싱글톤 빈은 static이니 jvm static 영역에 생성되는 걸로 이해하고 있습니다.
 
1. 그렇다면 프로토타입 빈은 static 영역에 저장되나요 heap 영역에 저장되나요?
 
2. 스프링은 프로토타입 빈의 생성, 초기화까지만 관여하고 더이상 관여하지 않는다고 했는데 그렇다면 프로토타입 인스턴스가 메모리에서 해제되는 시점은 언제인가요? 사용자가 destory하지 않고 프로토타입을 계속 생성할 경우 문제되는 일이 없을까요?
 
3. ApplicationContext에 스프링 빈이 등록이 되고, 의존성 주입 시점에서 ApplicationContext를 조회해서 주입하는 걸로 이해했습니다. (주입받을 빈이 프로토타입 빈이라면 해당 빈은 이때 생성될테고요.) 그렇다면 ApplicationContext는 jvm static 영역에 전역적으로 공유되는 값일까요?

감사합니다!

답변 1

0

안녕하세요. 이주경님, 공식 서포터즈 David입니다.

스프링이 생성해주는 싱글톤 빈은 static이니 jvm static 영역에 생성되는 걸로 이해하고 있습니다.

 => 모든 객체는 Heap에 생성됩니다. 이와 관련된 자세한 사항은 jvm memory model을 찾아봐주세요.

 

1. 그렇다면 프로토타입 빈은 static 영역에 저장되나요 heap 영역에 저장되나요?

 => Heap에 생성됩니다.

 

2. 스프링은 프로토타입 빈의 생성, 초기화까지만 관여하고 더이상 관여하지 않는다고 했는데 그렇다면 프로토타입 인스턴스가 메모리에서 해제되는 시점은 언제인가요? 사용자가 destory하지 않고 프로토타입을 계속 생성할 경우 문제되는 일이 없을까요?

 => 자바에서 객체는 GC에 의해 제거됩니다. 애플리케이션을 종료될 때를 제외하다면 GC 대상 조건이 충족될 때 GC가 동작하며 해당 객체는 메모리에서 해제됩니다. 이와 관련된 자세한 사항은 java garbage collector를 찾아봐주세요.

사용되는 객체가 계속 생성되어 메모리가 가득차게 되면 OOM 예외가 발생하게 됩니다.

 

3. ApplicationContext에 스프링 빈이 등록이 되고, 의존성 주입 시점에서 ApplicationContext를 조회해서 주입하는 걸로 이해했습니다. (주입받을 빈이 프로토타입 빈이라면 해당 빈은 이때 생성될테고요.) 그렇다면 ApplicationContext는 jvm static 영역에 전역적으로 공유되는 값일까요?

=> 어딘가에서 static 변수로 선언하여 그것을 사용하고 있다고 그렇습니다. 다만, 일반적으로 현재 로드된 ApplicationContext를 주입받을 때, ApplicationContextAwareProcessor를 사용하며 해당 Processor는 내부적으로 static 변수가 아닌 인스턴스 변수로 Application Context의 참조값을 보관하고 있습니다.

감사합니다.

이주경님의 프로필 이미지
이주경

작성한 질문수

질문하기