목차
Valhalla 프로젝트의 동기와 이유
값 유형 값 유형의 개념
Specialized Generics 专用泛型
결론
Java java지도 시간 Java Valhalla 프로젝트에 대해 이야기해 봅시다.

Java Valhalla 프로젝트에 대해 이야기해 봅시다.

Sep 07, 2022 pm 02:07 PM
java

Java Valhalla 프로젝트 소개를 중심으로 java에 대한 관련 지식을 소개하고, 주제에 대한 자세한 소개를 함께 살펴보도록 하겠습니다.

Java Valhalla 프로젝트에 대해 이야기해 봅시다.

추천 학습: "java 비디오 튜토리얼"

이 기사에서는 Valhalla 프로젝트를 소개합니다. 역사적 이유, 현재 개발 상태, 출시 후 일반 Java 개발자에게 가져온 내용 무엇.

Valhalla 프로젝트의 동기와 이유

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原语的运行时行为,如intfloat

但与原语不同,值类型可以有方法和字段。我们还可以实现接口并将其用作泛型类型。

因此,我们可以从两个不同的角度来看值类型:

  • 更快的对象
  • 用户定义原语

作为额外的锦上添花,我们可以使用值类型作为泛型类型,而无需装箱。这直接将我们引向了另一个大型项目Valhalla的特性:专用泛型。

Specialized Generics 专用泛型

当我们想对语言原语进行泛化时,我们目前使用装箱类型,例如整数表示Integer或浮点表示Float。这种装箱创建了一个额外的间接层,从而首先破坏了使用原语提高性能的目的。

因此,我们在现有的框架和库中看到了许多针对基元类型的专门化,如IntStream<T>ToIntFunction<T>。这样做是为了保持使用原语的性能提高。

因此,专门化泛型是为了消除这些“黑客”的需求。相反,Java语言努力为基本上所有东西启用泛型类型:对象引用、原语、值类型,甚至可能是void

🎜🎜 또한 가능합니다. JVM은 값 유형을 힙에 할당할 필요 없이 스택에 전달합니다. 결국 이는 int 또는 float와 같은 Java 기본 요소와 유사한 런타임 동작으로 데이터 집계를 얻음을 의미합니다. 🎜🎜그러나 기본 형식과 달리 값 형식에는 메서드와 필드가 있을 수 있습니다. 인터페이스를 구현하고 이를 일반 유형으로 사용할 수도 있습니다. 🎜🎜🎜따라서 우리는 두 가지 다른 관점에서 값 유형을 볼 수 있습니다: 🎜🎜
  • 더 빠른 객체
  • 사용자 정의 기본 요소
🎜 추가로 추가 즉, 🎜boxing🎜 없이 값 유형을 일반 유형으로 사용할 수 있습니다. 이것은 우리를 또 다른 대규모 프로젝트 Valhalla 기능인 특수 제네릭으로 직접 연결합니다. 🎜🎜특수 제네릭 🎜🎜언어 프리미티브를 일반화하려는 경우 현재 정수 표현 Integer 또는 부동 소수점 표현 Float과 같은 박스형 유형을 사용합니다. 이 박싱은 추가 간접 레이어를 생성하여 애초에 성능을 향상시키기 위해 프리미티브를 사용하는 목적을 무산시킵니다. 🎜🎜따라서 IntStream<t></t> 또는 ToIntFunction<t></t>과 같은 기존 프레임워크 및 라이브러리에서 기본 유형에 대한 많은 특수화를 볼 수 있습니다. 이는 프리미티브 사용의 성능 향상을 유지하기 위해 수행됩니다. 🎜🎜따라서 제네릭을 전문화하는 것은 이러한 "해킹"의 필요성을 없애는 것입니다. 대신 Java 언어는 기본적으로 객체 참조, 프리미티브, 값 유형, 심지어 void까지 모든 것에 대해 일반 유형을 활성화하려고 노력합니다. 🎜

결론

우리는 Valhalla 프로젝트가 Java 언어에 가져올 변화에 대해 사전 이해했습니다. 두 가지 주요 목표는 성능을 향상하고 추상화 누출을 줄이는 것입니다.

성능 향상은 객체 그래프를 평면화하고 간접 참조를 제거하여 해결됩니다. 그 결과 메모리 레이아웃이 더 효율적이고 할당 및 가비지 수집 횟수가 줄어듭니다.

일반 유형으로 사용하면 기본 형식과 개체의 동작이 더 유사해 더 나은 추상화가 됩니다.

추천 학습: "java 비디오 튜토리얼"

위 내용은 Java Valhalla 프로젝트에 대해 이야기해 봅시다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

자바의 완전수 자바의 완전수 Aug 30, 2024 pm 04:28 PM

Java의 완전수 가이드. 여기서는 정의, Java에서 완전 숫자를 확인하는 방법, 코드 구현 예제에 대해 논의합니다.

자바의 웨카 자바의 웨카 Aug 30, 2024 pm 04:28 PM

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 스미스 번호 Java의 스미스 번호 Aug 30, 2024 pm 04:28 PM

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

Java Spring 인터뷰 질문 Java Spring 인터뷰 질문 Aug 30, 2024 pm 04:29 PM

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Feb 07, 2025 pm 12:09 PM

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 날짜까지의 타임스탬프 Java의 날짜까지의 타임스탬프 Aug 30, 2024 pm 04:28 PM

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐의 양을 찾기위한 Java 프로그램 캡슐의 양을 찾기위한 Java 프로그램 Feb 07, 2025 am 11:37 AM

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

미래를 창조하세요: 완전 초보자를 위한 Java 프로그래밍 미래를 창조하세요: 완전 초보자를 위한 Java 프로그래밍 Oct 13, 2024 pm 01:32 PM

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.

See all articles