참고 자료
https://www.geeksforgeeks.org/jvm-works-jvm-architecture/
How JVM Works - JVM Architecture? - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
https://tecoble.techcourse.co.kr/post/2021-07-15-jvm-classloader/
JVM에 관하여 - Part 2, ClassLoader
Java 로 작성한 코드는 어떻게 돌아가는 걸까? 해당 물음에 답을 찾기 위한 JVM 시리즈 2편, JVM 의 구성 요소 중 ClassLoader 에 관한 글입니다. 이번 글에서는 ClassLoader…
tecoble.techcourse.co.kr
JVM이란 Java 응용 프로그램을 실행하는 런타임 엔진 역할을 합니다. JVM에서 실제로 자바 코드상에 존재하는 main() 메서드를 호출하며, JRE(Java Runtime Environment)의 일부입니다.
Java 어플리케이션은 한 시스템에서 Java 코드를 작성하더라도 변경 없이 다른 Java를 지원하는 시스템에서 실행할 수 있는 성질이 있는데, JVM을 사용하기 때문입니다.
JVM의 동작 과정
Java 파일을 컴파일할 때, .java 파일에 있는 동일한 클래스 이름을 가진 클래스 파일이 컴파일러에 의해 생성됩니다. class 파일은 실행할 때 다양한 단계를 거치는데, 이 단계들이 바로 전체 JVM의 동작 과정입니다.
Class Loader
주로 세가지 역할을 담당합니다.
- Loading
- Linking
- Initialization
Loading
- ClassLoader가 필요한 클래스들을 불러와서 적재시키는 과정입니다.
Initialization
초기화 단계에서 모든 정적 변수는 코드 및 정적 블록(있는 경우)에 정의된 값으로 할당됩니다. 클래스 내부에서 위에서 아래로, 클래스 계층에서 부모에서 자식으로 실행됩니다. 일반적으로 세개의 클래스 로더가 존재합니다.
클래스를 불러올 때, Bootstrap Class Loader에서 찾을 수 없다면 Extension ClassLoader, Extension ClassLoader에서 찾을수 없으면 Application ClassLoader을 찾아 보고, 최종적으로 없다면 ClassNotFoundException이 발생합니다.
Class Loader의 종류
- Bootstrap Class loader
- JAVA_HOME/jre/lib 디렉토리에 존재하는 핵심 자바 API 클래스를 로드합니다.
- Extension Class loader
- 확장 디렉토리(JAVA_HOME/jre/lib/ext) 또는 기타 디렉토리(java.ext.dirs 시스템 속성에 의해 지정)에 있는 클래스들을 로드합니다.
- ExtClassLoader 클래스에 의해 구현됩니다.
- System/Application class loader
- Extension Class loader의 자식입니다.
- 애플리케이션 클래스 경로에서 클래스를 불러오는 역할을 합니다. 즉, 개발자들이 작성한 클래스 파일이 불러와 집니다.
- 내부적으로 java.class.path에 매핑된 환경 변수를 사용하며, AppClassLoader 클래스에 의해 구현됩니다.
Linking
Linking 과정에서는 verification(검증), preparation(준비), (optionally) resolution(해결)을 수행합니다.
verification(검증)
- 클래스 파일(.class)의 정확성을 보장합니다.
- 파일이 올바른 형식으로 지정되고 유효한 컴파일러에 의해 생성되었는지 여부를 확인합니다.
- 실패하는 경우 예외(java.lang.VerifyError)이 발생합니다. ByteCodeVerifier에 의해 작업이 수행되며, 완료되면 클래스 파일을 컴파일 할 준비가 되어있는 상태입니다.
preparation(준비)
JVM에서 클래스 정적 변수(Static)에 대한 메모리를 할당하고, 메모리를 기본 값으로 초기화합니다.
resolution(분석)
- 타입의 Symbolic Referrence를 direct references로 바꾸는 작업입니다.
- 대표적인 예시로는 new나 instaceof가 있습니다.
Initialization
- Linking 이후, 클래스 파일의 코드를 읽는 과정입니다.
- 자바 코드에서의 class와 interface 값들을 지정한 값으로 초기화하거나 초기화 메서드를 실행시켜 줍니다.
JVM 메모리
- 메서드 영역
- 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메서드에 대한 정보, Static 변수, 메서드의 바이트 코드 등을 보관
- JVM당 하나의 메서드 영역만 존재하며, 공유 자원입니다.
- Java 8부터는 정적 변수가 힙 영역에 저장
- 런타임 상수 풀(Runtime Constant Pool)이 존재합니다.
- 각 클래스와 인터페이스의 상수 뿐 아니라 메서드와 필드에 대한 모든 레퍼런스까지 담고 있는 테이블
- 어떤 메서드나 필드를 참조할 때, JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조
- 힙 영역
- 모든 객체의 정보 저장
- JVM당 하나의 힙 영역이 있습니다.
- 공유 리소스입니다.
- 스택 영역
- 모든 스레드에 대해 JVM은 하나의 런타임 스택을 생성합니다. 스택 내의 모든 블록을 메서드 호출을 저장하는 활성화 레코드 또는 스택 프레임이라고 합니다.
- 해당 메서드의 모든 지역 변수는 해당 프레임에 저장
- 스레드가 종료된 후 런타임 스택은 JVM에 의해 파괴
- 공유 리소스가 아닙니다.
- PC 레지스터
- 스레드의 현재 실행 명령의 주소를 저장합니다.
- 각 스레드에는 별도의 PC 레지스터가 존재합니다.
- 네이티브 메서드 스택
- 모든 스레드에 대해 별도의 네이티브 스택이 생성됩니다.
- 기본 메서드 정보를 저장합니다.
실행 엔진
실행 엔진은 .class 파일을 실행합니다. 바이트 코드를 한 줄씩 읽고, 다양한 메모리 영역에 있는 데이터와 정보를 사용하고 명령을 실행합니다. 컴파일러를 통해 바이트 코드로 변경되고, JIT 컴파일러를 거쳐 Native Code가 됩니다.
- Interpreter
- 바이트코드 명령어를 한 줄씩 해석하여 실행합니다.
- 하나의 메서드를 여러번 호출할 때 매번 해석이 필요하다는 단점이 있습니다.
- Just-In-Time Compiler(JIT)
- 인터프리터의 효율성을 높이기 위해 사용
- 전체 바이트 코드를 컴파일하여 네이티브 코드로 변경하여 인터프리터가 반복되는 메서드 호출을 볼 때마다 JIT에서 해당 부분에 대한 직접 네이티브 코드를 제공하므로 재해석이 필요하지 않아 효율 향상이 됩니다.
- Garbage Collector
- 참조되지 않은 객체를 삭제합니다.
자바 네이티브 인터페이스(JNI)
Native Method Libraries와 연동하여 실행에 필요한 Native Library를 제공하는 인터페이스입니다. JVM이 C/C++ 라이브러리를 호출하고 하드웨어에 특정한 C/C++ 라이브러리에 의해 호출될 수 있도록 합니다.
네이티브 메소드 라이브러리
- Execution Engine에 필요한 Native Libraries의 모음입니다.
참고
https://steady-snail.tistory.com/67
[JAVA] JVM 동작원리 및 기본개념
JAVA라는 언어를 통해 코딩을 하고 있는 사람으로서 JAVA의 간단한 탄생배경 그리고 JAVA의 시작과 끝이라고 할 수 있는 JVM을 한 번 짚고넘어가려고 해요 우선 JAVA의 탄생배경을 좀 알고가면 이해하
steady-snail.tistory.com
https://d2.naver.com/helloworld/1230
'Language > Java' 카테고리의 다른 글
Collection 얕게 알아보기 (1) (0) | 2022.11.08 |
---|---|
Final 키워드만 써도 성능 향상이 된다고? (2) | 2022.10.31 |
lambda 예외 핸들링 (0) | 2022.10.02 |
[ Junit ] 랜덤 데이터 테스트 (0) | 2022.02.10 |
[ Junit ] 테스트 작성 (0) | 2022.02.10 |