Java Valhalla 프로젝트 소개를 중심으로 java에 대한 관련 지식을 소개하고, 주제에 대한 자세한 소개를 함께 살펴보도록 하겠습니다.
추천 학습: "java 비디오 튜토리얼"
이 기사에서는 Valhalla 프로젝트를 소개합니다. 역사적 이유, 현재 개발 상태, 출시 후 일반 Java 개발자에게 가져온 내용 무엇.
Oracle의 Java 언어 설계자 Brian Goetz는 연설에서 Valhalla 프로젝트의 주요 동기 중 하나는 Java 언어와 런타임을 최신 하드웨어에 적용하려는 열망이라고 말했습니다. Java 언어가 탄생했을 때(이 글을 쓴 약 25년 전) 메모리 액세스 및 산술 연산 비용은 거의 같았습니다.
요즘에는 상황이 바뀌었습니다. 메모리 가져오기 작업은 산술 연산보다 200~1000배 더 비쌉니다. 언어 설계 측면에서 이는 포인터 추출을 초래하는 간접 작업이 전체 성능에 부정적인 영향을 미칠 수 있음을 의미합니다.
애플리케이션의 대부분 Java 데이터 구조는 객체이므로 Java를 포인터 집약적 언어로 생각할 수 있습니다(비록 일반적으로 직접 보거나 조작하지는 않지만). 이 포인터 기반 개체 구현은 다형성, 가변성 및 잠금과 같은 언어 기능에 사용되는 개체 식별을 활성화하는 데 사용됩니다. 기본적으로 이러한 속성은 실제로 필요한지 여부에 관계없이 모든 개체에 적용됩니다.
포인터로 이어지는 ID 체인과 간접 참조로 이어지는 포인터 체인에 이어 간접 참조에는 성능 단점이 있으며 논리적 결론은 필요하지 않은 데이터 구조를 제거하는 것입니다. 이것이 가치 유형이 작용하는 곳입니다.
은 순수한 데이터 집계를 나타내는 것입니다. 이렇게 하면 일반 개체에서 기능이 제거됩니다. 따라서 우리는 신원이 없는 순수한 데이터만 갖고 있습니다. 물론 이는 객체 식별을 사용하여 달성할 수 있는 기능도 상실한다는 의미입니다. 따라서 동등 비교는 상태를 기준으로만 이루어질 수 있습니다. 따라서 표현 다형성을 사용할 수 없으며 불변 객체나 nullable이 아닌 객체도 사용할 수 없습니다.
더 이상 객체 ID가 없으므로 포인터를 버리고 객체 대신 값 유형의 일반 메모리 레이아웃을 변경할 수 있습니다. 클래스 포인트와 해당 값 유형 포인트 간의 메모리 레이아웃을 비교해 보겠습니다.
일반 Point 클래스의 코드 및 해당 메모리 레이아웃은 다음과 같습니다.
final class Point { final int x; final int y; }
반면, 값 유형 Point의 코드 및 해당 메모리 레이아웃은 다음과 같습니다.
value class Point { int x; int y }
이를 통해 JVM Flatten 값 유형을 배열, 객체 및 기타 값 유형으로 만들 수 있습니다.
아래 이미지에서는 배열에서 Point 클래스를 사용할 때 간접적인 부정적인 효과를 보여줍니다.
반면, 여기서는 값 유형 Point[] 메모리 구조: <code>Point[]
的相应内存结构:
它还使JVM能够在栈上传递值类型,而不必在堆上分配它们。最后,这意味着我们得到的数据聚合具有类似于Java原语的运行时行为,如int
或float
。
但与原语不同,值类型可以有方法和字段。我们还可以实现接口并将其用作泛型类型。
因此,我们可以从两个不同的角度来看值类型:
作为额外的锦上添花,我们可以使用值类型作为泛型类型,而无需装箱。这直接将我们引向了另一个大型项目Valhalla的特性:专用泛型。
当我们想对语言原语进行泛化时,我们目前使用装箱类型,例如整数表示Integer
或浮点表示Float
。这种装箱创建了一个额外的间接层,从而首先破坏了使用原语提高性能的目的。
因此,我们在现有的框架和库中看到了许多针对基元类型的专门化,如IntStream<T>
或ToIntFunction<T>
。这样做是为了保持使用原语的性能提高。
因此,专门化泛型是为了消除这些“黑客”的需求。相反,Java语言努力为基本上所有东西启用泛型类型:对象引用、原语、值类型,甚至可能是void
int
또는 float
와 같은 Java 기본 요소와 유사한 런타임 동작으로 데이터 집계를 얻음을 의미합니다. 🎜🎜그러나 기본 형식과 달리 값 형식에는 메서드와 필드가 있을 수 있습니다. 인터페이스를 구현하고 이를 일반 유형으로 사용할 수도 있습니다. 🎜🎜🎜따라서 우리는 두 가지 다른 관점에서 값 유형을 볼 수 있습니다: 🎜🎜Integer
또는 부동 소수점 표현 Float
과 같은 박스형 유형을 사용합니다. 이 박싱은 추가 간접 레이어를 생성하여 애초에 성능을 향상시키기 위해 프리미티브를 사용하는 목적을 무산시킵니다. 🎜🎜따라서 IntStream<t></t>
또는 ToIntFunction<t></t>
과 같은 기존 프레임워크 및 라이브러리에서 기본 유형에 대한 많은 특수화를 볼 수 있습니다. 이는 프리미티브 사용의 성능 향상을 유지하기 위해 수행됩니다. 🎜🎜따라서 제네릭을 전문화하는 것은 이러한 "해킹"의 필요성을 없애는 것입니다. 대신 Java 언어는 기본적으로 객체 참조, 프리미티브, 값 유형, 심지어 void
까지 모든 것에 대해 일반 유형을 활성화하려고 노력합니다. 🎜우리는 Valhalla 프로젝트가 Java 언어에 가져올 변화에 대해 사전 이해했습니다. 두 가지 주요 목표는 성능을 향상하고 추상화 누출을 줄이는 것입니다.
성능 향상은 객체 그래프를 평면화하고 간접 참조를 제거하여 해결됩니다. 그 결과 메모리 레이아웃이 더 효율적이고 할당 및 가비지 수집 횟수가 줄어듭니다.
일반 유형으로 사용하면 기본 형식과 개체의 동작이 더 유사해 더 나은 추상화가 됩니다.
추천 학습: "java 비디오 튜토리얼"
위 내용은 Java Valhalla 프로젝트에 대해 이야기해 봅시다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!