JVM 이해하기

JVM 이해하기

해당 정리는 강의 제작자이신 백기선님의 문서를 참고해서 작성 추가로 본인이 과거에 정리했었던 자바정리도 참고

JVM, JRE, JDK 무엇인가

JVM(Java Virtual Machine)

  • 자바 가상 머신으로 자바 바이트 코드를 OS에 맞춰서 변환해주는 방식을 가지고 있다

  • 바이트 코드를 실행하는 표준이고, 구현체이다

  • JVM은 다양한 회사들에서 만들어서 배포하고 있는데, 그래서 이름이 붙어서 나오곤 한다 -> Azul, Amazon 등

#### JRE(Java Runtime Environment) - 자바 애플리케이션을 실행할 수 있도록 구성된 배포판 - JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있음 - 자바 버전 11 이후부터는 더 이상 제공하지 않고 있는 상황 #### JDK(Java Development Kit) - JRE와 개발하는데 필요한 다양한 툴을 제공 - OS에 국한되지 않고 플랫폼에 독립적으로 구성되어있음

img.png

JVM의 구조

크게 클래스 로더 시스템, 메모리, 실행 엔진 그리고 네이티브 메소드 공간으로 4 가지로 나누어져 있다 방식은 클래스 로더가 코드를 읽고 메모리의 각 위치에 맞는 값들을 배치하고 스레드에 맞게 돌면서 코드 한줄씩 바이트코드에 맞게 실행

  • 클래스 로더 시스템 : 바이트 코드를 컴파일을 되어 있는 코드로 디컴파일해서 보여주는 시스템이다(사람이볼수있게)

    • 로딩 : 클래스를 읽어오는 과정

    • 링크 : 래퍼런스를 참조(연결)하는 과정

    • 초기화 : static 값들에게 초기화 및 변수에 할당하는 과정

  • 메모리

    • 스택 : 단일스레드에 국한된다는 특징이 있으며, 스택은 스레드마다 런타임 스택을 만들고 그 안에 메소드 호출을 스택 프레임이라는 블럭을 쌓는다

    • PC(Program Counter) Register : 단일스레드에 국한된다는 특징이 있으며, 스레드 마다 런타인 스택을 쌓는다

    • Native Method Stack : 단일스레드에 국한된다는 특징이 있으며,

    • heap : 멀티스레드에서 참조 가능하다는 특징이 있으며, 객체(인스턴스)들을 저장

    • 메소드 loading : 멀티스레드에서 참조 가능하다는 특징이 있으며, 메모리 영역에는 클래스 정보(이름, 상속받았는지의 여부, 변수, 내부의 메소드 등)을 저장

  • 실행 엔진 :

    • 인터프리터 : 이것을 통해서 JVM을 통해서 변환된 바이트 코드를 한줄 한줄 실행

    • JIT(Just In Time) 컴파일러 : 위에서 인터프리터가 한줄한줄 반복된다고 했는데, 이렇게 반복되는 코드를 찾게 되면 반복되는 코드를 네이티브로 변환시켜놔서 컴파일된 코드를 바로 사용 -> 성능 향상

    • GC : 더 이상 사요아지 않는 객체를 정리해주는 아주 중요한 부분

      • throw/put 방식

      • stop the world 방식

  • 네이티브 메소드 공간

Last updated

Was this helpful?