JVM의 역할
- 자바 애플리케이션을 Class Loader를 통해 읽어 들여 자바 API와 함께 실행
- JVM은 Java와 OS 사이에서 중개자 역할을 수행
→ JAVA가 OS에 독립적으로 실행 및 재사용을 가능하게 함
- 메모리관리, Garbage collection을 수행
- 스택기반의 가상머신
- ARM 아키텍쳐 같은 하드웨어는 레지스터 기반으로 동작하는데 비해 JVM은 스택기반으로 동작한다
JVM 구조
.java
파일이 javac(java 컴파일러)를 거쳐 .class
파일로 만들어져 JVM으로 들어온다.
Class Loader
바이트 코드를 읽어오며 메모리에 적절히 배치하는 역할
- 로딩 : .class 파일을 읽어온다.
- 링크 : 코드 내부의 레퍼런스를 연결
- 초기화 : 클래스에 있는 static 값들을 초기화
Runtime Data Area(Memory)
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다
[Method Area, Heap Area]
전체 공유 자원
- Method : 클래스 수준의 정보 저장
- 클래스 멤버 변수, 메소드 정보, Type(Class or interface)정보, Constant Pool, static, final 변수 등이 생성된다.
- 상수 풀은 모든 Symbolic Refernce를 포함하고 있다.
- Heap : 객체(인스턴스)수준의 정보 저장
- GC의 주요 대상
[Stack Area, PC register, Native Method Stack]
쓰레드 단위로 하나씩 생성된다.
- Stack : 인스턴스 및 지역 변수의 참조 주소들을 저장
- JVM시작 시 생성되고 프로그램이 종료될 때까지 유지된다.
- 쓰레드마다 런타임 스택, 스택 프레임(메소드 call)을 쌓는다
- PC register : 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역
- Program Counter
- Native Method Stack : 네이티브 메소드 호출할 때 사용하는 별도의 스택
- 네이티브 메소드는 java가 아닌 low-level로 구현된 메소드
ex. Thread.currentThread()
- 네이티브 메소드는 java가 아닌 low-level로 구현된 메소드
Execution Engine
- 인터프리터
- 바이트 코드를 한줄 한줄 읽어서 네이티브 코드로 변환
- JIT(Just In Time) 컴파일러
- 바이트 코드에서 반복되는 코드 부분은 JIT 컴파일러가 미리 네이티브 코드로 변환시켜 놓음
- 반복되는 코드가 읽힐 순서가 왔을 대, 인터프리터로 읽지 않고 바로 네이티브 코드를 바로 사용한다.
- 인터프리터 읽을 때의 속도 효율성을 JIT 컴파일러가 보완하는 형태
- GC(Carbage Collector)
- 더 이상 참조되지 않는 객체를 모아서 메모리 정리를 한다.
⍞ Reference
'언어 log > Java' 카테고리의 다른 글
[Java] Array to List, List to Array (0) | 2020.06.13 |
---|---|
[Java] Array copy 배열 복사/복제 (0) | 2020.05.31 |
댓글