JAVA 코드(정확히는 byte code)를 실행하기 위해 JVM 이 구동된다.

 

JVM 은 운영체제로부터 메모리 자원을 할당받고,

 

할당받은 그 메모리를 JVM 자신과 JAVA 코드를 실행하는 데 사용한다.

 

코드를 위해 사용하는 메모리 공간을 크게 세 개로 나눈다.

 

1. 메소드 영역

 -  byte code 와 static 변수, 메소드들이 위치한다.

 

2. 스택 영역

 - 메소드 내부에서 생성한 변수들이 스택처럼 이곳에 쌓인다.

 - 메소드 실행이 끝났거나, 지역변수가 사라질 때 메모리 상에서 사라진다.

 

3. 힙 영역

 - 인스턴스들이 여기 올라온다.

 - 메소드 내에서 인스턴스를 생성한다면, 인스턴스가 힙 영역에 생성되고 해당 인스턴스를 가리키는 객체는 스택 영역에 쌓인다.

 - 스택 영역의 두번째 이유로 인스턴스를 가리키는 객체가 사라진다고 해도, 힙 영역 내의 인스턴스는 그대로 존재한다. 다만 코드 내에서 더 이상 해당 인스턴스에 접근이 불가능하게 될 뿐이다.

 - 접근이 불가능하게 된 인스턴스들은 JVM 에 의해 수거되고 사라진다. 이 일을 하는 것이 바로 garbage collector 이다.

 - 오랜 기간 동안 힙 영역에 남아있는 인스턴스들은 garbage collector 의 손아귀에서 벗어나 좀 더 오랫동안 연명할 수 있는 공간으로 이동한다. 아래 D2 참고.

https://d2.naver.com/helloworld/1329

+ Recent posts