포스팅의 주제는 백기선님의 자바 스터디 1주차 과제에서 가져왔습니다. 자바 공부하기에 좋은 주제들을 제시해주셔서 저도 따라가 보려고 합니다.
JVM은 JRE에 속해있고 자바 코드 실행 환경을 제공해주는 가상 머신입니다. 자바 프로그램의 실행 과정을 살펴보겠습니다.
자바 프로그램 실행 과정
프로그램이 사용할만큼의 메모리가 할당되고 이를 JVM이 관리합니다. 자바 컴파일러가 자바 소스코드를 바이트코드(.class 파일)로 변환시킵니다. 그다음 Class Loader를 통해 class 파일들을 JVM에 로딩합니다. 로딩된 파일들을 Execution Engine에서 처리합니다.
JVM 구성 요소
자바 프로그램 실행 과정은 전부 JVM에서 일어나는 일입니다. 메모리 관리, Class Loader, Execution Engine 등의 내용을 자세히 살펴봅시다.
Class Loader
JVM으로 클래스 파일을 로드시키는 역할을 담당합니다. 모든 클래스 파일을 한 번에 메모리에 올리는게 아니라 필요할 때마다 동적으로 올려줍니다. Class Loader는 로딩(클래스 읽기) -> 링킹(레퍼런스 연결) -> 초기화의 단계로 동작합니다. Class Loader는 또 세 파트로 나뉩니다.
- Bootstrap class loader
- Extensions class loader
- System class loader
Bootstrap class loader는 주로 $ JAVA_HOME / jre / lib 에있는 JDK 내부 클래스, 일반적으로 rt.jar 및 기타 핵심 라이브러리를 로드하는 역할을 합니다. 또한 다른 모든 ClassLoader 인스턴스의 부모 역할을 합니다.
Extensions class loader 는 부트 스트랩 클래스 로더의 자식이고 모든 응용 프로그램에 사용할 수 있도록 표준 핵심 자바 클래스(standard core java classes)의 확장을 로딩합니다. 로딩 위치는 그림에 첨부되어 있습니다.
System class loader는 Application class loader로도 불립니다. application level의 클래스들을 로드합니다.
Memory
Method Area는 field, method, type, constant pool, static, final 등이 이쪽에서 관리됩니다.
Heap은 모든 객체가 저장됩니다. 인스턴스 변수나 배열같은 정보들이 여기에 저장됩니다. Method에 올라간 Class만 생성 가능하고 사용되지 않는 값이 제거되는 영역이라고도 합니다.
JVM language Stacks는 지역 변수를 저장합니다. 그리고 많은 글들을 살펴본 결과 thread가 이 영역에서 관리된다고 합니다. thread block이 자료구조 스택처럼 쌓이고 process가 끝나면 삭제됩니다.
PC Register는 운영체제에서 배우는 그 PC Register와 동일합니다. 현재 실행 중인 파트의 주소를 저장하고 이는 context switch가 발생될 때 사용됩니다.
Native Method Stacks는 자바가 아닌 다른 언어로 작성된 코드를 실행할때 사용합니다. 얘네들을 호출할 때 사용되는 stack 공간입니다. Native library의 지침을 따른다고 합니다.
Execution Engine
로드된 바이트코드를 실행하는 파트가 Execution Engine입니다. JIT을 다루면서 언급했지만 다시 살펴보겠습니다. 바이트코드를 명령어 단위로 읽어서 실행하는데 인터프리터 방식과 JIT 방식을 사용합니다. JIT으로 중복되는 부분을 미리 체크해두고 라인별로 인터프리터 방식으로 실행합니다. 체크한 부분에 도달하면 미리 캐시 된 값을 실행하는 방식을 채택하고 있습니다.
사실 Execution Engine에는 또 하나가 존재합니다. 컴파일 방식은 아니고 GC(가비지 콜렉터 혹은 가비지 콜렉션)가 여기에 해당합니다. GC는 더 이상 사용하지 않는 인스턴스들을 삭제하는 역할을 수행합니다. 아까 Heap 영역을 언급할 때 사용되지 않는 값 삭제..라는 문구를 적었는데요. 이도 GC가 담당하고 있습니다.
참고www.guru99.com/java-virtual-machine-jvm.html
www.baeldung.com/java-classloaders
'Java' 카테고리의 다른 글
[JAVA] 자바 원시 타입 (0) | 2021.04.05 |
---|---|
[JAVA] JDK와 JRE의 차이 (0) | 2021.04.04 |
[java] JIT 컴파일러란? (0) | 2021.03.25 |
바이트 코드란? (0) | 2021.03.23 |
JVM이란? - 특징 (0) | 2021.03.22 |