본문 바로가기
📙/Study

[JVM 파헤치기] 01.자바 기술 시스템 소개(2)

by kiwi_wiki 2025. 3. 18.
728x90
반응형

자바 가상 머신 제품군

썬 클래식 VM

세계 최초의 상용 자바 가상 머신

자바 코드를 순전히 인터프리터 방식으로 실행

JIT 컴파일러를 사용하려면 플러그인을 추가하면 됐는데 플러그인 하는 순간 인터프리터는 더 이상 동작하지 않고 가상 머신의 실행 시스템 전체가 JIT 컴파일러에 넘어가는 구조였음

당시 인터프리터와 컴파일러는 함께 구동되지 않았기 때문에 컴파일러를 사용하기 시작하면 실행 빈도 등 컴파일에 따른 득실과 상관없이 코드 전체를 컴파일해야 해서 자칫하면 프로그램 응답 속도가 너무 느려져 오래 걸리는 최적화 기법은 적용할 수 없었음

JDK 1.2가 출시되기 전까지 JDK와 함께 배포된 유일한 가상머신. 핫스팟 VM과 공존했던 JDK 1.2에서도 기본은 클래식 VM이었음

 

이그잭트 VM

핫스팟 검출, 2단계 JIT 컴파일러, 컴파일러와 인터프리터 혼합 모드 등을 갖추고 있어 현대적인 고성능 가상 머신의 프로토타입이라 할 수 있음

이름은 정확한 메모리 관리(exact memory management) 기술에서 따옴

정확한 메모리 관리란 가상 머신이 메모리의 특정 위치에 있는 데이터의 구체적인 자료형을 알 수 있다는 뜻. 이 정보는 가비지 컬렉션 시 힙에 존재하는 데이터(객체)가 여전히 사용 중인지 판단하는 전제 조건임. 덕분에 핸들에 기초한 클래식 VM의 객체 검색 방식에서 벗어나 간접 검색 부하가 줄어 실행 성능이 크게 개선됨

상용된 지 얼마 안 되어 썬 외부에서 개발된 핫스팟 VM으로 대체됨

 

핫스팟 VM

썬/오라클 JDK와 OpenJDK의 기본 가상 머신이자 가장 널리 사용되는 자바 가상 머신

대표적인 기술은 핫 코드 감지(hot code detection) 기술

핫 코드 감지 기능은 컴파일했을 때 효과를 가장 크게 볼 수 있는 코드 영역을 런타임에 알아내어 JIT 컴파일러에 알려주고, JIT 컴파일러가 해당 코드를 메서드 단위로 컴파일함. 메서드가 자주 호출되거나 메서드 안에 시간을 많이 잡아먹는 순환문이 있다면 JIT 컴파일을 수행해 스택을 치환(런타임에 스택을 치환하는 기술 - 온스택 치환(OSR))

컴파일 없이 즉시 실행한 다음 일부 코드만 백그라운드에서 컴파일하여 치환하는 방식

 

모바일. 임베디드 VM

썬과 오라클은 모바일과 임베디드 시장에 특화된 자바 가상 머신도 개발했지만 자바 SE만큼 성공적이지 못해 주목받진 못함

 

썬. 오라클 외의 조직이나 기업에서 개발한 가상 머신

- BEA JRockit

서버 하드웨어와 애플리케이션 동작 시나리오에 중점을 두고 최적화 진행하여 프로그램 구동 시간(startup time)은 우선순위에서 밀림. 인터프리터를 완전히 제거하고 모든 코드를 JIT 컴파일러로 컴파일하게 함. JRockit의 가비지 컬렉터와 JMC 실패 처리 스위트 구현은 당시 자바 가상 머신 중 최고 수준이었으나 오라클이 BEA를 인수하면서 추가 개발이 중단됨

- IBM J9 VM

목표 시장은 핫스팟과 비슷하게 서버와 데스트톱을 모두 고려해 설계된 다용도 가상 머신

IBM의 다양한 자바 제품군의 실행 플랫폼 역할을 하여 IBM 웹 스피어(웹 애플리케이션 서버), AIX(유닉스 운영 체제), z/OS(메인프레임 컴퓨터 운영 체제) 같은 플랫폼에서 자바 애플리케이션을 배포하는 것이 목표

여전히 현역으로 활동 중이며 핫스팟보다 역할별로 모듈화가 잘 되어있음(가비지 컬렉터, JIT 컴파일러, 진단 모니터 등의 핵심 구성 요소들이 잘 추상화, 캡슐화되어 있어 다른 언어 플랫폼에서도 사용할 수 있을 정도)

 

특정 하드웨어 플랫폼에서만 구동되는 가상 머신

- BEA 리퀴드 VM

JRockit의 가상화된 버전. 독자적인 하이퍼바이저 시스템 위에서 직접 실행됨

스레드 스케줄링, 파일 시스템, 네트워크 통신 등 필요한 기능을 제공하는 전용 운영 체제가 포함되어 있음

JRockit 개발이 중단되면서 리퀴드 VM도 함께 중단됨

- 어줄 VM

핫스팟에 기초해 개발한 자바 가상 머신. 자사의 베가(Vega)라는 하드웨어 시스템에서 구동됨

하드웨어에서 소프트웨어로 점차 옮기기 시작하여 징 VM 출시

- 징 VM

범용적인 x86-64용 리눅스 플랫폼에서 구동. 짧은 지연 시간과 구동 시간이 필요한 시나리오에서는 핫스팟보다 뛰어남

 

