nobodj
No SG 운동

JAVA JVM메모리 사용시 쓰레기값 September 21, 2017

JVM이 사용하는 램메모리공간은 Stack, Heap, Static 3개로 나뉘어 있다.
Heap, Static같은 경우는 자동초기화를 지원하기 때문에 변수선언, 혹은 객체생성시 자료형에 따른 기본값이 채워진다.
int => 0, char => \u0000

그럼 Stack에서는…

Stack에서는 자동초기화를 지원하지 않기 때문에, 선언과 동시에 쓰레기값이 채워진다.
고로, 초기화란 최초의 값대입이므로, 선언당시 사용자가 값을 대입하지 않으면, 최초로 쓰레기값이 대입된다. 그래서 선언후, 이후 값을 대입한다고 해도, 초기화라고 할 수 없는 이유가 여기 있다.

그럼, 쓰레기값은 뭐냐..

Stack은 LIFO Last In First Out구조를 가지고 있다. 객체의 메서드를 실행하게 되면, 메서드가 사용할 메모리가 Stack에 할당된다. 또, 이 메서드 Stack에 파라미터와 메서드의 지역변수들이 저장된다. LIFO 구조로 나중에 실행된 메소드(push)가 먼저 반환된다(pop). 이 때, 메모리를 반환하는데, 이 때 반환은 메모리를 지운다는 게 아니라, 메소드가 더이상 참조되지 않는 것이다. 주소값을 날려버린다고 한다.
고로, 메소드가 사용한 지역변수등의 데이터는 고스란히 남아있게된다. 이때, 새로호출된 메서드가 이 메모리 공간을 할당받는 일이 생긴다. 먼저사용한 메서드의 데이터가 고스란히 남아있기 때문에, 새로 값을 덮어쓰기 전까지 이 데이터가 변수영역에 담겨있는 값을 쓰레기값이라 한다.

초기화란 개념을 잡는데, 이것이 튀어나왔다.ㅎㅎ

No Comments on JAVA JVM메모리 사용시 쓰레기값
Categories: Coding JAVA