JVM과 자바의 구동방식

Soobin Kim·2024년 3월 29일

Java

목록 보기
17/47

자바 코드는 플랫폼 독립적인 바이트코드로 컴파일되어, 
어떤 운영 체제에서도 실행될 수 있도록 설계되어 있는데 이는 JVM으로 가능한 것!

자바의 구동방식

  1. 컴파일 단계
  • 자바 소스 파일(.java)이 javac 컴파일러에 의해 컴파일됨.
  • 이 과정에서 소스 코드는 바이트 코드로 변환되며, 실행 가능한 파일인 .class 파일이 생성.
  1. 실행 단계
    예: java.exe HelloWorld
  • run 즉 실행하는 순간 내부적으로 java.exe가 실행됨
    • java.exe에 의해서 내부적으로 RPC(원격프로세서호출)가 JVM라는 프로세서를 호출함.
    • JVM은 내부적으로 Class Loader를 사용하여 .class 파일(바이트 코드)을 메모리에 로딩. 그 후, 실행 엔진(Execution Engine)이 바이트 코드를 운영체제에 맞게 해석하고 실행.
  • JVM의 메모리 사용
    • JVM의 메모리 사용은 크게 4개의 영역으로 나뉨
    • 힙(Heap), 스택(Stack), 메소드 영역(Method Area), 프로그램 카운터(Program Counter) 등은 각각 프로그램 실행에 필요한 클래스 인스턴스, 메소드 호출 정보, 클래스 정보, 현재 실행 중인 JVM 명령어의 주소 등을 저장함.

.class, .exe

  • class 파일: 자바 소스 코드(.java 파일)가 컴파일러에 의해 컴파일된 후 생성되는 파일로서 플랫폼 독립적인 bytecode가 포함되어 있음.
    • bytecode는 JVM이 이해할 수 있는 중간 언어로, 어떤 OS에서 실행할지 모르는 상태므로 .exe코드로 생성하지 않고 .class파일로 생성하여 JVM이 해석할 수 있도록 함.
    • 따라서 bytecode는 자바 프로그램이 다양한 운영 체제에서 실행될 수 있는 이식성을 가짐.

  • exe 파일: 실행 가능한 파일 형식으로, 운영 체제가 직접 이해하고 실행할 수 있도록 컴파일된 프로그램(운영 체제에 종속적. 다른 운영 체제에서는 실행할 수 없음)

JVM(Java Virtual Machine)

  • 자바 프로그램을 구동해주는 프로세서(엔진)
  • JRE(실행환경) 안에 포함된 JVM이 포함되어 있음.
  • java.exe는 JVM을 호출하는 명령어라고 볼 수 있음.

<역할>

  • 바이트코드를 운영 체제가 이해할 수 있는 기계어로 변환(인터프리트 또는 JIT 컴파일)하여 실행
  • 플랫폼 독립성 JVM 덕분에 자바는 "한 번 작성하면, 어디서든 실행된다(Write Once, Run Anywhere)"는 특징을 가지며 JVM은 운영 체제와 자바 프로그램 사이에서 중개자 역할을 함.
  • 메모리 관리 : JVM은 자동으로 메모리를 관리해줌.
  • 그 외 스레드 관리, 가비지 컬렉션 등의 기능을 제공하며 자바 프로그램의 실행을 지원.

JVM의 구성요소

  • Class Loader: JVM이 프로그램을 실행할 때 필요한 클래스(.class 파일)를 메모리로 로드하는 역할. 구체적으로 클래스 로더는 클래스 파일을 읽고 이를 JVM이 이해할 수 있는 형태로 변환하여 메모리에 로드하게 된다.
  • 실행 엔진(Execution Engine): 바이트 코드를 실제로 실행할 수 있도록 해석하거나 컴파일하는 역할. JIT 컴파일러가 이에 해당.
  • 메모리(Runtime Data Area): 프로그램 실행 중에 사용되는 다양한 데이터를 저장하는 공간으로, 힙(Heap), 스택(Stack), 메소드 영역(Method Area), 프로그램 카운터(Program Counter) 등이 포함.

JVM의 메모리 로딩 및 관리

메모리 로딩

클래스 로딩 JVM에서 프로그램을 실행하기 위해 .class 파일을 메모리에 로드하는 과정으로, 클래스 로더(class loader)가 .class 파일을 찾아 JVM의 메모리에 올리는 것을 의미.

동적 클래스 로딩 필요한 시점에 클래스 파일을 동적으로 메모리에 로드하는 기술로 프로그램의 실행 속도와 메모리 사용 효율을 높이는 데 도움

메모리 관리

메모리 영역(Runtime Data Areas) JVM은 메모리를 여러 영역으로 나누어 관리하며 이에는 힙(heap), 스택(stack), 메소드 영역(method area), 프로그램 카운터(program counter) 등이 포함

가비지 컬렉션(Garbage Collection, GC) 더 이상 사용되지 않는 객체를 자동으로 검출하고 제거하는 가비지 컬렉션을 수행하여 메모리를 효율적으로 관리

프로그램 실행과 메모리 로딩

0개의 댓글