Reference/Effective-Java

[Effective-Java] Chapter9 #66. 네이티브 메서드는 신중히 사용하라

나죽못고나강뿐 2023. 7. 25. 10:56
💡 네이티브 메서드를 사용하려거든 한번 더 생각해보라. 사용하더라도 최소한만 사용하고 철저히 테스트하라.
 

JAVA Native Method (JNI)

보통 서로 다른 장, 단점을 갖고 있는 JAVA와 C++, 이 두 언어를 결합할 수만 있으면 큰 시너지를 발휘할 수 있다고 생각한다. 뭐, 어느 정도의 범위에서는 그렇긴 하지만...그러나 왠만하면, 정말

roughexistence.tistory.com

JNI를 어떻게 사용하는지 궁금해서 찾아봤는데...어...잘 봤습니다.

 

📌 JNI(Java Native Interface)
  • Java 프로그램이 Native method를 호출하는 기술
    • C나 C++같은 native programming language로 작성한 method
  • Native method의 쓰임
    1. 레지스트리 같은 플랫폼 특화 기능
      • Java가 성숙해지면서 (OS 같은) 하부 플랫폼 기능을 점차 흡수하고 있어서 Native method 필요성이 줄고 있다.
      • Java 9부터는 새로 processAPI를 추가해 OS Process에 접근할 수 있는 길을 열어주었다.
    2. Native 코드로 작성된 기존 라이브러리 사용
      • 대체할만한 자바 라이브러리가 없는 Native 라이브러리를 사용해야 할 때는 Native method를 사용해야 한다.
    3. 성능 개선을 목적으로 성능에 결정적 영향을 주는 영역만 따로 작성
      • 성능 개선을 목적으로 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 단점
  1. 메모리 훼손 오류
    • Native language가 안전하지 않으므로, Native method를 사용하는 Application도 메모리 훼손 오류로부터 안전하지 않다.
    • Garbage Collector가 Native memory를 자동으로 회수하지 못하고, 심지어 추적조차 할 수 없다.
  2. 이식성
    • Native language는 Java보다 Platform을 많이 타서 이식성도 낮고 디버깅도 더 어렵다.
  3. 성능과 비용, 가독성
    • 주의하지 않으면 속도가 오히려 느려질 수 있다.
    • Java code와 Native code의 경계를 넘나들 때 오버헤드가 발생한다.
    • Native method와 Java code 사이에 접착 코드(gue code)를 작성해야 하는데, 귀찮은 작업이고 가독성도 떨어뜨린다.

 

📌 Native method를 사용해도 괜찮은 경우
  • GMP(GNU 다중 정밀 연산 라이브러리)를 필두로 Native library 개선 작업이 계속돼왔다.
  • 고성능 다중 정밀 연산이 필요한 java 프로그래머라면 Native method를 통해 GMP를 사용하는 걸 고려해볼만 한다.