JVM이란?

엄진환·2021년 8월 31일
0
post-thumbnail

JVM(Java Virtual Machine)

Java 바이트코드를 클래스 로더를 통해서 읽어들여서 자바 API와 함께 실행해주는 가상 머신입니다.

Java Compiler

  • .java 코드 파일을 .class(바이트 코드)로 만들어 주는 역할을 합니다.
  • javac 명령으로 .java > .class로 소스코드를 바이너리로 변환합니다.

Class Loader

  • 로딩(loading)
    • Bootstrap : jre의 lib폴더에 있는 rt.jar 파일을 뒤져 기본 자바 API 라이브러리를 로드합니다. 가장 최우선으로 로드됩니다.
    • Extension : jre의 lib 폴더에 있는 ext 폴더에 있는 모든 확장 코어 클래스파일들을 로드합니다. Extension 클래스 로더는 jdk 확장 디렉토리(JAVA_HOME/lib/ext 디렉토리 혹은 java.ext.dirs 에 저장된 경로)에서 로드됩니다.
    • Application : 사용자가 직접 정의한 클래스파일들을 로드합니다. Classpath 환경변수에 있는 클래스 파일이나 -classpath 또는 -cp 명령어 옵션이 있는 파일들을 로드합니다.
  • 연결(linking)
    • 검증 (verify) : 바이트코드 검증기는 생성된 자바 바이트코드가 적절한지 아닌지에 대해서 검증하며 검증이 실패할 경우 검증오류를 내보내게 됩니다.
    • 준비 (prepare) : 모든 정적변수의 메모리가 할당되며 기본 default 값으로 할당됩니다.(아직 초기화되지는 않음)
    • 해석 (resolve) : 모든 심볼릭한(명확하게 정의되지 않은) 메모리 참조를 메소드 영역에 있는 타입으로 직접 참조합니다.
  • 초기화(initialization)
    • 자바 코드에 명시된 값으로 초기화합니다. 이후 정적 블록(static block)을 순서대로 실행합니다.

Interpreter vs JIT Complier

바이트 코드 해석 방식

  • 미리 정의된 JVM 명령어를 기계 명령어로 매핑으로 조회 후 변환합니다.

Interpreter

  • 바이트 코드를 한줄씩 실행하면서 변환하므로 느립니다.

JIT Complier(Just In Time)

  • Interpreter의 속도가 느린 단점은 보완하기 위해 도입되었습니다.
  • 파일 단위로 바이트 코드를 기계어로 변환합니다.
  • 부분적으로 Interpreter 방식을 사용하여 기계어 코드 생성 시 캐시에 기계어와 바이트 코드를 매핑하여 다시 해석하지 않기 때문에 컴파일 시간이 단축됩니다.

참고 자료

알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC
JVM 메모리 구조 및 아키텍쳐(클래스 로더, 실행엔진 등)
바이트코드와 바이너리 코드의 차이는 무엇일까?
jit-vs-interpreters stackoverflow
[java] JIT 컴파일러란?

profile
개발 공부 블로그

0개의 댓글