[Java] 메모리 사용 영역

2023. 4. 26. 00:39

🧑🏻‍💻 자바에서 사용하는 메모리 영역에 대해 간단히 정리


Java Memory Structure

프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
🔎 JVM(Java Virtual Machine)
- Java 프로그램을 실행시키는 도구(자바 코드로 작성한 프로그램을 해석해 실행)
- Java와 OS 사이에서 중개자 역할 
- 메모리 관리 기능(Garbage Collector)
- 운영체제별로 이해하는 기계어가 다르므로 운영체제별로 다르게 설치 -> JVM을 통해 동일한 결과 얻을 수 있음
- JVM을 거쳐서 실행되기 때문에 실행 속도가 조금 느릴 수 있음

 

📍  그림 순서를 따라 간단하게 설명하면,

  1. Source Code(Hello.java) 파일을  Java Compliler 통해서  Byte Code(Hello.class) 파일로 변환
  2. Byte Code로 변환된 파일을 JVM의 Class Loader로 보냄
    → Class Loader는 Class 파일을 불러와서 메모리에 저장하는 역할
  3. Excution Engine은 Class Loader에 저장된  Byte Code를 명령어 단위로 분류하여 하나씩 실행하게 하는 엔진 
  4. Garbage Collector는 사용하지 않거나 필요없는 객체들을 메모리에서 소멸시키는 역할
  5.  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에 저장되어 있는 지역변수는 그렇지 않기 때문에 초기화를 진행해야한다.