반응형
JVM 구조

클래스 로더 시스템
- .class 에서 바이트코드를 읽고 메모리에 저장
- 로딩: 클래스 파일에서 바이트 코드를 읽어오는 과정
- 링크: 레퍼런스를 연결하는 과정
- 초기화: static 값들 초기화 및 변수에 할당
메모리
- 메소드 영역에는 클래스 수준의 정보 (클래스 이름, 부모 클래스 이름, 메소드, 변수) 저장. 공유 자원이다.
- 힙 영역에는 객체(.class 타입의 객체 및 인스턴스)를 저장. 공유 자원이다.
스택, PC, 네이티브 메소드 스택은 각 쓰레드 마다 사용하는 영역이다. 해당하는 쓰레드만 공유하는 자원이며 힙이나 메소드처럼 다른 모든 영역에 공유하는 자원은 아니다.
- 스택 영역에는 쓰레드 마다 런타임 스택을 만들고, 그 안에 메소드 호출(method call)을 스택 프레임이라 부르는 블럭으로 쌓는다. 쓰레드 종료하면 런타임 스택도 사라진다.
- PC(Program Counter) 레지스터: 쓰레드 마다 쓰레드 내 현재 실행할 명령어(instruction)의 위치를 가리키는 포인터가 생성된다.
- 네이티브 메소드 스택: 네이티브 메소드를 호출할 때 사용하는 별도의 메소드 스택이다. 네이티브 메소드 인터페이스(Native 키워드)를 사용하는 메소드들은 네이티브 메소드 스택에 저장된다.
- 네이티브 메소드의 예로 Thread 클래스의 currentThread() 메소드가 있다.
실행 엔진
- 인터프리터: 바이트 코드를 한 줄 씩 실행. 즉, 바이트 코드 한 줄 마다 네이티브 코드로 컴파일한다. 똑같은 바이트 코드가 여러번 나와도 매번 한 줄씩 반복적으로 컴파일하기 때문에 비효율적이다.
- JIT 컴파일러: 인터프리터 효율을 높이기 위해 사용된다.
- 인터프리터는 반복되는 코드를 발견하면 JIT 컴파일러로 보내고 JIT 컴파일러는 반복되는 바이트 코드를 모두 네이티브 코드로 미리 바꿔둔다. 그 다음부터 인터프리터는 반복되는 코드를 실행할 때, 바이트 코드를 네이티브 코드로 변환하는 작업을 하지 않고 JIT 컴파일러가 컴파일한 네이티브 코드를 바로 사용한다.
- GC(Garbage Collector): 더이상 참조되지 않는 객체를 모아서 정리한다.
자바 네이티브 인터페이스(JNI, Java Native Interface)
- 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공
- Native 키워드를 사용한 메소드 호출
네이티브 메소드 라이브러리
- C, C++로 작성 된 라이브러리
- 이를 사용하려면 자바 네이티브 인터페이스를 통해야 한다.
[참고자료]
How JVM Works – JVM Architecture?
반응형
'Java > 기본' 카테고리의 다른 글
자바(Java) 바이트 코드 조작관련 - 코드 커버리지 (0) | 2021.05.26 |
---|---|
자바(Java) - 클래스 로더 시스템 구조 이해하기 (0) | 2021.05.25 |
자바(Java) - JVM, JDK, JRE 차이점 이해하기 (0) | 2021.05.23 |
자바(Java) - try-with-resources 구문 (0) | 2020.03.01 |
자바(Java) - 예외처리 (0) | 2020.03.01 |