JVM 이해하기
Last updated
Was this helpful?
Last updated
Was this helpful?
해당 정리는 강의 제작자이신 백기선님의 문서를 참고해서 작성 추가로 본인이 과거에 정리했었던 자바정리도 참고
JVM(Java Virtual Machine)
자바 가상 머신으로 자바 바이트 코드를 OS에 맞춰서 변환해주는 방식을 가지고 있다
바이트 코드를 실행하는 표준이고, 구현체이다
JVM은 다양한 회사들에서 만들어서 배포하고 있는데, 그래서 이름이 붙어서 나오곤 한다 -> Azul, Amazon 등
#### JRE(Java Runtime Environment) - 자바 애플리케이션을 실행할 수 있도록 구성된 배포판 - JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있음 - 자바 버전 11 이후부터는 더 이상 제공하지 않고 있는 상황 #### JDK(Java Development Kit) - JRE와 개발하는데 필요한 다양한 툴을 제공 - OS에 국한되지 않고 플랫폼에 독립적으로 구성되어있음
크게 클래스 로더 시스템, 메모리, 실행 엔진 그리고 네이티브 메소드 공간으로 4 가지로 나누어져 있다 방식은 클래스 로더가 코드를 읽고 메모리의 각 위치에 맞는 값들을 배치하고 스레드에 맞게 돌면서 코드 한줄씩 바이트코드에 맞게 실행
클래스 로더 시스템 : 바이트 코드를 컴파일을 되어 있는 코드로 디컴파일해서 보여주는 시스템이다(사람이볼수있게)
로딩 : 클래스를 읽어오는 과정
링크 : 래퍼런스를 참조(연결)하는 과정
초기화 : static 값들에게 초기화 및 변수에 할당하는 과정
메모리
스택 : 단일스레드에 국한된다는 특징이 있으며, 스택은 스레드마다 런타임 스택을 만들고 그 안에 메소드 호출을 스택 프레임이라는 블럭을 쌓는다
PC(Program Counter) Register : 단일스레드에 국한된다는 특징이 있으며, 스레드 마다 런타인 스택을 쌓는다
Native Method Stack : 단일스레드에 국한된다는 특징이 있으며,
heap : 멀티스레드에서 참조 가능하다는 특징이 있으며, 객체(인스턴스)들을 저장
메소드 loading : 멀티스레드에서 참조 가능하다는 특징이 있으며, 메모리 영역에는 클래스 정보(이름, 상속받았는지의 여부, 변수, 내부의 메소드 등)을 저장
실행 엔진 :
인터프리터 : 이것을 통해서 JVM을 통해서 변환된 바이트 코드를 한줄 한줄 실행
JIT(Just In Time) 컴파일러 : 위에서 인터프리터가 한줄한줄 반복된다고 했는데, 이렇게 반복되는 코드를 찾게 되면 반복되는 코드를 네이티브로 변환시켜놔서 컴파일된 코드를 바로 사용 -> 성능 향상
GC : 더 이상 사요아지 않는 객체를 정리해주는 아주 중요한 부분
throw/put 방식
stop the world 방식
네이티브 메소드 공간