본문 바로가기

CS study/java

[JVM]Java 21과 JVM, 새로운 GraalVM을 사용하는 이유에 대해

 

Java 21을 사용하며 GraalVM이 생겼다고 한다. 
이는 기존의 JVM 구조의 한계점을 극복하기 위해서인데, 다음과 같이 이해하면 좋을 것 같아 내용을 정리하였다.

 

https://mangkyu.tistory.com/301

 

[Java] Hotspot VM의 한계(JIT, Just-In-Time 컴파일러)와 이를 극복하기 위한 GraalVM의 등장

이번에는 Hotspot VM의 한계와 이를 극복하기 위한 GraalVM에 대해 알아보도록 하겠습니다. 1. Hotspot VM과 JIT 컴파일러(Just-In-Time Compiler) [ C 언어의 동작 방식 ] C, C++, GoLang, Rust 등과 같은 컴파일 언어는

mangkyu.tistory.com

 

망나니 개발자님의 블로그를 많이 참조하였다. 정말 좋은 내용들이니 한번 확인해보면 좋을 것 같다.

 

1. JAVA의 막강한 특징 : 플랫폼 독립적인 특성

JAVA의 특성인 어디서나 이식하기 위해서는, 일단 JVM을 설치하고 이 JVM이 읽을 수 있는 바이트코드를 만드는 과정이 있다.

 

Java는 플랫폼 독립적인 특성을 가지기 위해 JVM을 사용하며, JVM이 바이트코드를 실행할 수 있도록 컴파일하는 과정이 필요하다.

 

바이트코드 - JVM의 관계로 인해 운영체제에 상관없이 모든 파일을 공유할 수 있다.

 

2. 바이트코드 -> 기계어로 변경하는 과정에서 JIT Complier가 쓰인다.

 

하지만 실행 시에 바이트 코드를 기계어로 번역하는 작업 때문에 성능이 느려졌다. 

그래서 이러한 문제를 해결하고자 바이트 코드를 기계어로 컴파일하는 JIT(Just-In-Time) 컴파일러 를 도입하여 사용하고 있었다.

 

JIT 컴파일러는 바이트코드를 실행하기 직전에, 즉 'just-in-time'에 해당 바이트코드를 기계어로 변환한다.

 

그리고 이 과정에서 많은 loss가 생겨, 변환 과정을 효율적으로 만드는 과정을 고민하는 과정이 필요했다.


3. HotSpot Compiler

기존의 JVM(Java Virtual Machine)은 주로 C++로 구현된 HotSpot 컴파일러를 사용했다고 한다.

 

HotSpot VM은 성능 최적화에 중점을 두고 있으며, 특히 JIT 컴파일러를 효과적으로 사용한다.

HotSpot VM 내에는 주로 두 가지 타입의 JIT 컴파일러가 있다. C1(클라이언트 컴파일러)과 C2(서버 컴파일러) 이다.

 

 

c1 클라이언트 컴파일러(Client Compiler)

- 코드 최적화는 덜하지만 즉시 시작되는 속도는 빠름
- 즉시 실행되는 데스크톱 애플리케이션 등에 적합

c2 서버 컴파일러(Server Compiler)

- 즉시 시작되는 속도는 느리지만 최적화는 많이 되어 warm-up 후에는 빠름
- 장기 실행되는 서버 애플리케이션 등에 적합함

4. 한계점

한계점이라고 여겨지는 부분이 기존 C2 Compiler는 C++ 기반으로 이루어졌다는 점이다.

 

HotSpot은 99년도에 나왔고, 오랜 연구 결과 끝에 많은 최적화가 구현되어 있다.

C2 컴파일러는 극도로 최적화가 많이 되어 있어서 컴파일 언어를 능가하는 성능을 보여주기도 한다. 최적화에는 프로파일링을 통해 얻은 정보들(디바이스 정보, 클럭 수 등)이 사용되며, 자바의 성능 향상은 이러한 프로파일링을 통해 얻어낸 정보를 바탕으로 하는 JIT 컴파일러의 최적화 역할이 크다.

 

JIT 컴파일러는 느리지 않으며, 오히려 엄청난 최적화로 인해 컴파일된 언어보다 뛰어난 성능을 보이기도 한다. 대신 더 이상 유지보수하기 어려운 한계에 직면한 상황이다.


하지만 문제는 HotSpot VM의 C2 컴파일러가 한계에 직면했다는 것이다. 

C2 컴파일러는 C++로 작성되어 개발자를 구하기도 어렵고 복잡하다.

