[Java] 메모리 사용 영역
2023. 4. 26. 00:39
🧑🏻💻 자바에서 사용하는 메모리 영역에 대해 간단히 정리

프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
🔎 JVM(Java Virtual Machine)
- Java 프로그램을 실행시키는 도구(자바 코드로 작성한 프로그램을 해석해 실행)
- Java와 OS 사이에서 중개자 역할
- 메모리 관리 기능(Garbage Collector)
- 운영체제별로 이해하는 기계어가 다르므로 운영체제별로 다르게 설치 -> JVM을 통해 동일한 결과 얻을 수 있음
- JVM을 거쳐서 실행되기 때문에 실행 속도가 조금 느릴 수 있음
📍 그림 순서를 따라 간단하게 설명하면,
- Source Code(Hello.java) 파일을 Java Compliler 통해서 Byte Code(Hello.class) 파일로 변환
- Byte Code로 변환된 파일을 JVM의 Class Loader로 보냄
→ Class Loader는 Class 파일을 불러와서 메모리에 저장하는 역할 - Excution Engine은 Class Loader에 저장된 Byte Code를 명령어 단위로 분류하여 하나씩 실행하게 하는 엔진
- Garbage Collector는 사용하지 않거나 필요없는 객체들을 메모리에서 소멸시키는 역할
- Runtime Data Area는 JVM이 프로그램을 수행하기 위해 운영체제로부터 할당받은 메모리 공간
💡 Runtime Data Area 영역 자세히 알아보기
1. Class Area(=Method Area)
- 클래스의 정보(멤버변수의 이름), 변수 정보(데이터 타입, 접근제어자 정보), 메서드 정보(메서드 이름, 리턴 타입, 파라미터, 접근 제어자 정보), static 변수, final class 변수, 생성자 코드, Constant pool(상수풀 : 문자상수, 타입, 필드, 객체 참조)등을 분류해서 저장
- JVM이 동작해서 클래스가 로딩될 때 생성
2. Heap Area
- new 연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간
- 클래스 영역에 로드된 클래스만 생성가능
- GC의 주요 대상이 됨(Stack, Class Area 도 대상이 됨)
→ 효율적인 GC를 위해 메모리 영역이 분리되어 있음(Eden, Survivor1,2, Old) - Runtime 시 할당됨
- 객체의 번지는 메소드 영역과 스택 영역의 상수와 변수에서 참조 가능
3. Stack Area
- 지역 변수, 파라미터, 리턴값, 연산에 사용되는 임시 값 등이 생성되는 지역
- 메서드 호출할 때마다 프레임 생성, 메서드가 끝나면 자동 제거
- 프레임 내부에는 지역 변수 스택이 있는데 여기에서 기본 타입 변수와 참조 타입 변수가 생성되고 제거됨
- 컴파일 타임시 할당
🔎 런타임과 컴파일 타임
- 컴파일 타임 : 소스코드가 기계어로 변환되어 실행가능한 프로그램이 되는 과정
- 런타임 : 컴파일타임 이후 프로그램이 실행되는 때
4. PC Resister
- 스레드가 생성될 때마다 생성되며 현재 스레드가 실행되는 부분의 주소와 명령을 저장하는 지역
5. Native Method Stack
- 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역
📍 객체가 생성될 때의 흐름
👉🏻 새 인스턴스가 생성될 떄마다(new키워드) Heap Area에 공간이 할당되고 인스턴스 변수의 값이 할당되면 그 값이 Heap Area에 저장된다. 이후 인스턴스 참조 변수가 선언되면 해당 인스턴스에 대한 주소가 스택 메모리에 할당되고 할당되는 값은 다시 Heap Area에 저장
📍 지역 변수는 Stack Area 에 저장되고 인스턴스 변수는 Heap Area에 저장된다. Heap Area에 저장되는 인스턴스 변수는 강제로 초기화가 진행되기 때문에(생성자) 초기화를 실행해 줄 필요 없지만 Stack Area에 저장되어 있는 지역변수는 그렇지 않기 때문에 초기화를 진행해야한다.