메모리 사용역역
메모리 영역에 대해 우리는 이미 배운적이 있다.
하지만 어렴풋이 알지만 안보다보면 잊어버리기 좋다.
다시 한번 기억해볼만한 내용이으로 메모리 영역에 대해 작성해본다.
자바에는 JVM(Java Virtual Machine)이라고 자바를 구동시키기 위한 가상머신이 있다.
이 녀석은 운영체제에서 할당받은 메모리영역(Runtime Data Area)을 아래와 같이 Method, Heap, Stack으로 구분해서 사용한다.
Method 영역
- 자바를 실행할때 클래스로더를 통해, Class 파일들을 읽는다.
- 그리고 클래스별로 상수, 필드, 메소드 데이터, 메소드 코드, 생성자와 같은 클래스의 내용을 Method영역에 위치한다.
- 이 영역은 Java가 실행될때 생성되고 모든 스레드가 공유하는 영역이다.
(클래스 로더를 통해 읽는 과정은 더 복잡해서 여기까지만 🤭)
Heap 영역
- 객체, 배열이 생성되고 위치하는 영역이다.
- new Clazz()와 같이 객체를 인스턴스화 하는 경우, 이곳에 위치한다.
- 그리고 객체를 생성하면, 실제 변수에는 Heap 영역의 주소(Reference)가 저장된다.
- 실제 객체와 배열에 대한 데이터는 Heap에 위치한다.
- 이 Heap 영역은 GC(Garbage Collection)를 통해 메모리가 관리된다.
(펌웨어 코드 작성하다보면, 역시 God Java 😇!)
JVM Stack 영역
- 스택영역은 스레드마다 하나씩 매칭되어 존재한다.
- 스택에는 프레임이 있다. 프레임은 Stack에 Push되거나 Pop될 수 있는 단위이다.
- 스택에 언제 프레임이 Push 또는 Pop되는가 ?
- int, float와 같은 기본 타입(Primitive type) 값이 초기화 되었을때 프레임이 Push 된다. 블록을 벗어났을때 프레임이 Pop 된다.
- 메소드가 호출되었을때 프레임이 Push 된다. 해당 메소드가 종료되면 프레임이 Pop된다.
- Class, Interface, Enum, List와 같은 참조 타입(Reference type) 객체가 생성 되었을때 해당 Reference type에 대한 Heap영역의 주소가 Stack에 Frame으로 Push되거나 Pop 된다.