레지스터 기반 vs 스택 기반 VM
자바 가상머신은 가상머신이 필요로하는 기능 명세서를 구현한 것 중에 하나이다.
따라서 가상머신의 구현체는 명세서를 어떻게 구현하냐에 따라 여러 종류가 있을 수 있다.
가상머신은 일반적으로 어떤 것들을 구현해야할까? 물리적인 CPU에 의해 처리되는 동작들을 흉내낼 수 있어야 한다. 즉, 아래와 같은 컨셉들을 가지고 있어야 한다.
[가상머신이라면 구현해야할 컨셉]
- 소스 코드를 VM이 실행가능한 바이트 코드로 변환한다.
- 명령어와 피연산자를 포함하는 데이터구조를 가지고 있어야 한다.
- 함수를 실행하기 위한 콜 스택
- IP(Instruction Pointer) : 다음 실행할 곳을 지정하는 포인터
- 가상 CPU : 다음 명령어를 패치 & 명령어를 해석 & 명령을 실행
위와 같은 명세를 만족하는 가상머신을 구현할 수 있는 방법은 두 가지가 있다.
[가상머신을 구현하는 두 가지 방법]
- Stack 기반
- Register 기반
- 피연산자를 저장하고 다시 가져오는 메카니즘이 다르다.
- Java VM, .Net CLR
- 대다수의 가상머신이 스택기반
- 피연산자와 연산 후 결과를 스택에 저장한다.
- 예를들어, 아래와 같이 덧셈을 할 경우, 스택구조라서 PUSH & POP 이 필요하여 4단계의 명령이 필요하다.
- 장점 : 다음 피연산자의 메모리 위치를 기억할 필요가 없다. SP가 다음 피연산자의 위치를 나타낸다. 즉 스택에서 POP 만 하면 다음 피연산자가 나오기 때문에 피연산자의 메모리를 기억할 필요가 없다.
- Lua VM, Dalvik VM
- 피연산자가 CPU의 레지스터에 저장된다.
- PUSH & POP 연산자가 없다.
- 명령어가 피연산자의 위치인 레지스터의 주소를 기억해야 한다.
- 장점 :
1) 아래와 같이 POP & PUSH 과정이 없기 때문에 같은 덧셈이라도 하나의 명령으로 충분하다. 때문에 더 빠르다.
2) 스택기반에서는 할 수 없는 명령어 최적화를 적용할 수 있다. 예를들어, 어떤 연산이 나중에 또 필요할 때, 레지스터에 저장하여 다시 계산하지 않고도 연산결과를 활용할 수 있다.
- 단점 :
1) 스택기반보다 명령어의 길이기 길다. 피연산자의 주소를 명시해줘야 하므로 평균적으로 길 수 밖에 없다.
[출처] 레지스터 기반 vs 스택 기반 VM
'JAVA > JVM' 카테고리의 다른 글
G1GC (Java9 ~ 12 디폴트 GC) (0) | 2023.04.25 |
---|---|
[JVM] CPU 분석 (0) | 2021.12.16 |
[JVM] OS 와 튜닝 (0) | 2021.12.16 |
[JVM] 객체 재사용 - Reference 종류, WeakHashMap (0) | 2021.12.16 |
[JVM] 메모리 사용량 줄이기 - Canonical Object (정규 객체) / String.intern() (0) | 2021.12.16 |
[JVM] WANR! Collections & Memory Leak (0) | 2021.12.16 |
[JVM] jcmd & jmap 힙 히스토그램 - 가장 많은 메모리를 소모하는 인스턴스 찾기 (0) | 2021.12.16 |
[JVM] G1 Collector - 더! 큰 객체 할당 (0) | 2021.12.16 |