item66. 네이티 메서드는 신중히 사용하라.
⚓️서론
자바 네이티브 인터페이스(Java Native Interface, JNI)
는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다.
여기서 네이티브 메서드란? C나 C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드를 말한다.
네이티브라는 것은 많이 들어봤지만 실질적으로 코드를 본적이 없다. 이 글을 통해서 자바 네이티브 인터페이스를 알아가보자.
이 아이템은 한 페이지 분량으로 매우 짧은 글이다. 사실 서론을 쓸지 고민하다가 간략하게나마 작성했다.
➡️네이티브 메서드의 주요 쓰임
1️⃣ 레지스트리 같은 플랫폼 특화 기능을 사용한다.
- 자바가 진화함에따라 하부 플랫폼의 기능을 흡수하고 있음.
- 자바9 새로
process API
를 추가해 OS프로세스에 접근하는 길을 열어주었다.process API
@Slf4j public class JavaProcess { public static void printProcessInfo() throws IOException { ProcessHandle processHandle = ProcessHandle.current(); ProcessHandle.Info processInfo = processHandle.info(); log.info("PID: " + processHandle.pid()); log.info("Arguments: " + processInfo.arguments()); log.info("Command: " + processInfo.command()); log.info("Instant: " + processInfo.startInstant()); log.info("Total CPU duration: " + processInfo.totalCpuDuration()); log.info("User: " + processInfo.user()); } public static void main(String[] args) throws IOException { printProcessInfo(); } }
결과 :
PID: 6331 Arguments: Optional[[Ljava.lang.String;@52f759d7] Command: Optional[/Library/Java/JavaVirtualMachines/jdk-11.0.13.jdk/Contents/Home/bin/java] Instant: Optional[2023-03-21T08:48:26.679Z] Total CPU duration: Optional[PT0.597789S] User: Optional[dante]
2️⃣ 네이티브 코드로 작성된 기존 라이브러리를 사용한다.
- 레거시 데이터를 사용하는 레거시 라이브러리 (ex.Java OpenGL)
- Java에 Java로 된 라이브러리가 없을 경우 네이티브 라이브러리를 사용해야할 때
3️⃣ 성능 개선할 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성한다.
- 자바 초기 시절 (자바 3전)이라면 이야기가 다르지만, JVM은 빠른 속도로 발전함.
- 현재 자바는 다른 플랫폼에 견줄만한 성능을 보인다
- 예시) java.math 1.1 시절 BingInteger(C로 작성한 고성능 라이브러리)
➡️네이티브 메서드의 단점
1️⃣메모리 훼손 오류
- 네이티브 언어가 안전하지 않으므로 네이티브 메서드를 사용하는 애플리케이션도 메모리 훼손 오류로부터 더 이상 안전하지 않다.
2️⃣이식성
- 네이티브 언어는 자바보다 플랫폼을 많이 타서 이식성이 낮다.
- 디버깅도 더 어렵다.
3️⃣성능과 비용, 가독성
- 주의하지 않으면 속도가 오히려 느려질 수도 있다.
- 가비지 컬렉터가 네이티브 메모리는 자동 회수하지 못하고, 심지어 추적도차 할 수 없다.
- 자바 코드와 네이티브 코드의 경계를 넘나들 때마다 비용이 추가된다.
- 네이티브 메서드와 자바 코드 사이의 ‘접착 코드(glue code)’를 작성해야 한다. 따라서 개발할 것이 늘어나고 가독성도 떨어지게된다.
✅핵심 정리
- 네이티브 메서드를 사용할려면 한번 더 생각하라. 네이티브 메서드가 성능을 개선해주는 일은 많지 않다.
- 저수준 자원이나 네이티브 라이브러리를 사용해야만 해서 어쩔 수 없더라도 네이티브 코드는 최소한만 사용하고 철저히 테스트하라.
- 네이티브 코드 안에 숨은 단 하나의 버그가 애플리케이션 전체를 훼손할 가능성이 있다.