기술

Java 27, 앱을 멈쳐세우던 GC 제거하고 객체 메모리 33% 절감

Adrian Kessler
Google에서 추가하기

Java 27이 모든 JVM에 적용될 두 가지 변경 사항을 포함하고 출시됐다. G1 가비지 컬렉터가 이제 모든 Java 런타임의 기본값이 되면서, 제한된 하드웨어에서도 스톱-더-월드(Stop-the-World) 방식의 Serial 컬렉터 사용이 종료됐으며, 객체 헤더 크기가 96비트에서 64비트로 줄어들어 대량의 객체를 생성하는 모든 애플리케이션의 오버헤드를 3분의 1가량 감소시켰다.

Serial 컬렉터는 Java에서 가장 오래된 GC로, 단순하고 예측 가능하지만 치명적인 단점이 있었다. 실행될 때마다 힙이 정리될 때까지 전체 애플리케이션이 멈췄다. 대용량 메모리, 멀티 CPU 서버에서는 이런 트레이드오프가 수년 전부터 더 이상 유지되기 어려워져, Java 9부터 G1이 서버용 기본 GC로 자리 잡았다. 하지만 싱글 CPU 머신, 소형 클라우드 VM, 저메모리 임베디드 시스템 같은 제한된 환경에서는 Java 26까지도 Serial이 기본값으로 사용됐다. 이 기본값이 Java 27부터 종료된다.

G1은 힙을 작은 영역(region)으로 나누고 점진적으로 수집하며, 가장 많은 가비지가 쌓인 영역을 우선 처리한다. 그래서 이름이 ‘Garbage-First’다. GC 중단 자체는 여전히 발생하지만, Serial의 전체 수집(full collection)보다 지속 시간이 짧고 예측 가능성이 높다. 오라클(Oracle)은 이제 G1이 모든 힙 크기에서 Serial과 경쟁력 있는 수준이라고 밝혔다. 가장 저렴한 클라우드 인스턴스(CPU 1개, RAM 1GB)에 애플리케이션을 배포하는 개발자에게 Java 27은 수년간 견뎌야 했던 불편을 제거해준다.

컴팩트 객체 헤더 변경은 이번 릴리스의 또 다른 핵심이다. Java 객체는 타입 정보, 해시 코드, 락킹 상태 등의 메타데이터를 담고 있으며, 이는 모든 객체에 붙는 헤더에 저장된다. 기존 형식은 96비트를 사용했다. Java 27은 이를 64비트로 압축해 객체당 33%의 오버헤드를 줄였다. 메시지 큐, 금융 원장, 이벤트 기반 마이크로서비스 등 수백만 개의 객체를 생성하는 애플리케이션에서는 누적 효과가 확연하다. 힙이 더 조밀해지고 CPU 캐시 활용도가 개선되며, GC 주기도 줄어든다.

두 변경 사항 모두 주의할 점이 있다. Serial GC 동작에 맞춰 정밀하게 튜닝된 애플리케이션은 업그레이드 후 예상치 못한 타이밍 차이를 경험할 수 있다. G1은 Serial보다 북키핑(bookkeeping)에 더 많은 메모리를 사용하므로, 메모리 예산이 매우 빠듯한 환경에서는 문제가 될 수 있다. 다만 오라클 테스트에 따르면 대부분의 워크로드에서는 처리량 차이가 무시할 수 있는 수준이다. 제한된 시스템에 Java 27을 배포하는 개발팀은 출시 전에 새 기본값을 대상으로 충분히 테스트해야 한다. 전환은 자동으로 이루어지지만, 눈에 띄지 않는 변화는 아니다.

Java 27은 또한 TLS 1.3을 위한 포스트퀀텀 하이브리드 키 교환을 추가했다. 기존 X25519 타원곡선 키 교환과 함께 ML-KEM 알고리즘을 구현한 것이다. 오늘 협상된 TLS 연결은 이론적으로 미래의 양자 컴퓨터가 가로챈 데이터를 복호화할 수 있다. 하이브리드 키 교환은 공격자가 고전 알고리즘과 포스트퀀텀 알고리즘을 동시에 깨야만 하도록 만들어 이를 방어하며, 민감한 데이터를 처리하는 모든 Java 서비스에 의미 있는 추가 기능이다.

Java 27은 플랫폼의 6개월 릴리스 주기에 따라 2026년 9월 15일에 출시됐다. 구조적 동시성(Structured Concurrency)과 지연 상수(Lazy Constants)는 이번 버전에서도 프리뷰 기능으로 남아 있다. Java 시리즈의 다음 장기 지원 릴리스는 2027년으로 예상된다.

태그: , , , , ,

Google에서 추가하기

토론

댓글 0개가 있습니다.