728x90
전체 구조
- 클래스로더
- 실행 엔진
- 인터프리터
- jit 컴파일러
- 가비지 콜렉터
- 런타임 데이터 영역
- 메소드영역
- 힙영역
- PC Register
- 스택 영역
- 네이티브 메소드
실행 순서
- bytecode로 변환된 코드가 jvm에 들어오면
- class loader가 runtime data area로 로딩
- 실행 엔진을 통해 해석
- 런타임 데이터 각 영역에 배치되어 수행
클래스로더
- 바이트코드(.class)들을 엮어서 로드하고 JVM 메모리영역인 Runtime Data Areas에 배치
로딩 순서
- Loading (로딩)
- 클래스파일을 가져와 jvm의 메모리에 로드
- Linking: 로드한 클래스파일 사용을 위해 검증하는 과정
- Verifying
- 클래스가 JVM 명세에 명시된 대로 구성되어 있는 지 검사
- Preparing
- 클래스가 필요로 하는 메모리 할당
- Resolving
- 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
- Verifying
- Initialization
- 클래스 변수들을 적절한 값으로 초기화
- static 필드들을 설정된 값으로 초기화
- 클래스 변수들을 적절한 값으로 초기화
실행엔진
- Runtime Data Area에 배치된 바이트 코드를 명령어 단위로 읽어서 실행
- 기계가 실행할 수 있는 형태로 변경
- 인터프리터와 JIT 컴파일러 두 가지 방식을 혼합하여 바이트 코드를 실행
- 인터프리터 방식을 사용하다 일정 기준이 넘어가면 JIT 컴파일 방식으로 명령어를 실행
- 가비지 컬렉터
- 가비지 컬렉터를 이용해 HEAP 메모리 영역에서 더이상 사용하지 않는 메모리 자동 회수
- JAVA는 Garbage Collector를 이용해 자동으로 메모리 실시간 최적화
런타임 데이터 영역
- JVM 메모리 영역으로 자바 어플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
- 메서드 영역
- 바이트 코드를 처음 메모리 공간에 올릴 때, 초기화 대상을 저장하는 메모리 공간
- 프로그램이 종료 될 때까지 저장
- 정적 필드와 클래스 구조만 갖고 있음
- field info
- 멤버변수의 이름, 데이터 타입, 접근 제어자 정보
- method info
- 메소드 이름, return 타입, 함수 매개변수, 접근 제어자 정보
- type info
- class / interface 여부 저장, type 속성, super class 이름
- field info
- 힙 영역
- 데이터를 저장하기 위해 런타임시 동적으로 할당하여 사용하는 영역
- Reference Type이 저장
- new 연산자로 생성되는 클래스, 인스턴스 변수, 배열 등
- 메서드 영역에 저장된 클래스만이 생성되어 적재
- 힙의 참조 주소는 스택이 갖고 있어, 해당 객체를 통해서만 힙 영역에 있는 인스턴스를 핸들링 할 수 있음
- 참조하는 변수나 필드가 없다면 의미없는 객체로 여기고 가비지 컬렉터를 실행시켜 객체를 제거
- 가비지 컬렉터
- https://ddevgrit.tistory.com/10
가비지 컬렉션(Garbage Collection) 동작원리
가비지 컬렉터가 가비지 컬렉션을 수행 가비지 컬렉션 메모리 관리기법 힙내에 동적으로 할당했던 메모리 영역 중 필요 없게 된 영역을 해제하는 기능 가비지 컬렉터 동작원리 포인터 추적 방
ddevgrit.tistory.com
- 스택영역
- 임시적으로 사용되는 변수들이 저장되는 공간
- 단 데이터 타입에 따라 스택과 힙에 저장되는 방식이 다름
- 기본(원시)타입 변수는 스택 영역에 직접 값을 가짐
- 참조타입 변수는 힙 영역이나 메소드 영역의 객체 주소를 가짐
- Person p = new Person() 에서 클래스는 heap에, p는 stack에 저장
- 쓰레드 마다 하나씩 존재, 쓰레드가 시작될 때 할당
- PC 레지스터
- 현재 수행중인 JVM 명령어 주소를 저장하는 공간
- 데이터, 피연산 값 등
- 주소
- 쓰레드가 어떤 부분을 무슨 명령으로 실행해야 할 지에 대한 기록을 보유
- 레지스터
- CPU내의 기억장치
- PC 레지스터
- 현재 작업하는 내용을 CPU에게 연산으로 제공하기 위한 버퍼공간
- jvm은 스택에서 비연산값(OPERAND)를 뽑아 별도의 메모리 공간인 PC Register에 저장
- 현재 수행중인 JVM 명령어 주소를 저장하는 공간
- 모든 쓰레드가 공유하는 영역
- Method area, Heap area
- 각 쓰레드 마다 생성되는 영역
- PC Register, Stack area, Native Method stack
728x90
'JAVA' 카테고리의 다른 글
스프링(Spring)에서 자주 사용하는 Annotation 종류 (0) | 2024.02.22 |
---|---|
가비지 컬렉션(Garbage Collection) 동작원리 (1) | 2024.02.01 |
[JAVA] JIT 컴파일러란?? (0) | 2024.01.26 |
JVM (Java Virtual Machine) (0) | 2024.01.25 |
Thread (2) | 2024.01.24 |