참고 자료

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의 동작 과정입니다.

 

전체 JVM 구조

 

Class Loader


주로 세가지 역할을 담당합니다.

  1. Loading
  2. Linking
  3. Initialization

Loading

  • ClassLoader가 필요한 클래스들을 불러와서 적재시키는 과정입니다.

Initialization

초기화 단계에서 모든 정적 변수는 코드 및 정적 블록(있는 경우)에 정의된 값으로 할당됩니다. 클래스 내부에서 위에서 아래로, 클래스 계층에서 부모에서 자식으로 실행됩니다. 일반적으로 세개의 클래스 로더가 존재합니다.

클래스 불러오는 과정

클래스를 불러올 때, Bootstrap Class Loader에서 찾을 수 없다면 Extension ClassLoader, Extension ClassLoader에서 찾을수 없으면 Application ClassLoader을 찾아 보고, 최종적으로 없다면 ClassNotFoundException이 발생합니다.

Class Loader의 종류

  1. Bootstrap Class loader
    • JAVA_HOME/jre/lib 디렉토리에 존재하는 핵심 자바 API 클래스를 로드합니다.
  2. Extension Class loader
    • 확장 디렉토리(JAVA_HOME/jre/lib/ext) 또는 기타 디렉토리(java.ext.dirs 시스템 속성에 의해 지정)에 있는 클래스들을 로드합니다.
    • ExtClassLoader 클래스에 의해 구현됩니다.
  3. 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 메모리

  1. 메서드 영역
    • 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메서드에 대한 정보, Static 변수, 메서드의 바이트 코드 등을 보관
    • JVM당 하나의 메서드 영역만 존재하며, 공유 자원입니다.
    • Java 8부터는 정적 변수가 힙 영역에 저장
    • 런타임 상수 풀(Runtime Constant Pool)이 존재합니다. 
      • 각 클래스와 인터페이스의 상수 뿐 아니라 메서드와 필드에 대한 모든 레퍼런스까지 담고 있는 테이블
      • 어떤 메서드나 필드를 참조할 때, JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조
  1. 힙 영역
    • 모든 객체의 정보 저장
    • JVM당 하나의 힙 영역이 있습니다.
    • 공유 리소스입니다.
  2. 스택 영역
    • 모든 스레드에 대해 JVM은 하나의 런타임 스택을 생성합니다. 스택 내의 모든 블록을 메서드 호출을 저장하는 활성화 레코드 또는 스택 프레임이라고 합니다.
    • 해당 메서드의 모든 지역 변수는 해당 프레임에 저장
    • 스레드가 종료된 후 런타임 스택은 JVM에 의해 파괴
    • 공유 리소스가 아닙니다.
  3. PC 레지스터
    • 스레드의 현재 실행 명령의 주소를 저장합니다.
    • 각 스레드에는 별도의 PC 레지스터가 존재합니다.
  4. 네이티브 메서드 스택
    • 모든 스레드에 대해 별도의 네이티브 스택이 생성됩니다.
    • 기본 메서드 정보를 저장합니다.

 

실행 엔진

실행 엔진은 .class 파일을 실행합니다. 바이트 코드를 한 줄씩 읽고, 다양한 메모리 영역에 있는 데이터와 정보를 사용하고 명령을 실행합니다. 컴파일러를 통해 바이트 코드로 변경되고, JIT 컴파일러를 거쳐 Native Code가 됩니다.

  1. Interpreter
    • 바이트코드 명령어를 한 줄씩 해석하여 실행합니다.
    • 하나의 메서드를 여러번 호출할 때 매번 해석이 필요하다는 단점이 있습니다.
  2. Just-In-Time Compiler(JIT)
    • 인터프리터의 효율성을 높이기 위해 사용
    • 전체 바이트 코드를 컴파일하여 네이티브 코드로 변경하여 인터프리터가 반복되는 메서드 호출을 볼 때마다 JIT에서 해당 부분에 대한 직접 네이티브 코드를 제공하므로 재해석이 필요하지 않아 효율 향상이 됩니다.
  3. 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

+ Recent posts