오라클에서 연구 중인 미래 지향적인 프로젝트

언어 독립

자바 언어 자체를 잊고 기반 기술 영역으로 돌아가야 한다.

- 그랄 VM

자바 가상 머신 언어(자바, 코틀린, 스칼라, 그루비 등) 뿐 아니라 LLVM 기반 컴파일러를 사용하는 C/C++, 러스트 같은 언어, 그 외 자바스크립트, 루비, 파이썬, R, 웹어셈블리까지 지원

서로 다른 언어들이 데이터를 같은 메모리 공간에서 주고받을 수 있고, 각 언어용으로 작성된 기존 네이티브 라이브러리들도 사용할 수 있음

각종 언어의 소스코드나 컴파일된 중간 형식을 인터프리터를 통해 그랄 VM이 이해할 수 있는 중간 표현으로 변환하는 식으로 작동함

입력된 중간 표현을 자동으로 최적화하고 런타임에 JIT 컴파일까지 하기 때문에 때로는 네이티브 컴파일러보다 실행 성능이 나을 수 있음

핫스팟을 기반으로 탄생했으며 자바 SE와 완벽하게 호환되어 자바 가상 머신으로 활용할 수 있음

차세대 JIT 컴파일러

장기간 운용되는 애플리케이션에서는 자주 실행되는 핫 코드를 탐지하여 네이티브 코드로 컴파일함. 이런 유형의 자바 애플리케이션은 JIT 컴파일러의 출력 품질이 실행 효율을 크게 좌우할 수밖에 없음

핫스팟 가상 머신의 실행 서브시스템 구성(핫스팟 가상 머신은 기본적으로 JIT 컴파일러를 두 개 내장)

- C1 컴파일러: 파일 속도가 빠른 대신 최적화를 적게 하는 클라이언트 컴파일러

- C2 컴파일러: 컴파일 속도는 느리지만 더 많은 최적화를 적용하는 서버 컴파일러

- 인터프리터

 

그랄 컴파일러

JDK 10부터 추가된 핫스팟 가상 머신의 실행 서브 시스템

C2 컴파일러를 대체할 목적으로 핫스팟에 도입

C2에서 동작하는 최적화 기술을 그랄 컴파일러가 받아들이긴 쉬우나 반대는 어려움

부분 탈출 분석(partial escape analysis)처럼 C2보다 복잡한 최적화도 수행 가능

맞춤형 가정 등을 추가해 공격적 예측 최적화(aggressive speculative optimization)를 적용하기도 수월

JDK 16부터 그랄 컴파일러를 JDK에서 독립시켜 그랄 VM으로 옮김

네이티브를 향한 발걸음

애플리케이션 아키텍처의 중심은 건대 단일 아키텍처에서 작은 마이크로서비스 아키텍처로 옮겨가고 있는데 자바는 이 추세와 잘 맞지 않음

분할된 서비스 각각이 큰 메모리를 사용할 일이 없으며 언제든 중단하고 업데이트할 수 있기 때문에 서비스를 24시간 중단 없이 실행하기 위해 노력할 이유가 줄어들었으나 자바는 구동 시간이 길고 최고 성능을 내기까지 예열이 필요함

최근 JDK에는 애플리케이션 클래스 데이터 공유와 노옵 가비지 컬렉터인 엡실론 등의 기술이 포함

 

AOT 컴파일: 애플리케이션을 실행하기 전에 네이티브 코드로 컴파일해둠

- 예열 과정을 건너뛰고 처음부터 네이티브 코드 실행 가능

- 시간 압박 없이 프로그램 전체를 완벽하게 분석하여 최적화 가능

- 하드웨어와 운영 체제별로 따로 컴파일해 배포해야 함

- 컴파일할 코드에 대한 모든 것을 컴파일타임에 알 수 있어야 함(그렇지 않으면 사전 컴파일된 결과를 폐기하고 JIT 컴파일 형태로 돌아감)

 

서브스트레이트 VM(Substrate VM)

- 그랄 VM의 한 요소. 사전 컴파일된 네이티브 코드를 핫스팟 가상 머신 없이 실행하는 기술

- 독자적인 예외 처리, 스레드 관리, 메모리 관리, 자바 네이티브 인터페이스 접근 메커니즘 등을 갖춘 극히 작은 런타임 환경

- 그랄 VM은 서브스트레이트 VM과 사용자 프로그램을 하나로 묶어 네이티브 이미지 생성. 포인터 분석 기술을 활용해 도달 가능한 코드만 추려 네이티브 이미지에 담고, 초기화 수행하여 최종 실행 파일이 생성되면 초기화된 힙 스냅숏을 저장. 이런 식으로 초기화 과정을 건너뛰고 바로 실행하여 초기 구동 시간을 줄임 (프로그램이 완결된 형태여야 함. 컴파일러가 찾을 수 없는 코드나 클래스 라이브러리를 동적으로 읽어 들일 수 없음)

- 메모리 사용량을 크게 줄임

유연한 뚱뚱이

연이은 리팩터링과 개방을 거쳐 핫스팟 가상 머신은 점점 코드 복잡도와 덩치는 커지고 있지만 아키텍처가 낡지 않음

개방성과 확장성이 좋아져 연동하기 쉬운 플랫폼이 됨

언어 문법의 지속적인 개선

언어가 제공하는 기능과 문법은 생산성과 개발 효율에 많은 영향을 주는 요인이므로 지속적으로 실험하고 표준화하고 있음

728x90
반응형