인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

goro님의 프로필 이미지
goro

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

회원 웹 기능 - 조회

MemoryMemberRepository의 store 변수 질문

작성

·

308

0


1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]

안녕하세요 기초적인 질문이 좀 있습니다. 질문이 좀 많아서 죄송합니다..질문 가능한 답변만 해주셔도 괜찮으니 좋은 답변 부탁드리겠습니다.

 

<궁금한점>

MemoryMemberRepository의 store 변수의 메모리관리에 관하여..

 

<상세>

메모리 구조에 관해 아직 지식이 많이 부족하여 질문드립니다.

 

1)private static Map<Long, Member> store = new HashMap<>()으로 선언하면, 변수는 static메모리에, new HashMap은 heap메모리에 저장되는 것이 맞나요?

 

2)static을 붙이면 프로그램이 종료될 때까지 메모리에 유지된다고 알고 있습니다. 궁금해서 static을 빼고 실행해봤는데, static을 빼도 localhost서버를 내릴 때까지 메모리에 저장한 Member값이 유지되더라구요!제가 잘못 알고 있는 부분이 있을까요?

 

3)선생님이 강의 중에 store 변수가 참조하는 HashMap을 '동시성 문제로 ConcurrentHashMap을 사용할 수도 있다'라고 하셨는데, 이것은 쓰레드 세이프티와 관련된 말씀이신가요? 일반 HashMap은 쓰레드세이프티하지 않기 때문에 멀티쓰레드 환경에서 접근이 뒤섞여서 잘못된 참조를 할 수 있다고 이해하면 될까요?

 

4)static이 프로그램이 종료될때까지라고 하는데..종료라는 말이 localhost는 서버를 내리는 시점이라면, 일반적인 실무에서의 서버도 was 서버가 내려갈떄까지를 의미하나요? 그렇다면 static으로 저렇게 변수를 만들어두면 저 static변수를 초기화하려면 was서버를 내려야 한다고 이해를 해야하는지 궁금합니다.

답변 1

1

안녕하세요, goro 님. 공식 서포터즈 codesweaver 입니다.
.
1. static으로 선언된 객체는 StaticArea에 저장됩니다. 

 

2. static 변수는 애플리케이션이 실행되는 시점에 생성 초기화되며 애플리케이션이 종료되는 시점까지 유지됩니다. 그리고 또 중요한 특징은, 어떤 클래스가 static 멤버 변수를 갖을 경우, 그 클래스의 모든 인스턴스가 이 staitc 멤버 변수를 '공유'한다는 점입니다. 그리고 인스턴스가 모두 사라져도 static 멤버 변수는 사라지지 않고 존재합니다. 그래서 static 멤버 변수는 인스턴스에 속하는 값이 아니라 클래스에 속한다 라고 표현합니다.

.

static이 붙지 않은 멤버 변수는, 어떤 클래스의 인스턴스가 생성될때 멤버 변수 또한 '새롭게'생성되며, 이 인스턴스가 삭제될때까지만 유지됩니다. 생명주기가 애플리케이션이 아닌, 클래스의 인스턴스와 같습니다.

.

3. 네 맞습니다. 동시성 문제가 발생할 수 있는 코드는 가급적 멤버 변수를 사용하지 말고 지역 변수(메서드 내에 새로 생성된 변수)를 사용할것을 권합니다.

 

4. 보통 애플리케이션을 종료하는 시점이 웹 서버를 내리는 시점과 일치하긴 하지만 꼭 그런것은 아닙니다. 자바 앱을 배포할 때 war 파일을 덮어씌우는 형태로 배포하기도 합니다. 그렇게 되면 웹 서버는 war 파일이 변경된것을 감지,  deploy 작업을 하여 새로운 코드를 앱에 반영합니다. 이 과정에서 앱은  자동적으로 종료와 재시작 과정을 갖게 됩니다. 


.
감사합니다.

goro님의 프로필 이미지
goro
질문자

많은 질문에 답변 주셔서 감사합니다. 다 잘 이해가 되었지만 2번같은경우 한 번 더 여쭤봐도될까요?

static을 빼고 store변수를 이용해 멤버를 저장했을 때, 그것이 목록에 나타나 유지되는 것을 확인했습니다. 저는 인스턴스와 static의 차이가 메모리 저장 위치와 '초기화 시점'이라고 이해하면 될까요?

인스턴스(store변수의 참조객체)는 사용하는 방식이나 빈도에 따라 프로그램 종료시점까지도 사용될 수 있는거라고 봐도 될까요?

예전에 공부한 부분이라 뒤엉킨것같기도 하고 생각을 깊게하니 헷깔린것같습니다 ㅜ

 

안녕하세요 goro님!

 

네 맞습니다. static 은 애플리케이션 구동 시점,

인스턴스는 new 키워드를 만나는 시점에 생성됩니다.

인스턴스가 생성된 이후 아무곳에서도 참조하지 않으면 GC에 의해 자동으로 소멸되며 이때 store 도 보통은 소멸합니다. 다만, store 가 객체를 참조하는 콜렉션이고 콜렉션 객체가 사용되고 있는 등의 복잡한 상황이라면 GC가 정상적으로 소멸시키지 못하고 메모리 누수를 발생시키기도 합니다.

 

자바 메모리 누수에 관하여 검색해서 여러 케이스를 한번씩 읽어보시길 권합니다.

감사합니다.

goro님의 프로필 이미지
goro

작성한 질문수

질문하기