-> 블로그 이전

[Java] 메모리 구조

2022. 1. 18. 16:42Language`/Java

JVM (Java Virtual Machine)

- 자바 ↔ 운영체제 사이에서 중개자 역할

- 운영체제에 상관없이 프로그램을 실행할 수 있게 해준다 → JVM은 운영체제에 종속적

- 가비지 컬렉터(GC)를 사용해서 메모리 관리를 자동으로 수행

- Stack 기반으로 동작

- (Garbage Collector / Execution Engine / Class Loader / Runtime Data Area) 4가지 구조로 나눌 수 있다

- 최초 JVM이 나왔을 당시에는 인터프리터 방식이어서 속도가 느렸지만, JIT 컴파일러 방식을 통해서 보완

  • JIT : Byte Code를 어셈블러 같은 네이티브 코드로 바꿈으로써, 실행이 빠르지만 비용이 발생
  • JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정 기준이 넘어가면 JIT 컴파일러 방식으로 실행

1. 자바 컴파일러에 의해 링크 과정 없이 Java Code → Byte Code로 변환

2. 해당 Byte Code를 JVM을 통해 실행 → Byte Code는 JVM에서만 실행 가능하다

 

 

 

JVM 메모리 구조

- 자바 소스파일이 자바 컴파일러에 의해 바이트 코드 형태인 클래스 파일로 변환

- 이 클래스 파일은 Class Loader가 읽어들이면서 JVM이 수행

 

(1) Class Loader

- JVM안에 Runtime Data Area로 클래스 파일을 로드

- 링크 작업을 통해서 배치하는 작업을 수행

- 런타임 시동적으로 클래스를 로드

 

(2) Execution Engine

- Class Loader를 통해서 Runtime Data Area에 로드된 Byte Code들을 명령어 단위로 읽어서 실행 

 

(3) Garbage Collector

- Heap Memory Area생성된 객체들 중에서 참조되지 않거나 null인 객체의 Memory를 해체시켜서 반납

  • GC의 수행 시간은 언제인지 정확히 알 수 없다

 

(4) Runtime Data Area

- JVM의 Memory Area

- 자바 Application을 실행할 때 사용되는 Data들을 적재하는 영역

- (Method(Static) Area / Heap Area / Stack Area / PC Register / Native Method Stack)으로 나눌 수 있다

 

▶ Method(Static) Area

- 모든 Thread가 공유하는 Memory Area

- JVM 시작 시 생성

- (Class / Interface / Method / Field[Static 변수, 전역 변수]) 등의 Byte Code를 보관

- Method Area의 Data들은 프로그램 시작 ~ 종료까지 Memory에 남아있는다 

 

▶ Heap Area

- 모든 Thread가 공유하는 Memory Area

- 런타임 시 동적으로 할당해서 사용하는 Memory Area

- new 키워드로 생성된 객체, 인스턴스 변수, 배열이 생성되는 영역

- Method Area에 로드된 Class만 생성 가능

- GC가 참조되지 않는 메모리를 확인하고 제거하는 영역

 

▶ Stack Area

- Method 호출 시마다 각각의 Stack Frame을 생성 (해당 Method만을 위한 공간)

- Method내에 지역변수의 Data값이 저장

- 호출된 Method의 매개변수/지역변수/리턴값/연산 시 임의의 값들을 임시로 저장

- Method 수행이 끝나면 Frame별로 삭제

 

▶ PC Register

- Thread가 시작될 때 생성

- 생성될 때마다 생성되는 공간으로 Thread마다 하나씩 존재

- Thread가 어떤 부분을 무슨 명령으로 실행해야 할지 기록

- 현재 수행중인 JVM 명령의 주소를 보유

 

▶ Native Method Stack

- Java 외 언어로 작성된 Native Code를 위한 Memory Area


전역변수, static 변수 = Method(Static) Area에 저장

지역변수 = Stack Area에 저장

※ Heap 영역에 존재하는 Object 멤버(객체, 배열, 인스턴스)들은 자동 초기화가 된다

  • String name → null로 초기화
  • int age → 0으로 초기화
  • int [] arr → null로 초기화
  • boolean flag → false로 초기화