
JVM의 역할
- 자바 애플리케이션을 Class Loader를 통해 읽어 들여 자바 API와 함께 실행
- JVM은 Java와 OS 사이에서 중개자 역할을 수행
→ JAVA가 OS에 독립적으로 실행 및 재사용을 가능하게 함
- 메모리관리, Garbage collection을 수행
- 스택기반의 가상머신
- ARM 아키텍쳐 같은 하드웨어는 레지스터 기반으로 동작하는데 비해 JVM은 스택기반으로 동작한다
JVM 구조
.java
파일이 javac(java 컴파일러)를 거쳐 .class
파일로 만들어져 JVM으로 들어온다.
💡
.class 파일 = 바이트 코드
- byte 코드 → JVM과 같은 가상 머신이 이해할 수 있는 코드 - binary 코드
→ CPU가 이해할 수 있는 코드
- byte 코드 → JVM과 같은 가상 머신이 이해할 수 있는 코드 - binary 코드
→ CPU가 이해할 수 있는 코드
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시작 시 생성되고 프로그램이 종료될 때까지 유지된다.
💡클래스 Person p = new Person(); 이라는 소스를 작성했다면
Person p는 스택 영역에 생성되고
new로 생성된 Person 클래스의 인스턴스는 힙 영역에 생성된다.
스택영역에 생성된 p의 값으로 힙 영역의 주소값을 가지고 있다.
→ 즉, 스택 영역에 생성된 p가 힙 영역에 생성된 객체를 가리키고(참조하고) 있는 것- 쓰레드마다 런타임 스택, 스택 프레임(메소드 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 |
댓글