면접 보고 JVM 구조 질문이 있었다. 면접 끝나고 나서 갑자기 짜증이 났다. 아니 xx 이거 알아서 뭐 어쩌라는건데? 한글의 자음 모음의 첫 시작은 뭐고 그 구조는 언어학적으로 어떤지 모르면 한국어 못하는건가? 라는 이런 뜬금없는 생각이 났고 질문에 어버버 거리면서 머뭇거리는 상황이 떠올라서 갑자기 짜증이 확났다. 그래서 공부한다. 그리고 정리해본다.
2. 본론
자바 프로그램의 실행 단계
JAVA CODE (.java) ➡️ JAVAC Compiler ➡️ Byte Code (.class) ➡️ JVM ➡️ Windows or LINUX ➡️ Mac
그래서 자바코드를 갖고 개발할 때 JAVA를 다운받는 것이고 그 안에는 JDK(개발키트), JRE(런타임 환경)가 있는 것이다.
➡️ 클래스 로더는 클래스 파일을 로드하는데 사용되는 하위 시스템이다. 여기에는 세 가지 주요 기능을 수행한다.
로드
연결
초기화
2. Method Area
➡️ 메타데이터, 상수 런타임 풀 및 메소드용 코드와 같은 클래스 구조를 저장한다.
3. Heap
➡️ 모든 Objects, 관련 인스턴스 변수 및 배열은 힙에 저장된다. 그리고 이 메모리는 공통이며, 여러 스레드에서 공유된다.
4. JVM Language Stacks
➡️ 자바의 언어 스택은 지역 변수를 저장한다. 각 스레드에는 스레드가 생성될 때 동시에 생성되는 자체 JVM 스택이 있다.
메서드가 호출될 때 마다 새로운 프레임이 생성되고 메서드 호출 프로스세가 완료가 되면 삭제된다.
5. PC Registers
➡️ 현재 실행 중인 자바 가상 머신 명령어의 주소를 저장한다. JAVA에서 각 스레드에는 별도의 PC레지스터가 있다.
6. Native Method Interface
➡️ 네이티브 라이브러리에 따라 네이티브 코드의 명령을 보유한다. JAVA 대신 다른 언어로 작성되어 있다고 한다.
7. Execution Engine
➡️ 하드웨어, 소프트웨어 또는 전체 시스템을 테스트하는데 사용되는 소프트웨어 유형이다. 테스트 실행 엔진은 테스트된 제품에 대한 정보를 절대 전달하지 않는다.
8.Native Method Libraries
➡️ 실행엔진 (Execution Engine)에 필요한 Native Libraries(C, C++)의 모음이다.
9. Garbage Collector
➡️ 흔히 GC라고해서 불필요한 메모리를 정리해주는 것으로 많이 알고 있다. 조금 더 얘기해보자면 힙(heap) 내의 객체 중에서 가비지를 찾아내고, 처리해서 힙의 메모리를 회수하는 것이다. 가비지를 구별하는 것은 reachability 라는 개념을 사용하지만 이 부분의 설명은 아래 그림의 출처인 NAVER D2 Coding의 글에서 보는 것을 추천한다.