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

Mando·2023년 11월 24일
0

이펙티브 자바

목록 보기
5/10
post-thumbnail

자바 네이티브 인터페이스(JNI, Java Native Interface)

자바 프로그램이 네이티브 메세드(C, C++ 같은 네이티브 프로그래밍 언어로 작성된 메서드)를 호출하는 기술

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

1. 레지스트리 같은 플랫폼 특화 기능

  • 자바가 발전하면서 (OS 같은) 하부 플랫폼의 기능을 점차 흡수하고 있다.
    따라서 네이티브 메서드를 사용할 필요성이 줄어들고 있음
  • 자바9에서는 Process API가 추가되면서 OS 프로세스에 접근할 수 있게 되었다.
public class JavaProcess {

    public static void main(String[] args) {
        ProcessHandle processHandle = ProcessHandle.current();

        System.out.println(ProcessHandle.of(processHandle.pid()).orElse(null));
        System.out.println("Native process ID of the process: " + processHandle.pid()); // process id
        System.out.println("\nDirect children: " + processHandle.children());
        System.out.println("\nClass name: " + processHandle.getClass());
        System.out.println("\nAll processes: " + ProcessHandle.allProcesses());
        System.out.println("\nProcess info: " + processHandle.info());
        System.out.println("\nIs process alive: " + processHandle.isAlive());
        System.out.println("\nProcess's parent " + processHandle.parent());

        //Process snapshot of the current running process with ProcessHandle.Info:
        ProcessHandle.Info processInfo = processHandle.info();

        System.out.println("\nProcess snapshot of the current running process:");
        System.out.println("User : " + processInfo.user().get());
        System.out.println("Start Time : " + processInfo.startInstant().get());
    }
}

2. 네이티브 코드로 작성된 기존 라이브러리를 사용

  • 대체할 만한 자바 라이브러리가 존재하지 않은 경우 네이티브 메서드를 사용한다.

3. 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성

  • 성능을 개선할 목적으로 네이티브 메서드를 사용하는 것은 권장하지 않는다.
    JVM의 발전으로 지금의 자바는 다른 플랫폼에 견줄만한 성능을 보인다.

네이티브 메서드의 단점

  1. 안전하지 않으므로 네티이브 메서드를 사용하는 애플리케이션도 메모리 훼손 오류로부터 안전하지 않다.
  2. 자바보다 플랫폼을 많이타서 안전하지 않다.
  3. 디버깅도 어렵다.
  4. 주의하지 않으면 속도가 오히려 느려질 수 있다.
  5. 가비지 컬렉터가 네이티브 메모리는 자동 회수하지 못하고, 심지어 추적할 수 없다.
  6. 자바 코드와 네이티브 코드의 경계를 넘나들 때마다 비용이 추가된다.
  7. 네이티브 메서드와 자바 코드 사이의 접착 코드를 작성하기가 귀찮은 작업이다.
    • 접착 코드
      프로그램의 요구사항 구현에는 기여하지 않지만, 본래 호환성이 없는 부분끼리 결합하기 위해 작동하는 코드

0개의 댓글