無테고리 인생살이

[JAVA] JVM 정의, 내부 구조, 메모리 영역 (feat. 자바 프로그램 실행과정) 본문

Java

[JAVA] JVM 정의, 내부 구조, 메모리 영역 (feat. 자바 프로그램 실행과정)

無격 2022. 12. 4. 21:54
  • JVM 정의
  • JVM 전체 구조
  • 자바 프로그램 실행과정
  • JVM 메모리 영역

 


 

## 일반 프로그램 VS 자바 프로그램

application VS Java application

 

일반 프로그램은 운영체제(=OS) 위에서 실행됩니다.

하지만, 자바 프로그램은 JVM 위에서 실행되기 때문에, 운영체제가 JVM을 실행시키고 JVM이 자바 프로그램을 실행시킵니다.

 

## 자바 프로그램의 실행구조

출처: https://webwarehouse.tistory.com/5

 

  • JVM이 설치되어 있다면, 하나의 자바 프로그램은 운영체제에 구애받지 않고 실행이 가능합니다. (뛰어난 이식성)

# JVM이란? 

Java Virtual Machine의 약자로, 자바 가상 머신이라고 불립니다.
위 그림에서 볼 수 있듯이 JVM은 운영체제에서 구동되며, 자바 프로그램을 실행시키는 역할을 하는 또 다른 소프트웨어입니다. 

 

# JVM 전체 구조

출처: https://ahea.files.wordpress.com/2017/05/11.png?w=736

 

  1. Class Loader: 컴파일된 bytecode(.class 파일)을 JVM 안으로 로드하고 JVM 메모리 영역의 Method Area에 배치
  2. Runtime Data Area: OS에게 할당받은 JVM 메모리 영역으로, 자바 프로그램을 실행하는 데 사용되는 데이터들이 저장됨
  3. Execution Engine: Method Area에 배치된 bytecode를 읽어들여 프로그램 실행

 

# 자바 프로그램 실행과정

  1. 자바 소스코드 작성
  2. 컴파일: 자바 소스코드를 JVM이 이해할 수 있는 바이트코드(.class 파일)로 언어변환
  3. 클래스 로딩: 클래스 로더(Class Loader)에 의해 바이트코드가 JVM 메모리 영역의 Method Area에 배치
  4. 메인 메서드 호출
  5. 프로그램 실행: 실행 엔진(Execution Engine)에 의해 바이트코드 실행

 

 

# JVM 메모리 영역 (Runtime Data Area)

출처: https://www.javatpoint.com/memory-management-in-java

 

JVM 메모리 영역은 스레드가 공유하는 영역인지 아닌지에 따라 나뉩니다.

 

  • Method, Heap:  스레드가 공유하는 영역
  • Stack, PC Register, Native Method Stack: 스레드가 공유할 수 없는 독립적인 영역

 

1. Method Area (=Static Area, Class Area)

Static Area, Class Area라고도 불리며, Class Loader가 로드한 모든 클래스의 metadata가 저장되는 공간.

클래스의 필드 정보, 메서드 정보, 타입 정보, 정적멤버(static 변수, 메서드), 상수 풀 등이 클래스 별로 저장됩니다.

 

2. Heap (가장 중요)

new 키워드로 생성된 인스턴스와 배열이 저장되는 동적 메모리 공간.

가비지 컬렉터가 메모리를 관리하는 영역이며, generation으로 나뉘어 객체가 저장됩니다.

 

해당 영역이 가득차게 되면 OutOfMemoryError가 발생하고, Method Area와 같이 스레드가 공유하는 영역이기 때문에 thread safe하지 않아서 동시성 이슈에 유의해야 합니다.

 

* Heap의 간략한 구조와 GC에 대해 알고 싶다면, 아래 글을 참고해주세요 !

 

[JAVA] JVM의 GC 동작 원리

GC 정의 GC가 삭제할 객체를 식별하는 방법 GC 동작 과정 (Mark And Sweep) GC 단점 및 STW Heap의 구조 GC는 언제 발생할까? GC란? 가비지 컬렉션(Garbage Collection)을 줄여서 GC라고 부른다. GC는 JVM의 Heap 영역

chunsubyeong.tistory.com

 

 

Heap과 Stack

3. Stack

메서드 안에서 사용되는 매개변수, 지역변수, 참조변수, 리턴 값 등이 임시로 저장되는 공간.

메서드 호출 시마다 새로운 스택 프레임이 생성되며, 메서드 수행이 끝나면 프레임 별로 삭제됩니다.

 

해당 영역이 가득차게 되면 StackOverFlowError가 발생하고,

PC register, Native Method Stack과 동일하게 각각의 thread가 독립적인 Stack Area를 가지므로, thread safe한 영역입니다.


4. PC register (Program Counter register)

스레드가 생성될 때마다 생성되는 공간.

 

현재 스레드가 실행되는 부분의 주소와 명령을 저장합니다. (해당 영역을 통해 context switching 가능)

스레드가 명령어를 실행할 때마다, 내부적으로 쌓이는 Counter를 저장합니다.

Ex)

  1. Young에서 Old generation으로 언제 promotion할지를 결정하는 객체의 age를 counter
  2. 인터프리터 형태에서 언제 JIT 컴파일러를 사용할 건지에 대한 counter


5. Native Method Stack

자바 이외의 언어(C, C++, 어셈블리 등)으로 작성된 네이티브 코드(기계어)를 실행할 때 사용되는 메모리 공간.

 

메모리 할당과 해제를 직접 해야하는 C, C++은 메모리를 세부적으로 control 하는데 용이합니다. 이런 코드들을 자바에 import 해서 사용하는 경우가 있고 이때 Native Method Stack 영역이 사용됩니다.