이러한 이유로 최적화와 유지보수가 어렵다고 판단하였다. 즉, C2 컴파일러가 이제 End-of-life에 직면한 것이다.

 

https://bugs.openjdk.org/browse/JDK-8076112


- C++ 개발자를 구하기 어려움
- 오래된 만큼 상당히 복잡함
- 최근에 중요한 최적화가 거의 없었음

그래서 최적화가 더 이상 어려운 코드들은 HotSpotInstrinsicCandidate 어노테이션을 붙이도록 하는 작업들도 진행되었다. 한계에 마주한 상황을 인정하고 애노테이션으로 명시해두는 것이다.


그래서 이에 대한 대안으로 등장한 것이 바로 GraalVM이다.

 

5. GraalVM을 사용한 개선점

 

개선된 장점을 정리하면 다음과 같을 것이다.

 

언어의 일관성과 개발 용이성 (유지보수)

기존 C2 컴파일러는 C++로 작성되었는데, 이는 자바 개발자들에게는 다소 낯선 환경이었다. 

Graal 컴파일러는 자바로 작성되어 있어 자바 개발자들이 보다 쉽게 이해하고 수정할 수 있다. 


성능 최적화의 유연성

Graal 컴파일러는 최신 JIT 컴파일 기술을 사용하여 더욱 세밀한 성능 최적화를 제공한다. Java로 작성된다는 점은 이러한 최적화 기술을 더 빠르게 실험하고 적용할 수 있게 해준다.


플랫폼 간 이식성

Java로 작성된 Graal 컴파일러는 JVM 상에서 동작하기 때문에, 다양한 플랫폼에서 보다 쉽게 실행될 수 있다. 이는 Java의 기본 철학인 "한 번 작성하면 어디서나 실행된다(Write Once, Run Anywhere)"에 부합한다.

 

언어 간 상호 운용성

GraalVM은 여러 언어 간의 상호 운용성에도 중점을 두고 있다. GraalVM은 Java뿐만 아니라 JavaScript, Ruby, R 등 다양한 언어를 지원하며, 이러한 언어들 간의 통합을 용이하게 만든다.

 

 

Graal과 AoT 컴파일러

 

https://mangkyu.tistory.com/302

 

[Java] GraalVM이 제공하는 네이티브 이미지(Native Image)

이번에는 GraalVM이 제공하는 네이티브 이미지(Native Image)에 대해 알아보도록 하겠습니다. 1. GraalVM의 AoT 컴파일러(Ahead-of-Time 컴파일러) [ GraalVM이 제공하는 새로운 기술 ] GraalVM은 자바와 다른 JVM 언

mangkyu.tistory.com

 

참조

 

 

https://symflower.com/en/company/blog/2023/what-is-new-in-java-21/

 

JDK 21: What is new in Java 21?

Java 21 is out on 19 Sep 2023. Find out what is new in JDK 21, with descriptions and examples of the updates in this release!

symflower.com

 

https://velog.io/@new_ego_doc/GraalVM%EB%9E%80

 

GraalVM란?

GraalVM의 VM은 JVM 내부에서 실행된다는 사실에서 비롯 되었으며 GraalVM은 Oracle이 만든 JVM과 JDK으로 애플리케이션 성능과 효율성의 향상을 제공하는 고성능 런타임이다.

velog.io

 

https://mangkyu.tistory.com/301

 

[Java] Hotspot VM의 한계(JIT, Just-In-Time 컴파일러)와 이를 극복하기 위한 GraalVM의 등장

이번에는 Hotspot VM의 한계와 이를 극복하기 위한 GraalVM에 대해 알아보도록 하겠습니다. 1. Hotspot VM과 JIT 컴파일러(Just-In-Time Compiler) [ C 언어의 동작 방식 ] C, C++, GoLang, Rust 등과 같은 컴파일 언어는

mangkyu.tistory.com

 

https://velog.io/@ddangle/Java-JIT-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-sfbp9dtu

 

[Java] JIT 컴파일러

JIT 컴파일러에 대해 딥다이브!

velog.io

 

https://velog.io/@aki/HotSpot-JVM#hotspot-jvm%EC%9D%B4%EB%9E%80

 

HotSpot JVM

Hotspot은 말 그대로 Hot한 Spot을 찾아서 해당 부분에서는 JIT 컴파일러를 사용하는 방법이다. 내부적으로 프로파일링을 통해 핫스팟을 찾아내고, 해당 부분에 대한 네이티브 코드를 생성한다.

velog.io