We will find a way, we always have.

-interstellar

Programming Language/자바

[VM] 그랄VM (GraalVM)

Redddy 2024. 11. 9. 23:56

최근 읽고 있는 도서 JVM 밑바닥까지 파헤치기에서 자바의 신기술 중 그랄VM이 무엇인지 잠깐 엿보았었다. 그런데 바로 다음날 if 카카오에서도 GraalVM 도입으로 JVM 백엔드 애플리케이션의 구동 초기 성능 문제 해결하기 라는 제목으로 발표영상이 올라와 이건 운명이다 생각하여 그랄VM이 뭔지 정리해보려고 한다.

 

그랄VM (GraalVM)

2018년 4월 오라클 연구소는 그랄VM이라는 새로운 기술을 발표했다. "Run programs faster anywhere" 라는 구호로 등장했다. 

 

 

사진 출처: https://blogs.oracle.com/java/post/for-building-programs-that-run-faster-anywhere-oracle-graalvm-enterprise-edition

 

'유니버설 VM'  또는 '폴리글랏 VM'이라고도 하는 그랄 VM은 핫스팟 가상 머신 위에 구축된 크로스 언어(cross-language) 풀 스택 가상 머신이다. 자바, 코틀린, 스칼라, 그루비 같은 자바 가상 머신 언어들은 물론 LLVM(low level virtual machine) 기반 컴파일러를 사용하는 C, C++, 러스트 같은 언어들, 그 외 자바스크립트, 루비, 파이썬, R, 웹어셈블리까지도 지원한다. 그랄VM에선 추가 비용 없이 이 언어들을 혼합해 사용할 수 있다. 그리고 또 서로 다른 언어들이 데이터를 같은 메모리 공간에서 주고받을 수 있고, 각 언어용으로 작성된 기존 네이티브 라이브러리들도 사용할 수 있다. 

 

사진 출처: https://blogs.oracle.com/java/post/for-building-programs-that-run-faster-anywhere-oracle-graalvm-enterprise-edition

 

 

그랄VM은 기본적으로 각종 언어의 소스 코드나 컴파일된 중간 형식을 인터프리터를 통해 그랄VM이 이해할 수 있는 중간표현(IR)으로 변환하는 식으로 작동한다. 예를 들어 이 인터프리터는 LLVM이 출력한 비트코드를 적절히 변환하여 그랄VM이 C, C++ 언어를 지원할 수 있게 해준다. 그랄VM은 새로운 언어용 인터프리터를 빠르게 제작할 수 있는 언어 구현 프레임워크인 트러플(Truffle)을 제공하며, 트러플 위에서 고성능 LLVM 비트코드 인터프리터인 수롱(Sulong)을 제작했다. 

 

엄밀히 말하면, 그랄 VM은 진정한 의미에서 '물리 머신에 대응하는 고수준 언어 가상 머신'이다. 물리 머신의 명령어 집합(instruction set)과 같은 역할을 하면서 머신의 특성과만 관련이 있을 뿐 특정 고수준 언어의 특성과는 관련이 없기 때문이다. 

 

차세대 JIT 컴파일러

 

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

 

핫스팟 가상 머신은 기본적으로 JIT 컴파일러 두 개를 내장하고 있다. 

 

  • C1(클라이언트 컴파일러): 컴파일 속도가 빠른 대신 최적화를 적게 한다.
  • C2(서버 컴파일러): 컴파일 속도는 느리지만 더 많은 최적화를 적용한다. 

 

여기에 인터프리터까지 포함하여 총 3개의 실행 매커니즘이 협력하여 핫스팟 가상 머신의 실행 시스템을 구축한다. 

 

JDK 10부터는 하나가 더 추가되었는데 바로 그랄 컴파일러다. 그랄VM 프로젝트의 일환으로 만들어진 기술이며 C2 컴파일러를 대체할 목적으로 핫스팟에 도입되었다. 시간이 갈 수록 C2는 복잡한 코드를 갖게 되어 유지보수가 어려워졌다. 이러한 문제 때문에 최근에 그랄 컴파일러와 같은 새로운 컴파일러가 등장했고, 그랄 컴파일러는 단 몇 년만에 C2의 컴파일 품질을 따라잡았으며 이제는 대부분 항목에서 앞서 나가기 시작했다. 

 

JDK 16부터는 개발과 관리 효율을 높이고자 그랄 컴파일러를 JDK에서 독립시켜 그랄VM으로 자리를 옮겼다. 

 

 

그랄 VM은 JVM 앱을 AOT(ahead of time: 애플리케이션을 실행하기 전에 네이티브 코드로 컴파일 해두는 방식)로 컴파일 할 수 있게 해준다. 미리 컴파일 하기 때문에 워밍업 시간이 없어 구동 직후 성능은 JIT로 동작하는 핫스팟 보다 압도적으로 빠르다. 다만 런타임 환경에서 완전히 최적화된 핫스팟보다는 느리다. 

 

그랄VM을 사용하면 AOT로 컴파일 하기 때문에 런타임에 정보를 얻어와서 하는 작업을 할 수가 없게 된다. 때문에 스프링에서도 그랄VM을 사용했을 때 제약사항이 많아진다. 그렇기에 실제 프로덕션에 그랄VM을 적용한 사례가 많지는 않다 

 

 

 


애플리케이션 성능을 향상하기 위해 그랄VM을 사용해볼 날이 올까 기대가 된다.

 

 

참고