2023.03.12
직역하면 '자바를 실행시키기 위한 가상 기계(컴퓨터)'란 뜻이다.
Java는 OS(운영체제)에 종속적이지 않는 특징이 있는데 바로 JVM 때문이다.
자바는 OS(운영체제)에 영향을 받지않는다
자바프로그램은 JVM만 있으면 실행이 가능한데 JVM이 OS에게 메모리 사용권한을 할당받고 JVM이 자바프로그램을 호출,실행하게 된다. OS에게선 자유롭지만 ,JVM에게선 종속적이게 되었다. ( JVM을 실행시키고, JVM이 자바 프로그램을 실행시켜 OS에서 직접 제어 받는것보다는 속도는 느리다.)
JVM의 실행과정과 구성
자바 프로그램 실행과정
1. IDE를 통해 자바 소스코드 작성( .java의 확장자 소스 파일)
2. java compiler가 소스코드(.java)를 바이트 코드( .class 확장자의 클래스 파일)로 변환.
3. Class Loader 를 통해 class 파일들을 JVM으로 로딩.
4. 로딩된 class 파일들은 Execution engine을 통해 실행.
4. JVM이 바이트 코드를 기계어로 변환하여 프로그램 실행.(기계어는 특정 언어가 아닌 CPU가 이해할 수 있는 언어이기 때문에,
CPU 제조사마다 기계어가 다를 수 있다.)
✨ java compiler는 JDK를 설치하면 bin 폴더에 존재하는 javac.exe이다. javac 명령어로 .java 를 .class 로 컴파일 할 수 있다.
JVM 구성
1. Class Loader
- 클래스 파일을 로드하고 JVM 메모리에 적재하는 역할
2. Execution Engine
- 로드된 클래스 파일의 바이트코드를 실행하는 역할.
- JIT 컴파일러와 Interpreter 방식으로 나뉨. JVM은 인터프리터를 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러를 사용하는 혼합방식 사용.
- interpreter :인터프리터는 프로그래밍 언어의 소스 코드를 바로 실행하는 프로그램. 한 줄씩 수행하기 때문에 수행속도 느림.
- JIT 컴파일러 : 인터프리터 방식의 단점을 보완하기위해 도입 . 바이트코드를 컴파일하여 native code로 변환하여 사용. 한번 컴파일된 코드는 빠르게 수행하게 되어 수행속도가 빠르나, 컴파일하는 과정에 비용이 들게됨.
✨ nativ code란 C, C++처럼 (JVM 같은)인터프리터 없이 운영체제가 읽을 수 있는 형태로 컴파일해 사용 가능한 코드.
3.Garbage Collector - GC(Garbage Collection) 작업 수행
- 유효하지 않은 메모리인 Garbage 를 정리해주는 역할.
- 더이상 사용되지 않는 인스턴스를 메모리에서 삭제한다.
4.Runtime Data Area : JVM이 프로그램을 수행하기 위해 OS로부터 별도로 할당받은 메모리 공간을 말함.크게 5가지 영역으로 나뉨.
- PC Register
- 스레드가 다음 실행할 명령어의 주소를 저장하는 영역이고, 현재 수행중인 JVM의 주소를 갖는다.
- 스레드가 시작될때 생성되며, 생성될때마다 생성되는 공간으로 스레드마다 하나씩 존재.
- JVM Stack
- 메소드가 호출될때 메서드와 메서드의 정보는 JVM Stack에 쌓이게 됨. 즉 메서드의 매개변수와 지역변수, return 주소, 임시 변수등의 정보를 기록하는 스택
- 각 스레드 별로 생성되기 때문에 다른 스레드는 접근불가
- 메서드 호출이 종료되면 스택에서 정보들이 제거.
- Native Method Stack
- 자바 외의 언어로 작성된 네이티브 코드들을 위한 스택.
- Java Native Interface를 통해 호출되는 C/C++ 등의 코드 수행
- Method Area
- JVM 이 로드한 클래스, 인터페이스, 메소드, 필드, 상수 등의 바이트 코드를 저장. JVM에 의해 공유되는 영역으로, 모든 스레드가 접근할 수 있음.
- Heap
- Young Generation 과 Old Generation 으로 나뉨.
- 객체의 생성 및 GC(Garbage Collection) 작업이 이루어짐.
- new 연산자를 이용해 인스턴스를 생성하면 Heap에 저장
참고사이트
'개발 > JAVA' 카테고리의 다른 글
다형성 (0) | 2023.04.18 |
---|---|
오버로딩 과 오버라이딩 (0) | 2023.04.11 |
ORM (0) | 2023.03.08 |