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

이 API의 핵심 목표는 Java가 로컬 기능과 메모리가 자연스럽게 로컬 방법을 호출하는 동시에 JNI의 복잡성과 보안 위험을 피할 수 있도록하는 것입니다.
1. 왜 외국 기능 및 메모리 API가 필요합니까?
Java 21 이전에는 기본 코드와 상호 작용하는 것은 주로 JNI 에 의존하지만 많은 문제가 있습니다.

- 복잡하고 복잡한 : C 코드를 작성하고 헤더 파일 생성, 공유 라이브러리 컴파일이 필요하며 개발 프로세스는 원활하지 않습니다.
- 오류가 발생하기 쉬운 : 메모리 및 유형 변환을 수동으로 관리하면 충돌 (예 : Segfaults)이 쉽게 이어질 수 있습니다.
- 성능 오버 헤드 : JNI 통화는 컨텍스트 전환 비용이 높습니다.
- 보안 불량 : 포인터의 직접 작동, 메모리 액세스 경계 점검.
외국 기능 및 메모리 API의 출현은 이러한 문제를 해결하는 것이며 외부 기능 호출 및 메모리 작업을 구현하는 순수한 Java 방법을 제공합니다.
2. 핵심 구성 요소에 대한 자세한 설명
FFM API는 주로 java.lang.foreign
패키지에 위치한 다음 주요 클래스로 구성됩니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

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

repay yourApplicationBenorgradletobuildajarorwarfile, 외부화 공기

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

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

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

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

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

theassertkeywordinjavaisubseedtovalidateassumptions developments.2
