자바의 공식 마스코트 ‘듀크’와 공식 로고(출처=오라클)
|

자바의 숙원 ‘프로젝트 발할라’ 마침내 JDK 포함

자바 플랫폼의 성능과 메모리 효율성을 높이는 숙원 사업 ‘프로젝트 발할라(Project Valhalla)’가 12년만에 드디어 오픈JDK 메인라인에 통합된다. 이달중 나올 오픈JDK 28에 프로젝트 발할라의 일부인 ‘값 클래스와 객체(Value Classes and Objects, JEP 401)’가 미리보기로 포함될 예정이다. 커뮤니티는 내년 나올 장기지원(LTS) 버전인 오픈JDK 29에 정식 출시될 지 주목하고 있다.

로이스 폴탄 오라클 소프트웨어 엔지니어는 지난달 8일 “‘JEP 401: 값 클래스 및 객체(미리보기)’가 7월초 JDK 28의 오픈JDK 메인라인 통합된다”고 밝혔다.

그는 “발할라 팀은 현재 JEP 401: 값 클래스 및 객체와 JEP: JVM의 엄격한 필트 초기화를 위한 작업을 진행하고 있다”며 “이는 매우 큰 변경 사항이며, 통합 작업도 상당한 시간이 소요될 것”이라고 적었다.

그는 “따라서 오픈JDK 커미터는 저장소를 크게 수정해야 하는 대규모 커밋이나 전체 코드를 리팩토링하는 커밋을 자제해달라”며 “정기적으로 병합 및 테스트를 진행하고 있는데, 통합 단계로 나아가면서 성공적 통합을 위해 도움이 절실히 필요하다”고 덧붙였다.

JEP 401의 첫 미리보기에 대한 풀리퀘스트(PR)은 1816개의 파일과 19만70000줄 이상의 코드를 추가한다.

프로젝트 발할라는 자바 언어와 자바가상머신(JVM)의 메모리 구조, 데이터 모델을 혁신하는 프로젝트다. 객체 식별자를 없애고 값 객체와 특화된 제네릭을 도입해 메모리 효율을 극대화하고 성능을 혁신하는 것을 목표로 한다. 2014년 시작돼 12년째 진행중이다.

‘클래스처럼 코딩하고, 기본 타입처럼 작동한다(Codes like a class, works like an int)’를 기치로 걸었다.

자바의 데이터 타입은 int, char, byte, double 같은 기본 타입(Primitive Type)과, 참조 타입(Reference Type) 등으로 나뉜다. 기본 타입은 빠른 성능을 내지만, 메서드를 가질 수 없고 제네릭에 넣을 수 없으며, 다형성을 쓸 수 없다. 참조 타입은 자바 언어의 모든 타입을 이루고, 일반적 클래스 객체들은 힙(Heap) 메모리에 생성되는데, 유연하지만 메모리 낭비와 성능 저하가 심하다.

발할라는 또한 제네릭에 값 객체나 기본 타입을 그대로 넣을 수 있게 해, 쓸데없는 박싱・언박싱 오버헤드를 제거하고, 가비지 컬렉터(GC)의 부담을 줄일 수 있다.

프로젝트 발할라에서 JEP 401은 객체 식별자를 없앤 값 객체를 도입하는 것이다. 두 객체의 주소가 달라도 내부 필드 값이 같으면 두 객체를 같은 것으로 간주한다. 식별자가 없으므로 JVM이 객체를 힙에 만들지 않고, 기본 타입처럼 메모리 평탄화를 수행할 수 있다.

JEP 401은 ‘Interger’ 같은 일부 JDK 클래스를 값 클래스로 마이그레이션하며, 마이그레이션되는 클래스의 수는 점차 증가할 것으로 예상된다. 개발자는 자신만의 값 클래스를 만들 수 있게 된다.

JEP 401의 여러 목표 중 하나는 JVM의 성능 극대화 방식으로 값 객체를 저장할 수 있게 자유를 주는 것이다.

프로젝트 발할라가 완전히 도입되면 자바 플랫폼의 객체지향언어로서 성격을 유지하면서도, C++이나 러스트에 준하는 메모리 효율과 데이터 처리 속도를 얻을 수 있게 된다. 대규모 데이터를 다뤄야 하는 환경이나 AI 연산에서 자바의 성능을 한단계 업그레이드시킬 것으로 기대된다.

하지만, 복잡한 변경 사항을 담고 있어 개발 기간이 계속 길어졌다. 특히 기존 수십억 라인의 자바 코드와 하위 호환성을 유지하는 문제가 가장 컸다. 커뮤니티 내부에 실패할 것이란 회의론도 크다.

자바 아키텍트인 브라이언 고츠는 지난달 레딧의 JEP 401 병합에 대한 질문에 단 댓글에서 “이건 발할라의 첫번째 단계이고, ‘절대 안 나올 거야, 발할라는 언제 나오는 거야?’라고 말하는 사람도 곧 ‘아직 가장 중요한 부분도 안 나왔잖아’라고 말을 바꿀 것”이라고 적기도 했다.

그는 “JEP 401은 객체 동일성을 배제함으로써 이러한 제약 조건의 첫 번째 단계를 무너뜨리고, 특히 작은 객체에 대해 많은 새로운 최적화 가능성을 열어준다”며 “하지만 객체를 값 의미론으로 완전히 다루려면 더 많은 것을 포기해야 한다”고 설명했다.

그는 “바로 null 처리와 경쟁 조건 하에서의 원자성 안전성(ASUR)”이라며 “많은 언어들이 이를 구현하거나 구현하려고 노력하고 있고, 주요 과제는 객체 무결성과 캡슐화에 대한 우리의 기존 개념과 충돌하지 않도록 사용자 모델에 어떻게 구현하느냐이며, 클래스는 좋든 나쁘든 매우 효과적인 추상화 장벽”이라고 덧붙였다.

다만, 프로젝트 발할라팀의 목표나 커뮤니티의 바람대로 JDK29에 정식 출시될 것이란 기대하기엔 일러 보인다.

브라이언 고츠는 “JDK29 버전에서 프리뷰 종룔르 바라는 건 다소 낙관적인 생각”이라며 “벡터 API는 발할라의 기본 VM 프리미티브를 기반으로 재구성되면 인큐베이션 단계를 벗어날 수 있을 것”이라고 밝혔다.

그는 “좋든 나쁘든 발할라는 의도적인 동작적 비호환성을 도입했다”며 “평소보다 짧은 미리보기 기간을 기대하지는 마라”고 덧붙였다.

일간 바이라인 구독하기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다


The reCAPTCHA verification period has expired. Please reload the page.