목차
1. 왜 외국 기능 및 메모리 API가 필요합니까?
2. 핵심 구성 요소에 대한 자세한 설명
2. Valuelayout 및 MemoryLayout : 메모리 레이아웃 정의
3. Symbollookup : 로컬 기능 기호를 찾으십시오
4. FunctionDescriptor 및 MethodHandle : 외부 함수를 정의하고 호출합니다
예 : C printf c
3. 사용자 정의 로컬 라이브러리 호출 (간단한 예)
IV. 경기장 : 메모리 수명주기 관리
5. JNI에 비해 장점
6. 현재 상태 및 예방 조치
Java java지도 시간 Java 21의 외래 기능 및 메모리 API

Java 21의 외래 기능 및 메모리 API

Jul 29, 2025 am 01:16 AM
java api

Java 21은 외국 기능 및 메모리 API를 도입하여 JNI의 복잡성, 불량 및 대규모 성능 오버 헤드를 해결했습니다. 2. 핵심 구성 요소에는 MemorySegment (메모리 추상화), ValuelAyout/MemoryLayout (메모리 레이아웃), Symbollookup (함수 심볼 조회), FunctionDescriptor 및 MethodHandle (기능 호출 정의), Arena (메모리 라이프 사이클 관리); 3. Pure Java Code는 C 코드를 작성하거나 메모리를 수동으로 관리하지 않고 로컬 기능을 호출하고 해외 메모리를 안전하고 효율적으로 작동 할 수 있습니다. 4. JNI와 비교하여 FFM API는 더 강력한 유형 안전, 자동 메모리 관리, 더 나은 성능 및 더 높은 보안을 제공합니다. 5. 현재 Java에서 21의 미리보기 기능에는 활성화 예약이 필요합니다. 생산 환경에서 사용하는 것이 권장되지 않으며 공식적으로 후속 버전으로 출시 될 것으로 예상됩니다.

Java 21의 외래 기능 및 메모리 API

Java 21은 Java 프로그램이 로컬 라이브러리 (예 : C/C로 작성된 동적 링크 라이브러리)를 안전하고 효율적으로 호출하고 오프 HEAP 메모리와 상호 작용할 수 있도록 설계된 중요한 새로운 기능인 외부 기능 및 메모리 API (FFM API)를 소개합니다. 장기적이지만 문제가있는 JNI (Java Native Interface)를 대체하여 기본 코드와의 상호 운용성을 처리 할 수있는보다 현대적이고 간결하며 안전한 방법을 제공합니다.

Java 21의 외래 기능 및 메모리 API

이 API의 핵심 목표는 Java가 로컬 기능과 메모리가 자연스럽게 로컬 방법을 호출하는 동시에 JNI의 복잡성과 보안 위험을 피할 수 있도록하는 것입니다.


1. 왜 외국 기능 및 메모리 API가 필요합니까?

Java 21 이전에는 기본 코드와 상호 작용하는 것은 주로 JNI 에 의존하지만 많은 문제가 있습니다.

Java 21의 외래 기능 및 메모리 API
  • 복잡하고 복잡한 : C 코드를 작성하고 헤더 파일 생성, 공유 라이브러리 컴파일이 필요하며 개발 프로세스는 원활하지 않습니다.
  • 오류가 발생하기 쉬운 : 메모리 및 유형 변환을 수동으로 관리하면 충돌 (예 : Segfaults)이 쉽게 이어질 수 있습니다.
  • 성능 오버 헤드 : JNI 통화는 컨텍스트 전환 비용이 높습니다.
  • 보안 불량 : 포인터의 직접 작동, 메모리 액세스 경계 점검.

외국 기능 및 메모리 API의 출현은 이러한 문제를 해결하는 것이며 외부 기능 호출 및 메모리 작업을 구현하는 순수한 Java 방법을 제공합니다.


2. 핵심 구성 요소에 대한 자세한 설명

FFM API는 주로 java.lang.foreign 패키지에 위치한 다음 주요 클래스로 구성됩니다.

Java 21의 외래 기능 및 메모리 API

1. MemorySegment : 오프 펙 메모리의 추상화

MemorySegment 연속 메모리 영역을 나타내며, 이는 힙 안팎 또는 로컬 메모리에있을 수 있습니다. 원시 메모리의 안전한 캡슐화입니다.

 // 오프 하이프 메모리의 100 바이트를 할당하려면 (MemorySegment segment = memorysegment.allocatenative (100)) {
    segment.set (java_int, 0, 42); // 오프셋 0에서 int를 쓰십시오
    int value = segment.get (java_int, 0); // system.out.println (value)을 읽습니다. // 출력 42
}
  • 로컬 메모리를 할당하려면 allocateNative() 를 사용하십시오.
  • set() / get() 메소드를 사용하여 입력 된 읽기 및 쓰기를 위해 ValueLayout (예 : JAVA_INT )와 협력하십시오.
  • 메모리가 제 시간에 해제되도록 try-with-resources 로 사용해야합니다.

