Item 66. 네이티브 메서드는 신중히 사용하라

서론

자바 네이티브 인터페이스(Java Native Interface, JNI)는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다.

네이티브 메서드란?

C나 C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드를 말한다.

네이티브 메서드의 주요 쓰임

  • Registry 같은 플랫폼 특화기능을 사용한다.
    • 하지만 자바가 진화해가면서 하부 플랫폼의 기능을 흡수하고 있다.
    • 네이티브 메서드를 사용해야하는 일이 줄어들고 있다.
    • 자바9 부터는 process API를 추가해 OS에 접근하는 길을 열어주었다.
  • 네이티브 코드로 작성된 기존 라이브러리를 사용해야 하는 경우
    • 레거시 데이터를 사용하는 레거시 라이브러리
    • Java로 된 라이브러리가 없는 경우 네이티브 라이브러리를 사용한다.
  • 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성한다.

네이티브 메서드를 성능개선의 목적으로 사용하지 말라

  • 자바 초기 시절 (Java 1.3)이전이라면 다른 얘기지만, 그동안 JVM은 빠른 속도로 발전해 왔다.
  • 대부분의 작업에서 Java는 다른 플랫폼과 견줄만한 성능을 보인다 (자바가 느리다는 것도 옛말)
  • 네이티브 라이브러리 쪽은 GNU 다중 정밀 연산 라이브러리(GMP)를 필두로 개선 작업이 계속돼왔다.
    고성능의 다중 정밀 연산이 필요한 경우에는 네이티브 메서드를 통해 GMP를 사용하는것을 고려해보자

네이티브 메서드의 단점

  • 네이티브 언어가 안전하지 않으므로 네이티브 메서드를 사용하는 애플리케이션도 메모리 훼손 오류로 부터 안전하지 않다.
  • 네이티브 언어는 플랫폼 종속성이 있으므로 이식성이 좋지 못하다
  • 디버깅도 어렵다
  • 오히려 속도가 더 느릴 수 있다.
  • JVM의 가비지 컬렉터는 네이티브 메모리는 자동 회수 하지 못하고 추적도 할 수 없다.
  • 자바 코드와 네이티브 코드의 경계를 넘나 들때마다 비용이 발생한다.
  • 자바 코드와 네이티브 코드간의 접착 코드(glue code)를 작성해야 하는데 이 부분도 귀찮고 가독성도 떨어진다.

정리

  • 네이티브 메서드를 사용하는 경우는 한번 더 생각하라

  • 네이티브 메서드가 그렇게 성능 향상에 도움을 주지는 않는다.

  • 네이티브 메서드를 사용해야 하는 경우에는 최소한으로 사용하고 철저한 테스트를 해야한다.

  • 숨은 버그하나가 애플리케이션 전체에 영향을 줄 수도 있다.

참고

  • Effective Java 3rd Edition - Item 66. 네이티브 메서드는 신중히 사용하라