[Java] JVM 동작 과정

 백엔드 개발을 주로 하는 나로써는 매일 자바 언어를 마주친다. 그런데 어느날 문득 이런 생각이 들었다. 자바로 작성된 코드는 어떻게 실행되는거지? 그 안에 어떤 과정이 있는거지?🤔 해당 의문을 해결하고자 JVM 동작 과정을 샅샅히 파헤쳐보기로 했다.

 

1. JVM이란?

(1) 정의

JVM은 Java Virtual Machine의 약자로 Java로 작성된 프로그램이 어느 기기나 운영체제 상에서도 실행될 수 있도록 한다.

 

(2) 실행 과정

 

 

1) 자바 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당 받는다.

2) 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트 코드(.class)로 변환시킨다.

3) 변경된 .class 파일들을 클래스 로더를 통해 JVM 메모리 영역(Runtime Data Area)로 로딩한다.

4) JVM 메모리 영역에 로딩된  .class 파일들은 Execution Engine을 통해 해석된다.

5) 이 과정에서 Execution Engine에 의해 Garbage Collector의 작동과 Thread 동기화가 이루어진다.

 

 

2. 자바 컴파일러

자바 소스코드(.java)를 바이트코드(.class)로 변환한다.

 

3. 클래스 로더

JVM은 런타임 시에 처음으로 클래스를 참조할 때 해당 클래스를 로드하고 메모리 영역에 배치시킨다. 이 동적 로드를 담당하는 부분이 바로 클래스 로더이다.

 

 

4. JVM 메모리 영역(Runtime Data Area)

JVM이 OS로부터 할당받은 메모리는 여러 영역으로 나뉜다. PC 레지스터, JVM 스택, 네이미트 메서드 스택, 힙 영역, 메서드 영역으로 분류된다.

 

 

  • PC Register : Thread가 어떤 명령어로 실행되어야 할지 기록하는 부분(JVM 명령의 주소를 가짐)
  • JVM Stack : 지역 변수, 매개변수, 메서드 정보, 임시 데이터 등을 저장
  • Native Method Stack : 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
  • Heap Area : 런타임에 동적으로 할당되는 데이터가 저장되는 영역. 객체나 배열 생성이 여기에 해당함(힙에 할당된 데이터들은 가비지컬렉터의 대상이 됨. JVM 성능 이슈에서 가장 많이 언급되는 공간임)
  • Method Area : JVM이 시작될 때 생성되고, JVM이 읽은 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드 메서드 코드, 정적 변수, 메서드의 바이트 코드 등을 보관함

 

5. Execution Engine

JVM 메모리에 로딩된 바이트코드는 실행 엔진에서 처리된다. 자바 바이트 코드는 기계가 바로 수행할 수 있는 언어보다 가상머신이 이해할 수 있는 중간 레벨로 컴파일 된 코드이다. 그래서 실행 엔진은 이와 같은 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경해준다.

 

이 수행 과정에서 실행 엔진은 인터프리터와 JIT 컴파일러, 두 가지 방식을 혼합하여 바이트 코드를 실행한다.

6. 인터프리터

바이트코드를 한 줄씩 읽어 기계어로 변환해 실행한다. 다만 같은 메서드라도 여러 번 호출이 된다면 매번 해석하고 수행해야해서 전체적인 속도가 느리다는 단점이 있다.

 

 

7. JIT(just-in-time) 컴파일러

자주 실행되는 코드를 네이티브 코드로 컴파일하여 실행 속도를 높인다.

 

 

8. Garbage Collector

JVM은 가비지 컬렉터를 이용해 앞서 살펴보았던 Heap 영역에서 더이상 사용하지 않는 메모리를 자동으로 회수해준다. C언어 같은 경우 직접 개발자가 메모리를 해제해줘야 하지만, Java는 이 가비지 컬렉터를 이용해 자동으로 메모리를 실시간 최적화 시켜준다. 따라서 개발자가 따로 메모리를 관리하지 않아도 되므로, 더욱 손쉽게 프로그래밍을 할 수 있도록 해준다.

 

일반적으로 자동으로 실행되지만, 가비지 컬렉터가 실행되는 시간은 정해져 있지 않다. 특히 Full GC(Garbage Collector)가 발생하는 경우, GC를 제외한 모든 스레드가 중지되기 때문에 장애가 발생할 수 있다.

 

 

참고 자료

https://inpa.tistory.com/entry/JAVA-%E2%98%95-JVM-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD-%EC%8B%AC%ED%99%94%ED%8E%B8

 

☕ JVM 내부 구조 & 메모리 영역 💯 총정리

저번 포스팅에서는 JRE / JDK / JVM에 대해서 간략하게 알아보는 시간을 가졌다면, 이번 포스팅에서는 JVM의 내부 구조에 대해 좀 더 자세하게 알아보도록 할 예정이다. JVM(자바 가상 머신)은 자바 언

inpa.tistory.com

 

https://gyoogle.dev/blog/computer-language/Java/Java%20Virtual%20Machine.html

 

[Java] 자바 가상 머신(Java Virtual Machine) | 👨🏻‍💻 Tech Interview

[Java] 자바 가상 머신(Java Virtual Machine) 시스템 메모리를 관리하면서, 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경을 제공함 JVM은, 다른 프로그램을 실행시키는 것이 목적이다. 갖춘 기

gyoogle.dev

 

https://tecoble.techcourse.co.kr/post/2021-07-12-jvm-jre-jdk/

 

JVM에 관하여 - Part 1, JVM, JRE, JDK

자바로 작성된 코드는 어떻게 돌아가는 걸까? 해당 물음에 답을 찾기 위한 JVM 시리즈 1편, JVM, JRE, JDK에 관한 글입니다. 이번 글에서는 배포 환경 혹은 개발 환경을 세팅하면서 설치를 하였던 JRE

tecoble.techcourse.co.kr

 

'Language > Java' 카테고리의 다른 글

[Java] enum  (0) 2023.11.10
[Java] Stream  (4) 2023.11.09
[Java] 일급 컬렉션  (2) 2023.10.26