💡 네이티브 메서드를 사용하려거든 한번 더 생각해보라. 사용하더라도 최소한만 사용하고 철저히 테스트하라.
JNI를 어떻게 사용하는지 궁금해서 찾아봤는데...어...잘 봤습니다.
📌 JNI(Java Native Interface)
- Java 프로그램이 Native method를 호출하는 기술
- C나 C++같은 native programming language로 작성한 method
- Native method의 쓰임
- 레지스트리 같은 플랫폼 특화 기능
- Java가 성숙해지면서 (OS 같은) 하부 플랫폼 기능을 점차 흡수하고 있어서 Native method 필요성이 줄고 있다.
- Java 9부터는 새로 processAPI를 추가해 OS Process에 접근할 수 있는 길을 열어주었다.
- Native 코드로 작성된 기존 라이브러리 사용
- 대체할만한 자바 라이브러리가 없는 Native 라이브러리를 사용해야 할 때는 Native method를 사용해야 한다.
- 성능 개선을 목적으로 성능에 결정적 영향을 주는 영역만 따로 작성
- 성능 개선을 목적으로 Native method를 사용하는 것은 거의 권장하지 않는다.
- JVM이 엄청난 속도로 발전하여 대부분 작업에서 Java는 다른 플랫폼에 견줄만한 성능을 보인다.
- 실제로 BigInteger를 Java 3에서 순수 자바로 튜닝한 결과, 네이티브 구현보다도 빨라졌다.
- 레지스트리 같은 플랫폼 특화 기능
✒️ processAPI
public class JavaProcess {
public static void printProcessInfo(){
ProcessHandle processHandle = ProcessHandle.current();
ProcessHandle.Info processInfo = processHandle.info();
System.out.println("processHandle.pid(): " + processHandle.pid());
System.out.println("processInfo.arguments(): " + processInfo.arguments());
System.out.println("processInfo.command(): " + processInfo.command());
System.out.println("processInfo.startInstant(): " + processInfo.startInstant());
System.out.println("processInfo.user(): " + processInfo.user());
}
public static void main(String[] args) {
printProcessInfo();
}
}
processHandle.pid(): 847020
processInfo.arguments(): Optional.empty
processInfo.command(): Optional[C:\Program Files\Java\jdk-17\bin\java.exe]
processInfo.startInstant(): Optional[2023-07-25T01:43:55.528Z]
processInfo.user(): Optional[DESKTOP-DEGF65N\qud12]
📌 Native method 단점
- 메모리 훼손 오류
- Native language가 안전하지 않으므로, Native method를 사용하는 Application도 메모리 훼손 오류로부터 안전하지 않다.
- Garbage Collector가 Native memory를 자동으로 회수하지 못하고, 심지어 추적조차 할 수 없다.
- 이식성
- Native language는 Java보다 Platform을 많이 타서 이식성도 낮고 디버깅도 더 어렵다.
- 성능과 비용, 가독성
- 주의하지 않으면 속도가 오히려 느려질 수 있다.
- Java code와 Native code의 경계를 넘나들 때 오버헤드가 발생한다.
- Native method와 Java code 사이에 접착 코드(gue code)를 작성해야 하는데, 귀찮은 작업이고 가독성도 떨어뜨린다.
📌 Native method를 사용해도 괜찮은 경우
- GMP(GNU 다중 정밀 연산 라이브러리)를 필두로 Native library 개선 작업이 계속돼왔다.
- 고성능 다중 정밀 연산이 필요한 java 프로그래머라면 Native method를 통해 GMP를 사용하는 걸 고려해볼만 한다.