2. Valuelayout 및 MemoryLayout : 메모리 레이아웃 정의

기본 유형, 구조, 어레이 등과 같은 데이터 구조의 레이아웃을 설명하는 데 사용됩니다.

 valuelayout.ofint int = valuelayout.java_int;
SequenCelayout arraylayout = MemoryLayout.SequenCelayout (10, int); // int [10]

이 레이아웃은 기능 매개 변수 유형 또는 구조 맵을 구축하는 데 사용될 수 있습니다.

3. Symbollookup : 로컬 기능 기호를 찾으십시오

동적 라이브러리에서 기능 주소를 찾는 데 사용됩니다.

 Symbollookup Lookup = Symbollookup.libraryLookup ( "libc.so.6"); // Linux
// 또는 symbollookup.libraryLookup ( "msvcrt.dll") Windows

4. FunctionDescriptor 및 MethodHandle : 외부 함수를 정의하고 호출합니다

FunctionDescriptor 함수의 매개 변수 및 리턴 유형을 설명하고 Linker 결합하여 호출 가능한 MethodHandle 가져옵니다.

예 : C printf c
 Java.Lang.Foreign.*;
static java.lang.foreign.valuelayout을 가져옵니다.*;

링커 링커 = linker.nativelinker ();
Symbollookup stdlib = linker.defaultLookup ();

// printf 함수 정의 서명 : int printf (const char*, ...)
functionDescriptor printfdesc = functiondescriptor.of (java_int, address);

MethodHandle printf = linker.downCallHandle (stdlib.find ( "printf"). OrelsetHrow (), printfdesc);

// 문자열 준비 (널로 끝나야 함)
try (Arena Arena = Arena.ofConfined ()) {
    MemorySegment Format = Arena.AllocateFrom ( "Hello From %S! \ n");
    memorysegment name = arena.allocatefrom ( "ffm api");

    // printf를 호출합니다
    printf.invoke (형식, 이름);
}

산출:

 FFM API에서 안녕하세요!

참고 : 변수 매개 변수 함수는 제한된 지원을 지원합니다. 이 예에서는 두 개의 매개 변수 만 전달되므로 사용할 때는 신중해야합니다.


3. 사용자 정의 로컬 라이브러리 호출 (간단한 예)

C 기능이 있다고 가정합니다.

 // libadd.so (Linux) / add.dll (Windows)
int add (int a, int b) {
    Return AB;
}

공유 라이브러리로 편집 한 후 Java로 전화하십시오.

 try (Arena Arena = Arena.ofConfined ()) {
    링커 링커 = linker.nativelinker ();
    symbollookup xuilup = linker.defaultLookup (); // 또는 경로 기능을 지정하여 (java_int, java_int, java_int);
    Methodhandle add = linker.downCallHandle (
        lookup.find ( "add"). Orelsethrow (),
        adddesc
    );

    int result = (int) add.invoke (3, 4);
    System.out.println ( "3 4 ="결과); // 출력 7
}

JNI 코드를 작성할 필요가 없으며 전적으로 Java 레이어로 수행됩니다.


IV. 경기장 : 메모리 수명주기 관리

Java 21은 MemorySegment 의 수명주기를 통합하기 위해 경기장 개념을 소개합니다.

  • Arena.ofConfined() : 단일 스레드 액세스, 우수한 성능.
  • Arena.ofShared() : 다중 스레드 공유,보다 안전하지만 동기화 오버 헤드.
 try (Arena Arena = Arena.ofConfined ()) {
    MemorySegment seg = antena.allocate (100);
    // seg를 사용합니다 ...
} // 모든 메모리를 자동으로 해제합니다

이것은 메모리 누출을 방지하는 핵심 메커니즘입니다.


5. JNI에 비해 장점

특성 JNI FFM API
기본 코드가 필요합니까? 아니요
메모리 관리 매뉴얼 (오류가 발생하기 쉬운) 경기장 자동 관리
타입 안전 약한 (매크로 정의) Strong (Valuelayout)
성능 일반적으로 통화 오버 헤드가 높습니다 더 좋은 점은 JVM을 최적화 할 수 있습니다
사용 편의성 복잡한 단순하고 순수한 자바
보안 낮음 (직접 포인터) High (국경 점검)

6. 현재 상태 및 예방 조치

  • 미리보기 기능은 여전히 Java 21에 있으며 미리보기 옵션을 활성화해야합니다.
     javac-reelease 21-enable-preview yourclass.java
    java-enuble-preview yourclass
  • API는 향후 조정 될 수 있으며 영구가 될 때까지 생산 환경에서 사용하는 것이 권장되지 않습니다 (Java 22 또는 23이 예상됩니다).
  • 복잡한 구조 (예 : 중첩 구조, 노조)에 대한 지원이 개선되고 있습니다.
  • 크로스 플랫폼 호환성은 라이브러리 이름과 전화 규칙 (예 : Windows 용 STDCALL)에주의를 기울여야합니다.

  • 기본적으로 그게 다야. 외국 기능 및 메모리 API는 Java에서 시스템 수준 프로그래밍에 대한 중요한 단계이며, Java는 안전하고 간결하게 유지하면서 "하드웨어에 가까워지고"표시됩니다. 고성능 로컬 통화 (예 : 데이터베이스, AI 라이브러리 통합, 운영 체제 도구)가 필요한 시나리오에 선호되는 솔루션이 점차 선호됩니다.

    위 내용은 Java 21의 외래 기능 및 메모리 API의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

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)

