[Java] JVM과 Class Loader - 1

하비·2024년 9월 22일
0

Java

목록 보기
5/13

저번 포스팅에서는 JRE와 JDK, JVM을 간략하게 알아보았습니다.
이번에는 JVM을 자세히 알아봅시다!

JVM 왜 필요할까?

Java 프로그램이 실행될 때, 컴퓨터가 이해할 수 있는 기계어로 변환해야 한다. 하지만 운영체제마다 기계어가 다르기 때문에, Java 개발자들은 윈도우, 리눅스 등 각 운영체제에 맞는 바이트 코드를 따로 만들어야 할 수 있다. 이를 해결해 주는 것이 바로 JVM(Java Virtual Machine)이다.

JVM을 운영체제에 맞게 설치만 하면, 바이트 코드를 각 운영체제에 맞는 기계어로 변환해 프로그램을 실행할 수 있게 해준다. 즉, Java 코드를 한 번만 작성해서 컴파일하면 여러 운영체제에서 실행이 가능해진다. 운영체제에 맞는 JVM만 있으면 Java 프로그램은 별도의 수정 없이 다양한 플랫폼에서 동작할 수 있다.

추가적으로 JVM 덕분에 Java 외의 다른 언어들도 사용할 수 있다. 예를 들어, Kotlin으로 작성된 파일도 컴파일하면 바이트 코드로 변환되고, JVM이 이를 기계어로 변환해 실행할 수 있게 해준다. 덕분에 Kotlin 역시 Java처럼 JVM을 통해 다양한 운영체제에서 실행될 수 있는 것이다.

JVM의 이러한 특성 덕분에 Java는 플랫폼 독립적인 언어로 자리 잡았으며, Kotlin 등 다른 언어와도 쉽게 호환이 가능하다.

JVM의 내부 구조

JVM에는 Class Loader와 Runtime Data Area, Execution Engine이 있다.

Class Loader

Class Loader에서 바이트 코드들을 엮어서 Runtime Data Area에 로드, 링킹을 통해 배치한다.
클래스 파일의 로딩 순서는 다음과 같다.
Loading->Linking->Initialization

  • Loading(로드): 클래스 파일을 가져와서 JVM 메모리에 로드한다.
  • Linking(링킹): 클래스 파일을 사용하기 위해 검증하는 과정이다.
    • Verifying(검증): 읽어들인 클래스가 JVM 명세에 명시된 대로 구성되어 있는지 검사한다.
    • Preparing(준비): 클래스가 필요로 하는 메모리를 할당한다.
    • Resolving(분석): 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
  • Initialization(초기화): 클래스 변수들을 적절한 값으로 초기화한다. (static 필드들을 설정된 값으로 초기화 등)

왜 알아야 돼?

자바의 클래스들이 언제 어디서 메모리에 올라가고 클래스 멤버들이 초기화되는지, 원리를 알기 위해서는 클래스 로더의 진행 방식에 대해 알 필요가 있다.
특히 static 키워드가 붙고 안붙고의 유무에 따른 메모리 로드 차이와 쓰레드에 세이프하다는 등의 부분을 이해하기 위해서는 클래스 로더를 알 필요가 있다.

유의할 점

  • 클래스를 메모리에 올리는 Loading 기능은 한번에 메모리를 올리지 않고, 어플리케이션에서 필요한 경우 동적으로 메모리에 적재한다.
  • loadin, linking, initialization 이 3가지 과정이 거의 동시에 이루어져서 같이 묶어 생각하는데, 엄연히 클래스 로드와 초기화는 다른 작업이다.
  • 클래스나 클래스 내의 static 멤버들은 소스를 실행하자마자 한번에 메모리에 올라가는게 아니다. 클래스 내의 멤버를 호출하게 되면 그때서야 클래스가 동적으로 메모리에 로드된다.

다음 블로그 포스팅 때 Class Loader에 대해 더 자세히 알아보겠습니다.

profile
멋진 개발자가 될테야

0개의 댓글