-
외부함수와 메모리 API공부/자바 2023. 7. 29. 19:54728x90자바 런타임 외부의 코드와 데이터를 자바 프로그램과 상호운용하기 위해 JDK 14와 JDK 15에서 도입된 인큐베이팅 API가 개선되었다. 해당 API는 외부 함수(즉 JVM 외부의 코드)를 효율적으로 호출하고 외부 메모리에 안전하게 접근하도록 한다. 이를 통해 자바 프로그램이 네이티브 라이브러리를 호출하거나 네이티브 데이터를 처리하는 과정에서 발생 가능한 JNI(Java Native Interface)의 불안정성과 복잡성을 방지한다. 이 API는 다른 언어로 작성된 코드와 자바 사이의 상호작용을 개선하는 프로젝트 파나마(Project Panama)에서 개발되고 있다.
목표
편의성: Java Native Interface를 우수한 순수 자바 개발모대로 대체한다.
성능: JNI 및 sun.misc.Unsafe와 같은 API와 비교 가능한 더 나은 성능을 제공한다.
일반성: 다른 종료의 외부 메모리에서 작동하는 방법을 제공하며, 다른 플랫폼 및 C 이외의 언어로 작성된 외부 함수를 수용하도록 한다.
안전성: 안전하지 않은 작업은 기본적으로 비활성화하며, 응용 프로그램 개발자나 최종 사용자가 명시적으로 선택한 후에만 활성화 할 수 있도록 한다.동기
자바 플랫폼은 항상 JVM을 벗어나 다른 플랫폼과 상호 작용하고자 하는 라이브러리 및 응용 프로그램 개발자들에게 풍부한 기반을 제공해왔다. 하지만 자바 개발자들은 여전히 중요한 종류의 비 Java 리조스에 접근하는데 어려움이 있다.
설명
Foreign Function & Memory API(FFM API)는 라이브러리 및 응용 프로그램의 클라이언트 코드가 다음을 수행할 수 있도록 클래스와 인터페이스를 정의한다.
- 외부 메모리 할당
- 구조화된 외부 메모리 조작 및 접근
- 외부 리소스의 라이프 사이클 관리
- 외부 함수 호출
FFM API는 jdk.incubator.foreign 모듈의 jdk.incubator.foreign 패키지에 위치한다.
예시
// 1. 외부 함수를 C라이브러리에서 찾는다 MethodHandle radixSort = CLinker.getInstance().downcallHandle( CLinker.systemLookup().lookup("radixsort"), ...); // 2. 네 개의 문자열을 저장하기 위해 on-heap 메모리를 할당한다. String[] javaStrings = { "mouse", "cat", "dog", "car" }; // 3. 네 개의 포인터를 저장하기 위해 off-heap 메모리를 할당한다. MemorySegment offHeap = MemorySegment.allocateNative( MemoryLayout.ofSequence(javaStrings.length, CLinker.C_POINTER), ...); // 4. on-heap에 있는 문자열들을 off-heap로 복사한다. for (int i = 0; i < javaStrings.length; i++) { // Allocate a string off-heap, then store a pointer to it MemorySegment cString = CLinker.toCString(javaStrings[i], newImplicitScope()); MemoryAccess.setAddressAtIndex(offHeap, i, cString.address()); } // 5. 외부 함수를 호출하여 off-heap 데이터를 정렬한다. radixSort.invoke(offHeap.address(), javaStrings.length, MemoryAddress.NULL, '\0'); // 6. 정렬된 문자열들을 off-heap에서 on-heap로 복사한다. for (int i = 0; i < javaStrings.length; i++) { MemoryAddress cStringPtr = MemoryAccess.getAddressAtIndex(offHeap, i); javaStrings[i] = CLinker.toJavaStringRestricted(cStringPtr); } assert Arrays.equals(javaStrings, new String[] {"car", "cat", "dog", "mouse"}); // true
네이티브 메소드 호출 뒤에 숨겨진 암묵적 변환과 메모리 역참조가 Java에서 직접 표현되기 때문에 JNI를 사용하는 솔루션보다 명확하다. 또한, 현대적인 Java 관용구를 사용할 수 있다.
출처:외부함수와 메모리
728x90반응형'공부 > 자바' 카테고리의 다른 글
Java Records (0) 2023.07.31 자바 instanceof (0) 2023.07.29 switch를 위한 패턴 매칭 (0) 2023.07.29 17 preview version 안되는 오류 (0) 2023.07.29 JDK 내부의 강력한 캡슐화 (0) 2023.07.27