뜨거운 주제

PHP 튜토리얼
1540
276
Excel은 작동하지 않음을 찾고 교체하십시오 Excel은 작동하지 않음을 찾고 교체하십시오 Aug 13, 2025 pm 04:49 PM

cheecksearchsettingslike "matchEntirecellContents"및 "matchcase"exexpandingoptionsinfindandreplace, "tocorrectscope 내에서"lookin "issettovaluesand"를 보장합니다

Java 응용 프로그램을 배포하는 방법 Java 응용 프로그램을 배포하는 방법 Aug 17, 2025 am 12:56 AM

repay yourApplicationBenorgradletobuildajarorwarfile, 외부화 공기

Java 응용 프로그램에서 로깅을 구성하는 방법은 무엇입니까? Java 응용 프로그램에서 로깅을 구성하는 방법은 무엇입니까? Aug 15, 2025 am 11:50 AM

로그백 또는 log4J2와 결합 된 SLF4J를 사용하는 것은 Java 응용 프로그램에서 로그를 구성하는 권장 방법입니다. 해당 Maven 의존성을 추가하여 API 및 구현 라이브러리를 소개합니다. 2. 코드에서 SLF4J의 LoggerFactory를 통해 로거를 가져오고 매개 변수화 된 로깅 방법을 사용하여 분리되고 효율적인 로그 코드를 작성하십시오. 3. 로그 출력 형식, 레벨, 대상 (콘솔, 파일) 및 패키지 레벨 로그 컨트롤을 logback.xml 또는 log4j2.xml 구성 파일을 정의합니다. 4. 선택적으로 구성 파일 스캔 기능을 활성화하여 로그 레벨의 동적 조정을 달성하고 SpringBoot도 액추에이터 엔드 포인트를 통해 관리 할 수도 있습니다. 5. 모범 사례를 포함하여

Java의 Castor와의 XML 데이터 바인딩 Java의 Castor와의 XML 데이터 바인딩 Aug 15, 2025 am 03:43 AM

castorenablesxml-to-javaobjectmappingViAdventionSorxclationSpollicitMappingFiles; 1) definejavaclasseswithgetters/setters; 2) useUnmarshallertoconvertxmltoobjects; 3) USEMARSHALLERTOSERIAZEOBJECTSBACKTOXML;

성능 비교 : Java vs. 백엔드 서비스로 이동합니다 성능 비교 : Java vs. 백엔드 서비스로 이동합니다 Aug 14, 2025 pm 03:32 PM

Proughoughputandlowerlatency, 특히 orfori/o-heavyservices, duetoitslightgeightgoroutinesandefficientscheduler, whilejava, hithlowstart, canmatchgoincpu-boundtasksafterjitoptimization.2.gousessme

JS 배열 시작에 요소를 추가합니다 JS 배열 시작에 요소를 추가합니다 Aug 14, 2025 am 11:51 AM

JavaScript에서 배열의 시작 부분에 요소를 추가하는 가장 일반적인 방법은 Unshift () 메소드를 사용하는 것입니다. 1. Unshift ()를 사용하여 원래 배열을 직접 수정하면 하나 이상의 요소를 추가하여 추가 된 배열의 새 길이를 반환 할 수 있습니다. 2. 원래 배열을 수정하지 않으려면 확장 연산자 (예 : [Newlement, ... ARR])를 사용하여 새 배열을 만드는 것이 좋습니다. 3. Concat () 메소드를 사용하여 새 요소 배열을 원래 번호와 결합하고 원래 배열을 변경하지 않고 새 배열을 반환 할 수 있습니다. 요약하면 원래 배열을 수정할 때 Unshift ()를 사용하고 원래 배열을 변경하지 않으면 확장 연산자를 권장하십시오.

Java에서 JSON과 함께 일하는 방법 Java에서 JSON과 함께 일하는 방법 Aug 14, 2025 pm 03:40 PM

toworkwithjsoninjava, Useathird-Partylibrary Locking Jackson, Gson, Orjson-B, AsjavalacksBuilt-insupport; 2.Fordeserialization, mapjsontojavaObjectSusingObjectMapperSonorgson.Fromjson; 3. Forserialization, ConvertJavaoBoBoBobjsonstojsonstringsviawritevalueastring

Java의 Assert 키워드는 무엇입니까? Java의 Assert 키워드는 무엇입니까? Aug 17, 2025 am 12:52 AM

theassertkeywordinjavaisubseedtovalidateassumptions developments.2

See all articles