Yebali

[JAVA] JVM의 구조 본문

Backend Common

[JAVA] JVM의 구조

예발이 2022. 9. 25. 17:15

JVM의 구조는 크게 아래 4가지로 나뉜다.

  • Garbage Collector
  • Execution Engine
  • Class Loader
  • Runtime Date Area

자바 소스 파일(.java)은 자바 컴파일러(javac)에 의해 바이트 코드(.class)로 변환되고 이 클래스 파일들은 클래스 로더가 읽어 들이면서 JVM이 실행된다.

 

Class Loader

JVM으로 클래스 파일(.class)파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다. 런타임 시 동적으로 클래스를 로드한다.

아래 5가지 동작을 수행한다.

  • 로드 : 클래스 파일(.class)을 가져와 JVM의 메모리에 로드한다.
  • 검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사한다.
  • 준비 : 클래스가 필요로 하는 메모리를 할당한다.
  • 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
  • 초기화 : 클래스 변수들을 적절한 값으로 초기화한다.(static 필드)

Execution Engine

클래스 로더를 통해 JVM내 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어 실행한다.

최초의 JVM은 인터프리터 방식이었기 때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완했다.

  • 인터프리터(interpreter) : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다.
    하나하나의 실행 속도는 빠르나 전체적인 실행 속도가 느리다.
  • JIT 컴파일러(Just In Time Compiler) : 인터프리터의 단점을 보완하기 위한 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고, 이후 인터프리팅 하지 않고 바이너리 코드를 직접 실행하는 방식이다. 전체적인 실행 속도는 인터프리터보다 빠르다.

하지만 JIT 컴파일러 방식 역시 바이너리 코드로 바꾸는 비용이 발생하기 때문에 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고 인터프리터 방식을 사용하다가 일정한 기준을 넘어가면 JIT 컴파일러 방식을 사용한다.

Garbage Collector

Garvage Collector(GC)는 Heap 메모리 영역에 생성된 객체들 중 참조되지 않는 객체들을 찾아 메모리에서 제거하는 역할을 한다.

 

Runtime Data Area

JVM의 메모리 영역으로 JAVA 애플리케이션이 실행될때 사용하는 데이터들이 적재되는 영역이다.

크게 아래 5가지로 나뉜다.

  • Method Area
  • Heap Area
  • Stack Area
  • PC register
  • Native Method Stack

JVM의 RunTime Date Area 구조

Method Area(Class Area)

모든 쓰레드가 공유하는 메모리 영역이다.

메서드 영역에는 클래스, 인터페이스, 메서드, 필드, Static 변수 등의 바이트 코드들이 로드된다

Heap Area

모든 쓰레드가 공유하는 메모리 영역이다.

new 키워드로 생성된 객체와 배열이 생성되어 적재되는 메모리 영역이다.

Method Area에 로드된 클래스만 생성이 가능하다.

해당 영역에 적재된 데이터는 메서드 호출이 끝나도 사라지지 않고 유지되었다가 Galbage Collector에 의해 더이상 참조되지 않을 때 메모리에서 제거된다.

 

Stack Area

메서드 호출시마다 각각의 스택 프레임이 저장된다

지역변수와 매개변수(parameter)가 저장된다. 메서드 호출이 끝나면 그 메서드를 위해 준비된 모든 변수가 스택에서 제거된다.

PC register

쓰레드가 시작될 때 생성되며, 스레드마다 하나씩 존재하며 스레드가 어떤 부분을 무슨 명령으로 실행할지에 대한 기록을 보관하는 부분이다. 현재 수행 중인 JVM명령의 주소를 갖는다.

Native Method Stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.

 

 

참고

https://steady-coding.tistory.com/305

'Backend Common' 카테고리의 다른 글

Time zone과 표준시  (0) 2022.11.27
[WebSocket] WebSocket이란?  (0) 2022.09.27
[JAVA] Garbage Collection의 개념과 동작  (0) 2022.09.25
[Java] Java 컴파일과 실행 순서  (1) 2022.09.25
쿠키, 세션 그리고 토큰  (0) 2022.01.21