메타스페이스에는 오프-힙 메모리(off-heap memory) 사용량이 많다는 문제가 있었다. 새로 제안된 계획에서는 기존 메모리 할당자를 버디 기반 할당 체계로 대체해 메모리를 파티션으로 분할하여 메모리 요청을 처리할 수 있는 알고리즘을 제공한다.
해당 접근법은 리눅스 커널(Linux kernel) 등에서 사용돼 왔으며, 클래스-로더 오버헤드를 줄이기 위해 더 작은 청크(chunks)로 메모리를 할당한다는 점에서 실용적이다. 메모리 단편화 또한 줄어든다.
게다가 OS에서 메모리 관리 영역으로 메모리를 할당하는 작업은 필요에 따라 수행된다. 대규모 영역에서 시작하지만 즉시 사용하지 않거나 전체 범위를 사용하지 않는 로더의 풋프린트를 줄인다.
버디 할당이 제공하는 탄력성을 최대한 활용하고자 메타스페이스 메모리는 서로 독립적으로 커밋하거나 언커밋할 수 있는 균일한 크기의 그래뉼(granules)로 처리된다.
• C++ 14 기능 활성화: JDK C++ 소스 코드에서 C++ 14 기능을 사용할 수 있으며, 핫스팟 VM 코드에서 쓸 수 있는 기능과 관련한 구체적인 지침이 제공된다.
JDK 15를 통해 JDK에서 C++ 코드로 사용되는 언어 기능은 C++ 98/03 언어 표준으로 제한됐다. JDK 11에서는 최신 버전의 C++ 표준으로 빌드를 지원하도록 소스 코드가 업데이트됐다. 여기에는 C++ 11/14 기능을 지원하는 최신 버전의 컴파일러로의 빌드가 포함됐다.
이번 제안에서는 핫스팟 외부에서 사용되는 C++ 코드의 스타일이나 용도 변경은 제공하지 않는다. C++ 언어 기능을 활용하려면 플랫폼 컴파일러에 따라 일부 빌드타임 변경이 필요하다.
• 인큐베이터 단계의 벡터 API: 인큐베이터 모듈 ‘jdk.incubator.vector’가 도입된다. 이 모듈은 지원되는 CPU 아키텍처에서 최적의 벡터 하드웨어 명령어로 컴파일되는 벡터 연산을 표현하고, 스칼라(scalar) 연산보다 우수한 성능을 달성한다.
벡터 API는 벡터화를 위해 핫스팟 VM의 기존 지원을 사용하지만 벡터화를 더욱더 예측 가능하고 견고하게 만드는 사용자 모델을 사용해 자바에서 복잡한 벡터 알고리즘을 작성할 수 있는 메커니즘을 제공한다.
목표는 다양한 벡터 연산을 표현하는 명확하고 간결한 API를 제공하는 것, 다중 CPU 아키텍처를 지원하여 플랫폼에 구애받지 않는 것(platform-agnostic), 그리고 X64 및 AArch64 아키텍처에서 안정적인 런타임 컴파일과 성능을 제공하는 것이다.
단계적인 성능 저하(Graceful degradation) 또한 목표다. 만약 아키텍처가 일부 명령을 지원하지 않거나 다른 CPU 아키텍처가 지원되지 않아 벡터 연산이 하드웨어 벡터 명령의 시퀀스로 완전히 표현될 수 없는 경우, 벡터 연산이 단계적으로 저하되지만 계속해서 작동한다.
• 머큐리얼(Mercurial)에서 깃(Git)으로 오픈JDK 소스 코드 리포지토리 마이그레이션: 이는 버전 관리 시스템의 메타데이터 크기와 사용할 수 있는 툴 및 호스팅에서 이점을 제공한다.
• 머큐리얼에서 깃으로의 이전에 이어 기트허브(GitHub)로의 마이그레이션: JDK 16 소스 코드 리포지토리가 인기 있는 소스 공유 사이트에 있게 된다.
리눅스, 윈도우, 맥OS용 JDK 16의 초기 액세스 빌드는 jdk.java.net에서 확인할 수 있다. JDK 15와 마찬가지로, JDK 16은 6개월 동안 지원되는 단기 릴리즈 버전이다. JDK 17은 2021년 9월까지 유지되는 장기지원(LTS) 버전이다. 현재 LTS 버전인 JDK 11은 지난 2018년 9월에 출시됐다. ciokr@idg.co.kr