목차
개요
JVM의 메모리 구조 이해를 위한 글로 두 메서드의 실행 차이점을 알아본다.
Java 9 이전보다 최근들어서는 자바로 쓰인 라이브러리의 종류도 많아져 잘 사용하지 않기에 사용이 적다. 이펙티브 자바에서도 최대한 네이티브 메서드의 실행을 지양하고 있다. 하지만 해당 내용이 JVM 의 구조를 이해하기에 도움이 되기에 간단히 적어본다.
자바 네이티브 인터페이스(Java Native Interface, JNI) -> 자바 프로그램이 네이티브 메서드를 호출하는 기술
네이티브 메서드 -> C나 C++같은 네이티브 프로그래밍 언어로 작성한 메서드
네이티브 메모리 -> 자바가 실행되고 있는 운영체제의 메모리, 운영체제에 의해 관리되기에 자바 힙보다 확장성이 좋다.
*네이티브 메모리는 네이티브 메서드의 실행에만 국한되는게 아니다. JIT 컴파일러에 의해 변환된 자바 코드나 과거 영구세대가 메타스페이스라는 이름으로 바뀌어 네이티브 메모리 내에 저장이 되기도 한다.
로딩 과정에서의 차이
자바 메서드의 클래스 로딩
자바 메서드는 자바 클래스 파일에 정의되어 있고 JVM의 클래스 로더에 의해 로드된다.
클래스 로더는 클래스 파일을 메모리의 메소드 영역(Method Area)에 로드하고,
클래스의 메타데이터를 초기화와 클래스의 정적 변수와 상수 풀도 메모리에 로드한다.
네이티브 메서드의 라이브러리 로딩
네이티브 메서드는 자바가 아닌 다른 언어(C, C++)로 작성된 메서드로 네이티브 라이브러리에 포함되어 있다.
System.loadLibrary() 메서드를 통해 네이티브 라이브러리를 로드하여 사용한다.
실행 방식에서의 차이
자바 메서드의 실행
자바 메서드는 JVM의 실행 엔진에 의해 바이트코드로 실행된다.
실행 엔진은 바이트코드를 해석하여 명령어를 실행하거나 JIT(Just-In-Time) 컴파일러를 사용해 자주 실행되는 코드를 네이티브 기계어로 변환하여 성능을 최적화한다.
네이티브 메서드의 실행
네이티브 메서드는 JNI(Java Native Interface)를 통해 호출된다.
JNI는 자바 코드에서 네이티브 메서드를 직접 호출하여 JVM의 실행 엔진을 거치지 않고, 네이티브 메서드 스택에서 직접 실행된다.
메모리 관점에서의 차이(중요)
자바 메서드의 스택메모리 사용
자바 메서드 호출 시 자바 가상머신 스택에 새로운 스택 프레임(자바 가상머신 스택)이 생성되고 생성된 스택 위에서 작동한다.
네이티브 메서드의 스택 사용
네이티브 메서드 호출 시 네이티브 메서드 스택이 사용된다. 자바 메서드와 비슷하게 작동하며 몇몇 가상머신에서는 두 스택을 합쳐서 구현해놓은 경우도 있다고 한다.
자바 메서드의 메모리 관리
자바 메서드에서 생성된 객체는 힙(Heap) 영역에 할당되어 JVM의 가비지 컬렉터가 관리를 한다.
네이티브 메서드의 메모리 관리
네이티브 메서드는 자바의 가비지 컬렉션에 의해 관리되지 않는 메모리만을 사용할 수 있다. 네이티브 메모리는 개발자가 직접 할당하고 해제해야 합니다(예: malloc/free). 이로 인해 메모리 누수나 잘못된 메모리 접근과 같은 문제가 발생할 수 있다.
이외의 특성
자바 메서드의 플랫폼 독립성
자바 메서드는 플랫폼 독립적인 JVM 바이트코드로 실행되기에(자바의 장점이기도 하다) JVM이 설치된 모든 플랫폼에서 동일한 코드가 실행될 수 있으므로 "Write Once, Run Anywhere" 구호(?) 를 지킬수 있다.
네이티브 메서드의 플랫폼 종속성
네이티브 메서드는 특정 플랫폼에 종속되어 운영 체제에 따라 다르므로, 플랫폼 간의 이식성이 떨어진다.
네이티브 메서드를 사용할 때는 대상 플랫폼에 맞는 라이브러리를 제공해야 하는 문제가 있다.
'Java' 카테고리의 다른 글
자바가상머신의 메모리 구조: JVM Runtime Data Area (0) | 2024.07.04 |
---|---|
JVM스택메모리 구조 이해를 위한 바이트코드 예시 (0) | 2024.06.25 |
Optional: 안정적인 Null 처리 그리고 orElse(), orElseGet(), orElseThrow() 에 대한 이해 (0) | 2023.10.24 |
객체지향에서의 클래스 간의 관계[IS, HAS, USES, REALIZE,DEPEND-ON] (0) | 2023.04.28 |
문자열 조작에 있어서 오버헤드 발생 이유 (StringBuffer, StringBuilder 차이) (0) | 2023.04.14 |