핵심 요약
- 자바의 시동 속도를 개선하기 위해 도입된 최신 AOT 캐시 기능이 실제 배포 환경에서 심각한 불안정성을 보이고 있습니다.
- 이론상 공짜 성능 향상이지만, 실제로는 호환되지 않아 캐시가 무시되거나 JVM이 갑자기 뻗어버리는 문제가 발생합니다.
- 특히 트레이닝 머신과 사용자 머신의 CPU 지원 명령어(AVX 등) 차이로 인해 SIGILL 에러와 함께 런타임이 통째로 크래시되는 치명적 결함이 확인되었습니다.
요약 자바(Java) 진영에서 애플리케이션의 시작 및 웜업 속도를 높이기 위해 도입한 최신 'AOT(Ahead-of-Time) 캐시' 기능이 실제 배포 환경에서는 심각한 불안정성을 보이고 있다는 개발자의 분석 글이 공유되었습니다.
AOT 캐시는 애플리케이션을 사전 트레이닝하여 어떤 클래스가 로드 및 링크되고 어떤 메서드가 호출되는지를 JVM이 기록한 뒤, 이후 실행 시 초기화 작업을 건너뛰고 이미 링크된 상태의 클래스를 즉시 사용할 수 있도록 돕는 기술입니다. 이론상으로는 코드 수정 없이도 공짜로 시동 속도 향상을 누릴 수 있는 장점이 있습니다. 이는 JDK 5의 CDS(클래스 데이터 공유)에서 발전해 JDK 24(AOT 클래스 로딩/링크), JDK 25(명령어 간소화 및 메서드 프로파일링), JDK 26(객체 캐싱) 등을 거치며 점진적으로 확장되어 왔습니다.
폐쇄 세계 가정(Closed-world assumption) 하에 리플렉션 등을 일일이 수동 설정해야 하는 GraalVM Native Image와 달리, AOT 캐시는 표준 JVM 위에서 기존 자바의 동적 기능을 모두 유지한 채 동작한다는 점을 차별점으로 내세웠습니다.
하지만 실제 데스크톱/서버 앱(XPipe)을 사용자에게 배포하는 환경에 이를 적용해 본 결과, 심각한 문제점들이 드러났습니다. 최선의 상황이라도 호환성 문제로 캐시가 무시되어 성능 이득이 전혀 없으며, 최악의 경우 JVM이 불시에 크래시(Crash)되는 현상이 발생했습니다. 특히 AOT 클래스 링크 과정에서 일부 네이티브 코드가 생성되는데, 빌드/트레이닝을 진행한 머신의 CPU 명령어(예: AVX-512)를 사용자의 실행 머신이 온전히 지원하지 못할 경우 'SIGILL (잘못된 명령어)' 에러와 함께 JVM 자체가 그대로 뻗어버리는 문제가 확인되었습니다. 저자는 "공짜 부스팅인 줄 알았는데 공짜 크래시까지 덤으로 딸려왔다"며 도입 시 각별한 주의가 필요하다고 전했습니다.
Sponsored · 광고