JVM 동작 방식
순서대로 정리
- 자바 프로그램을 실행하면 JVM 은 OS 로부터 메모리를 할당받는다.
- 자바 컴파일러 (javac) 가 자바 소스코드(.java) 를 자바 바이트 코드 (.class) 로 컴파일한다.
- 클래스 로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 Runtime Data Area (실질적으로 메모리를 할당 받아 관리하는 영역) 에 올린다.
- Runtime Data Area 에 로딩된 바이트 고드는 Execution Engine 을 통해 해석된다.
- 이 과정에서 Execution Engine 에 의해 Garbage Collector 의 작동과 Thread 동기화가 이루어진다.
조금 더 자세한 역할
JVM 구조 제대로 뜯어보기
-
클래스 로더
JVM 내로 클래스 파일을 동적으로 로드, 링크를 통해 배치하는 작업을 수행하는 모듈
즉, 로드된 바이트 코드를 엮어서 JVM 의 메모리 영역인 Runtime Data Area 에 배
-
실행 엔진
- 인터프리터 : 명령어 단위로 읽어서 실행
- JIT 컴파일러 : 바이트 코드 전체를 컴파일하여 Natice Code 로 변경
- 가비지 콜렉터 : Heap 메모리 영역에서 더이상 사용하지 않는 인스턴스 친구들 메모리 회수
-
런타임 데이터 영역 → 여기서 의존성 생
- 메소드
- 힙
- PC Register
- 스택
- 네이티브 메서드
힙과 스택 영역
걍 힙에는 인스턴스가 저장되어 있는 거고 스택에는 변수들이 저장되어 있다고 생각하면 편함.
참조 타입, 기본 타입이 저장되어 있는데 가비지 콜렉터가 실행될 때마다 사용 안 하는 인스턴스들을 버려 주기 때문에 알아서 청소하는 거고 개발자는 메모리 관리를 해 줄 필요가 X → 가성비
면접 보러 다닐 때 jvm 구조를 자주 물어본다고 하셔서 공부했었는데 지금 업로드~
신기하게 의존성에 대해 이해를 하지 못하고 잇었는데 (아니 외부에서 실행된다는 게 뭔소리?) jvm 구조를 파악하고 나니까 조금 더 와닿았다.
그래서 의존성 주입 시 오류나면 전체 프로그램이 돌아가지 않는 거구나~ 인 것도 다시 알게 됨.