JAVA - JVM (자바 가상 머신)

목차

JVM (자바 가상 머신)

자바 컴파일러에 의해 생성된 자바 바이트 코드(.class) 를 OS에 맞는 기계어로 변환해 실행할 수 있게 해준다.
클래스 파일로 떨어질 수 있으면 어떤 언어라도 실행이 가능하다. (ex. kotlin)

C Compile 과정

Java Complie 과정

  • 자바 컴파일러에 의해 생성된 바이트 코드를 실행하는 표준이자 구현체다.
  • JVM은 각 OS(운영체제) 에 맞게 설계가 돼 있다.
  • 자바 바이트 코드만 있으면 JVM을 이용해 어느 운영체제에서나 실행이 가능하다.
  • Stack 기반 가상 머신

JVM 구조

Class Loader, Memory, 실행 엔진(Execution Engine) 이 세가지로 구성 돼 있다.

Class Loader

클래스 파일에서 바이트 코드 를 읽고 메모리 에 저장한다.
로딩, 링크, 초기화 세가지 과정을 거친다.

  • 로딩
    • 클래스로더가 클래스 파일을 읽고 Binary 데이터 를 생성한 뒤 Method 영역 에 저장한다.
    • 로딩이 끝나면 해당 클래스 타입의 객체 를 생성한 후 Heap 영역에 저장한다.
  • 링크
    • verify : 클래스 파일 이 유효한지 확인한다. 바이트 코드가 조작됐을 경우 에러를 발생
    • Prepare : 메모리 준비과정
    • Resolve : 객체들을 실제 레퍼런스에 연결한다.
  • 초기화
    • static 값을 초기화 하고 변수를 할당하는 과정

클래스 로더 종류

  • 부트 스트랩 클래스 로더
    • JAVA_HOME/jre/lib 디렉터리에 위치한 핵심 자바 라이브러리들을 불러들인다
  • 확장 클래스 로더
    • JAVA_HOME/jre/lib/ext 또는 java.ext.dirs 시스템 변수에 위치해 있는 라이브러리들을 읽어들인다.
  • 애플리케이션 클래스 로더
    • 애플리케이션 클래스패스(애플리케이션 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽는다.

메모리

  • 스택 영역
    • 각 Thread마다 스택 영역이 존재한다.
    • 프로그램 실행과정에서 일시적으로 할당받고 소멸하는 영역
    • 메서드 호출시 Stack Frame이 생성되며 메서드 정보, 지역변수들을 저장한다.
    • 메서드가 종료되면 삭제된다.
  • PC(Program Counter)
    • 쓰레드 마다 다음 실행해야 할 명령어 정보가 저장 된다.
  • Native method stack
    • 바이트 코드가 아닌 기계어로 작성된 프로그램이 저장되는 영역
  • 힙 영역
    • 모든 인스턴스 객체(Object)가 저장되는 영역
    • JVM에 하나 밖에 없는 공유 자원 이다.
  • 메소드 영역
    • 클래스 수준의 정보 (클래스 이름, 부모 클래스 이름, 메소드, 변수등)가 저장 되고, 공유되는 영역이다.
    • 모든 JVM 스레드에서 공유하는 메모리 영역

실행엔진

  • 인터프리터
    • 바이트 코드를 한줄 한줄 실행한다.
  • JIT(Just In Time) 컴파일러
    • 인터프리터 방식의 단점을 보완하기 위해 도입된 컴파일러
    • 바이트 코드를 네이티브 코드로 컴파일 해준다.
    • 일정 수준 이상으로 실행되는 코드가 존재할 때 해당 바이트 코드를 컴파일 한다.(Caching)
    • 컴파일 한 결과물은 JVM 내 CodeCache 에 저장 된다.
  • GC(Gabage Collection)
    • 참조되지 않는 객체를 정리한다.

JVM Default Heap Size 확인

java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|MetaspaceSize|version'

Share