- JVM 을 통해 실행 - 운영체제 독립적, 자동으로 메모리 관리, 안정적
자바 가상 머신(JVM, Java Virtual Machine) 이란?
- 자바 프로그램 실행환경을 만들어주는 소프트웨어
- 자바 가상 머신을 사용하면 하나의 바이트 코드(.class)를 모든 플랫폼에서 동작할 수 있기 때문에 프로그램은 다양한 CPU 환경에서 이식성 문제 없이 실행 될수 있도록한다.
- 자바는 플랫폼에 종속적이지 않지만 자바 가상 머신은 플랫폼에 종속적이다.
- 즉, 컴파일될 바이트 코드는 어떤 자바 가상 머신에서도 동작이 가능하기 때문에 플랫폼에 의존적이지 않다.
- 자바 가상 머신은 플랫폼에 의존적이고 따라서 운영체제에 자바 가상 머신을 사용해야 한다.
- 자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있기 때문에 오라클은 웹 브라우저, 스마트폰, 가정기기 등에서도 자바 가상 머신을 사용할 수 있도록 자원한다.
zip (.java )
소스 수정시 zip 전달
war (.class)
프로젝트 실행 시키는 파일
자바 가상 머신(JVM, Java Virtual Machine) 의 구조
클래스 로더 (Class Loader)
- 자바는 동적으로 클래스를 읽어오기 때문에 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결됩니다.
- 이렇게 동적으로 클래스를 로딩해 주는 역할을 하는 것이 바로 클래스 로드(class loader)입니다.
- 클래스 로더는 .class 파일을 묶어서 자바 가상 머신이 운영체제로부터 할당 받은 메모리 영역인 런타임 데이터 영역으로 적재합니다.
- 로딩, 링크, 초기화 3가지 단계 거쳐 실행 됩니다.
런타임 데이터 영역(Runtime Data Ara)
- 자바 가상 머신 내 런타임 데이터 영역은 실제 클래스 파일이 적재되는 곳으로 자바 가상 머신이 OS로 부터 자바 프로그램 실행을 위해 데이터와 명령어를 저장하기 위해 할당받는 메모리 공간 입니다.
- JVM의 메모리 구조라 하면 이 공간을 의미합니다.
https://lavender1122.tistory.com/295
JNI(Java Native Interface)
- 자바 애플리케이션에서 C,C++, 어셈블리어로 작성된 함수를 사용할 수 있는 방법을 제공합니다.
- Native 키워드를 사용하여 메서드를 호출하고 대표적인 메서드는 Thread의 currentThread() 입니다.
Native Method Library
- C,C++로 작성된 라이브러리입니다.
자바 컴파일과 실행 과정
자바 컴파일 과정
- 개발자가 자바 소스 코드(.java)를 작성합니다.
- 자바 컴파일러가 자바 소스 코드(.java)를 읽어 바이트 코드(.class)로 변홥합니다.
(이때는 컴퓨터는 읽을 수 없지만 자바 가상 버신이 읽을 수 있는 코드 입니다.)
자바 런타임 과정
컴파일 완료된 후 실행되는 과정
- 컴파일된 바이트 코드(.class)를 자바 가상 머신의 클래스로더(Class Loader)에게 전달합니다.
- 클래스 로더는 동적로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data Area)
즉, JVM 메모리에 바이트 코드들을 올려 준다. - 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다.
컴퓨터가 읽을 수 있는 기계어로 해석(각 운영체제에 맞는 기계어)되어 Runtime Data Area에 배치 됩니다.
Binary Code, 기계어, 바이트 코드
바이너리 코드(Binary Code)
- 컴퓨터가 인식할 수 있는 0과 1로 구성된 이진 코드를 의미합니다.
기계어
- 0과 1로 이루어진 바이너리 코드입니다.
- 기계어가 바이너리 코드로 이루어졌을 뿐이지 모든 바이너리 코드가 기계어인 것은 아닙니다.
- 기계어는 특정한 언어가 아닙니다.
- CPU 제조사에서 CPU를 만들 때 해당 CPU에서 사용하는 명령어 집합을 공개하는데, 이것을'기계어' 라고 부를 뿐입니다. 때문에 CPU가 변경되면 기계어가 달라집니다. 같은 동작을 하는 명령어지만 완전히 다른 0과 1의 나열이 될 수 있습니다.
바이트 코드
- CPU가 이해할 수 있는 언어가 바이너리 코드라면 바이트 코드는 가상 머신이 이해할 수 있는 언어 입니다.
- CPU가 아닌 가상 머신에서 이해할 수 있는 코드를 위한 이진 표현법 입니다.
- Java의 가상 머신을 JVM이라고 하며 JVM을 위한 바이트 코드를 자바 바이트 코드라고 합니다.
- Java에서는 컴파일러(javac)에 의해 소스파일(.java)이 목적파일(.class)로 변환될 때 컴퓨터가 바로 인식 가능한 바이너리 코드가 아닌 바이트 코드로 변환합니다.
⇒ 그 이유는 자바 가상 머신에 의해 실행되기 때문에
출처
https://www.youtube.com/watch?v=AWXPnMDZ9I0&list=PL1GTGHhczW3j0crAa6YewIogelq_QR7Yo&index=3
https://jellili.tistory.com/46
https://jellili.tistory.com/55
'이론 > 자바' 카테고리의 다른 글
[Java] 클래스,객체, 인스턴스 차이 (0) | 2024.09.20 |
---|---|
[Java] Scanner 와 BufferedReader (0) | 2024.09.20 |
[Java] JVM 메모리 구조 - 런타입 데이터 영역(Runtime Data Area) (2) | 2024.09.18 |
[Java] Wrapper Class (0) | 2024.09.05 |
[Java] TreeMap (0) | 2024.09.04 |