본문 바로가기

개발/디스코드 봇

JVM을 교체하면서

GraalVM은 뭐고, OpenJ9, AdoptOpenJDK, Azul JDK는 뭐지?

GraalVM

GraalVM은 Hotspot의 낡디낡은 C2 컴파일러를 대체하기 위해, Oracle Labs를 중심으로 개발중인 차세대 JIT 컴파일러입니다.

매우 빠른 것이 특징입니다.

OpenJ9

OpenJ9은 IBM의 J9 JVM을 이클립스 재단에서 인수하여, 개발 및 배포중인 JVM입니다. (IBM도 개발에 참여 중)

매우 적은 메모리 사용량이 특징입니다.

AdoptOpenJDK

AdoptOpenJDK는, 커뮤니티에서 빌드하여 배포하는 OpenJDK입니다.

Hotspot, OpenJ9 VM을 빌드하여 배포하고 있습니다.

(보안 패치 또한 커뮤니티에서 제공합니다.
따라서 기존 OpenJDK보다 보안 패치가 빠르게 되는 편입니다.)

여러 기업(IBM, 아마존, Azul, MS, 레드햇등)의 후원을 받고 있습니다.

(TCK 인증은 오라클과의 문제로 인해 진행하지 못했다고 함)

ZuluVM

ZuluVM은, Azul 사에서 보안 패치등을 진행하고, 빌드하여 배포하는 OpenJDK입니다.
(TCK 인증을 통과했습니다)

(Azul 사에서는 Zing이라는 기업용 고성능 JVM도 만듭니다)

TCK가 무엇인가

TCK란, Technology Compatibility Kit의 약자로서 VM들이 JVM 표준 구현을 준수하였는지 확인하는 절차입니다.

왜 JVM 교체를 고민하게 되었는가

서비스의 이용자가 점점 많아지면서, 기존의 서버로는 트래픽을 감당하기 힘들어졌고,
이를 최소 비용으로 해결하기 위해 JVM 교체를 결정하게 되었습니다.

JVM 성능 비교

참고1
참고2

OpenJ9은 속도가 느리고, 대신 메모리 사용량에서 압도적인 차이를 보여줍니다.

ZuluVM과 AdoptOpenJDK는 별다른 차이를 보여주지 않았고 (대부분 ZuluVM이 경미한 차이로 앞서긴 했습니다.)

GraalVM은 눈에 띄게 느려지는 경우가 많았는데, 이는

Interesting to see is that GraalVM loads way more classes then the other JDKs.
OpenJDK loads least classes. The difference between GraalVM and OpenJDK is about 25%.
I have not yet determined if this is a fixed amount of additional classes overhead for GraalVM or if this scales with the amount of classes used and this is a fixed percentage.

GraalVM의 JIT 컴파일러로 인해, 메모리 부족이 발생하여 속도가 느려진 것이었습니다.

다행히, 이 문제는 GraalVM 19.3.0에서 해결되었다고 합니다.

JIT 컴파일러를 사전에 Native 라이브러리로 컴파일해두어, JVM 힙과는 별개의 공간을 사용하면서 (기존에는 같은 공간을 사용했습니다) 메모리 문제가 해결되었고,
GraalVM의 단점이었던 느린 시작 시간도 해결되었습니다.

결론

추가적인 테스트를 거쳐, 현재와 별 차이가 없는 AdoptOpenJDK (Hotspot)과 ZuluVM은 제외하였습니다.

또한 메모리 사용량 문제보다는 성능 문제가 중요했기 때문에, OpenJ9 대신 GraalVM으로 결정했습니다.