이번 글에서는 간단하게 JVM이 무엇이고 어떻게 동작하는지 흐름만 체크할 수 있도록 글을 구성해보겠습니다.
전체적인 흐름을 이해하고 세부적으로 어떻게 동작하는지 체크해보면 이해도 더 잘되고 기억에 잘 남을거 같아서 이 글에서는 간단하게 흐름 위주로 작성했기에 가볍게 봐주시고 흐름을 익히시면 좋을 거 같습니다.
JVM이란?
- Java 바이트 코드로 컴파일 된 프로그램을 어떤 OS에서도 실행할 수 있게 해주는 가상 머신입니다.
즉 java 외에 Kotlin, Scala등 Java 바이트코드로 컴파일로 컴파일된 언어들도 JVM에서 실행이 가능하고 Window, Linux등 OS에 영향을 받지않고 어떤 환경에서도 실행이 가능해주도록 해주는 소프트웨어입니다.
코드가 실행되는 흐름
기본적인 흐름은 이렇습니다. Java로 만든 파일을 Java Complier를 통해서 Java Byte 코드로 컴파일을 합니다. 그럼 JVM이 프로그램을 실행 시킬 수 있는 준비가 되었습니다. 프로그램이 실행 되면 실행되는 코드의 class 데이터가 있는지 Runtime Data Area(메모리)에서 찾습니다. 정보가 메모리에 데이터가 없으면 Class Loader에서 해당 데이터를 읽어와서 메모리에 저장을 시킵니다. 해당 데이터가 메모리에 저장이되면 Interpreter가 해당 데이터를 한줄 한줄 읽어서 실행을 하게됩니다.
JIT compolier는 Interpreter가 반복적으로 실행하는 코드를 발견하면 그 코드를 바이너리 코드로 저장을 해놓고 있고 인터프리터는 반복적인 코드를 실행할때 JIT complier에 저장된 바이너리 코드를 바로 사용하게 된다.
Natitive Method Interface(JNI)는 Class Loader가 클래스 데이터를 읽어올때 Java파일로 만들어진 코드 외에 C / C++로 만들어진 코드를 읽어와서 메모리에 특정 부분에 저장하게 되면 JNI를 통해서 Native Method Library를 실행하게 된다. 즉 Java에서 C / C++로 만들어진 코드를 실행할 수 있도록 도와주는 프레임워크이다.
구성 요소 별 기능 요약
1.클래스 로더 시스템
- 바이트 코드를 읽어와서 메모리에 저장하는 시스템이다.
(1) 로딩(loading) - 클래스를 탐색하고 적절한 바이너리 데이터를 만들고 메모리에 저장한다.
(2) 링크(linking) - 클래스 파일 형식이 유효한지 검사, 변수에 대한 메모리 할당과 심볼릭 레퍼런스를 메모리에 있는 실제 레퍼런스로 교 체한다.
(3) 초기화(initialization) - static 변수에 값들을 초기화 및 변수에 값들이 할당된다.
2. 메모리
- 실행에 필요한 자원을 저장해놓은 저장소입니다.
- 메모리에는 5가지 자원이 있는데 크게 두가지로 분류해서 메모리에 구조를 알아두면 좋을 거 같습니다.
(1) 쓰레드 자원 : stack, PC registers, native method stack
- 쓰레드 자원은 각 쓰레드마다 각자의 자원입니다.
(2) 공유 자원: heap, method
3. 실행 엔진
-(1) interpreter : 바이트 코드를 한줄 한줄 바이너리 데이로 변환한다.
-(2) JIT complier : interpreter가 한줄한줄 실행하면서 반복되는 부분을 저장해 놓고 반복되는 부분을 빠르게 실행하도록 도와준다.
-(3) Garbage Collactor : 더이상 참조되지 않는 객체를 정리해준다.
4. JNI (Java Native Interface)
- 자바 어플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있도록 도와주는 기능이다.
5. Native Method library
- C, C++로 작성 된 라이브러리
마무리
이렇게 간략하게 나마 JVM의 구성 요소들과 Java 코드가 실행 될 때 JVM에서 어떻게 동작하는지 설명을 해보았습니다.
다음에는 각 구성 요소들에 대해서 지금보다는 조금 더 자세히 알아 보는 글을 작성해 보도록 하겠습니다.
'JVM' 카테고리의 다른 글
실행 엔진 (0) | 2024.04.23 |
---|---|
JVM 메모리 구조 (0) | 2024.03.13 |
Class Loader (0) | 2024.03.13 |