자바 발할라 프로젝트

1. 개요

이 기사에서는 프로젝트 Valhalla에 대해 살펴볼 것입니다. 그 역사적 이유, 현재 개발 상태 및 출시 후 일상적인 Java 개발자를위한 테이블에 가져 오는 내용입니다.

2. 발할라 프로젝트의 동기와 이유

Oracle의 Java 언어 설계자 인 Brian Goetz는 연설 중 하나에서 Valhalla Project의 주요 동기 중 하나 는 Java 언어와 런타임을 최신 하드웨어적용 하려는 열망이라고 말했습니다 . 자바 언어가 구상되었을 때 (작성 당시 약 25 년 전), 메모리 가져 오기 및 산술 연산 비용은 거의 동일했습니다.

요즘에는 메모리 가져 오기 작업이 산술 연산보다 200 배에서 1,000 배 더 비싸지면서 이런 상황이 바뀌 었습니다. 언어 디자인 측면에서 이것은 포인터 가져 오기로 이어지는 간접적 인 방향이 전체 성능에 해로운 영향을 미친다는 것을 의미합니다.

응용 프로그램의 대부분의 Java 데이터 구조는 객체이기 때문에 Java를 포인터가 많은 언어로 간주 할 수 있습니다 (일반적으로 직접 보거나 조작하지 않음). 이 포인터 기반 객체 구현은 객체 ID를 활성화하는 데 사용되며 다형성, 가변성 및 잠금과 같은 언어 기능에 자체적으로 활용됩니다. 이러한 기능은 실제로 필요한지 여부에 관계없이 모든 개체에 대해 기본적으로 제공됩니다.

포인터와 포인터로 이어지는 ID 체인을 따라 간접적으로 성능이 저하되는 경우 논리적 결론은 필요없는 데이터 구조의 경우 제거하는 것입니다. 이것이 가치 유형이 작용하는 곳입니다.

3. 값 유형

값 유형의 개념은 순수한 데이터 집합나타내는 것 입니다. 이것은 일반 개체의 기능을 삭제하는 것과 함께 제공됩니다. 그래서 우리는 정체성이없는 순수한 데이터를 가지고 있습니다. 이것은 물론 객체 아이덴티티를 사용하여 구현할 수있는 기능도 손실된다는 것을 의미합니다. 결과적으로 같음 비교는 상태를 기준으로 만 발생할 수 있습니다. 따라서 우리는 표현 적 다형성을 사용할 수 없으며, 변경 불가능하거나 널 불가능한 객체를 사용할 수 없습니다.

더 이상 객체 ID가 없기 때문에 포인터를 포기하고 객체와 비교하여 값 유형의 일반적인 메모리 레이아웃을 변경할 수 있습니다. Point 클래스 와 해당 값 유형 Point 사이의 메모리 레이아웃 비교를 살펴 보겠습니다 .

일반 Point 클래스 의 코드 및 해당 메모리 레이아웃 은 다음과 같습니다.

final class Point { final int x; final int y; }

반면에 Point 값 유형의 코드 및 해당 메모리 레이아웃 은 다음과 같습니다.

value class Point { int x; int y }

이를 통해 JVM은 값 유형을 배열 및 객체뿐만 아니라 다른 값 유형으로 평면화 할 수 있습니다. 다음 다이어그램에서는 배열에서 Point 클래스를 사용할 때 간접적 영향의 부정적인 영향을 보여줍니다 .

반면에, 여기에서는 Point [] 값 유형의 해당 메모리 구조를 볼 수 있습니다 .

또한 JVM이 값 유형을 힙에 할당하지 않고 스택에 전달할 수 있습니다. 결국 이는 int 또는 float 와 같은 Java 기본 요소와 유사한 런타임 동작을 갖는 데이터 집합체를 얻고 있음을 의미합니다 .

그러나 기본 형식과 달리 값 형식에는 메서드와 필드가있을 수 있습니다. 인터페이스를 구현하고이를 제네릭 유형으로 사용할 수도 있습니다. 따라서 두 가지 각도에서 값 유형을 볼 수 있습니다.

  • 더 빠른 개체
  • 사용자 정의 프리미티브

케이크에 대한 추가 장식으로 값 유형을 권투없이 일반 유형으로 사용할 수 있습니다. 이것은 우리를 다른 큰 Project Valhalla 기능인 특수 제네릭으로 직접 연결합니다.

4. 전문 제네릭

언어 프리미티브를 통해 생성하려는 경우 현재 Integer for int 또는 Float for float 와 같은 boxed 유형을 사용 합니다. 이 복싱은 추가적인 간접 레이어를 생성하여 성능 향상을 위해 기본 요소를 사용하는 목적을 무너 뜨립니다.

따라서 IntStream 또는 ToIntFunction 과 같은 기존 프레임 워크 및 라이브러리의 기본 유형에 대한 많은 전용 전문화를 볼 수 있습니다 . 이것은 프리미티브 사용의 성능 향상을 유지하기 위해 수행됩니다.

따라서 특수 제네릭은 이러한 "해킹"의 필요성을 제거하기위한 노력입니다. 대신, Java 언어는 기본적으로 모든 것에 대한 일반 유형을 활성화하려고 노력합니다 : 객체 참조, 프리미티브, 값 유형, 심지어 void .

5. 결론

프로젝트 Valhalla가 Java 언어에 가져올 변경 사항을 살펴 보았습니다. 주요 목표 중 두 가지는 향상된 성능과 덜 유출 된 추상화입니다.

성능 향상은 개체 그래프를 평평하게하고 간접을 제거함으로써 해결됩니다. 이는보다 효율적인 메모리 레이아웃과 더 적은 할당 및 가비지 콜렉션으로 이어집니다.

더 나은 추상화는 일반 유형으로 사용될 때 더 유사한 동작을 갖는 기본 및 객체와 함께 제공됩니다.

기존 유형 시스템에 값 유형을 도입 한 프로젝트 Valhalla의 초기 프로토 타입은 코드 이름 LW1을 갖습니다.

해당 프로젝트 페이지 및 JEP에서 프로젝트 Valhalla에 대한 자세한 정보를 찾을 수 있습니다.

  • 프로젝트 발할라
  • JEP 169 : 가치 객체
  • JEP 218 : 기본 유형에 대한 제네릭