[ 이번 포스팅에서 학습할 것 : 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해 ] 01. JVM이란? 02. JVM 구성 요소 03. 컴파일 하는 방법 04. 실행하는 방법 05. 바이트코드란? 06. JIT 컴파일러란? 07. JDK와 JRE의 차이 |
01. JVM(Java Virture Machin)이란?
- Java Virture Machin : java Byte Code를 OS에 맞게 해석해주는 가상 머신
- 즉, 자바를 실행하기 위한 가상 컴퓨터(기계)
cf ) Virtual Machine : 소프트웨어로 구현된 하드웨어(컴퓨터 속의 컴퓨터) - 실행 과정
1. [ 사람 ] java Source File 작성
2. [Java Compiler] .java파일을 .class라는 java byte code로 변환
cf1) Byte code는 기계어가 아님 -> OS에서 바로 실행 불가
cf2) Java은 C언어 같은 네이티브 언어에 비해 속도가 느림(과거)
cf3) (현재) JIT(Jut In Time) 컴파일러 구현을 통해 속도 차이 극복
3. [ JVM ] java byte code를 OS가 이해 할 수 있도록 해석
cf1) Byte코드는 JVM위에서 OS와 상관없이 실행됨
02. JVM 구성 : Class Loder, Runtime Data Area, Excution Engine, Native Method
1) 클래스 로더 (Class Loder) :
- .class에서 Byte코드를 Runtime 시점에 읽고 메모리에 저장(배치).
- 내부적으로는 로딩-링크-초기화 단계가 존재한다
cf) 클래스 로더 시스템 초기화 단계에서 전역 변수를 메모리에 할당하기 때문에, 필요 이상으로 전역 변수를 남용할 경우 메모리 이슈를 겪을 수 있음.
- 로딩 : 클래스 로더가 .class파일을 읽고, 적절한 바이너리 데이터를 만들어, 메서드 영역에 저장.
- 로딩이 끝나면, 해당 클래스 타입의 Class 객체를 생성해 "힙"영역에 저장
- 링크 : Verify - Prepare - Resolve
- 초기화 : static 변수 값 할당.(static 블럭은 이때 실행)
2) 메모리(Runtime Data Area) :
- JVM이 프로세스로서 수행되기 위해 OS로부터 할당받는 메모리 영역.
(1) 메소드 영역 : 클래스 수준의 정보(클래스 이름, 부모 클래스 이름, 인터페이스, 필드, 메서드, 변수)등의 Byte 코드 저장
(2) 힙 영역 : 객체 저장.(인스턴스는 모두 힙에 저장).
new 키워드로 생성된 객체와 배결이 생성되는 영역. 메서드 영역에 로드된 클래스만 생성 가능. GC가 메모리를 제거하는 영역.
(3) 스택 영역 : Stack메소드(프로그램 실행 과정에서 임시로 할당되었다가 메서드를 빠져나가면 바로 소멸되는 특성)가 호출될 때마다 스택 프레임 블럭이 하나씩 생성, 메서드 실행이 완료되면 삭제.
(4) PC 영역 : 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터 생성.
(5) 네이티브 메서드 영역 :다른 언어(C,C++)의 매소드 호출을 위해 할당된 구역. 언어에 맞는 Stack이 생성됨.
- 메소드, 힙 영역 : 이곳에 저장된 정보는 모든 Thread 공유
- 스택, PC, 네이티브 메서드 영역 : 스레드마다 생성되기에, 저장된 정보는 공유하지 않음.
3) 실행 엔진(Excution Engine) :
- Class Loder를 통해 JVM내의 Runtime Data Areas에 배치된 Byte 코드를 명령어 단위로 읽어서 실행.
(1) JIT(Just-In-Time) 컴파일러 : JRE(JVM의 실행 엔진) 안에 존재.
① 인터프리터의 단점을 보완하기 위해 도입.
② Runtime(프로그램 실행) 시, 해당 플랫폼에 맞는 기계어로 컴파일하는 기법.
1. 자바 Byte 코드 : 인터프리터 언어
- 인터프리터가 한 줄씩 읽고 해석, 기능을 실행시키는 방식.
- 기계어로 컴파일되는 C/C++로 만든 실행 파일에 비하면, 속도가 느림.
2. JIT 컴파일러 :
- 실행하기 전, "반복적인 코드"를 전부 "네이티브 코드"로 변환.
- 이후에 인터프리터가 컴파일된 "네이티브 코드"를 바로 사용 -> 속도 개선
(2) GC(Garbage Collector) : 더 이상 참조되지 않는 객체(데이터)를 모아 정리하는 역할 수행.
4) Native Method : 네이티브 메서드 인터페이스와 라이브러리
Native Method Interface(JNI) & Native Method Libraries
(1) JNI(Java Native Method Interface) : C, C++, 어셈블리 언어로 작성된 Native 키워드를 사용한 함수를 사용 가능하게 함
(2) 네이티브 메서드 라이브러리 : C, C++로 작성된 라이브러리
03. 컴파일하는 방법 참조 : [CS] 컴파일러, 컴파일이란?
1) Java Compiler 장점
① 생성되는 코드의 안정성 :
- Java 수행 중 만들어내는 기계어(바이너리) 코드는 sandBox안에서 돌아감 -> 외부 해킹에 안전
② 동작하는 메모리 공간의 안정성 :
- 모든 자바 객체는 Heap 영역에서만 수행
- 다른 Process와는 다른 메모리 공간 사용 -> Stack overflow에 강함
③ 최적화 재사용, 유일한 클래스 간 상속 구조
- 관련된 객체와 메서드를 메모리 위치상 가깝게 위치시킴.
- method inlining 등 성능을 높이기 위한 테크닉이, 효육적으로 작동됨.
④ 동적 최적화, 동적 최적화의 취소, 재 최적화 가능
- 수행 중 변경 가능 compiler를 통한 최적화가 수시로 이루어짐.
04. 실행하는 방법(과정)
05. 바이트코드란?
바이트 코드란, VM(Virtual Machine, 가상 머신)이 이해할 수 있는, 0과 1로 이루어진 언어.
- 가상 머신이 어떤 플랫폼에 있는지 종속되지 않고 실행될 수 있는 코드.
- 고급언어를 컴파일러를 통해 가상 머신이 이해할 수 있는 중간 코드로 컴파일한 것.
- 실시간 번역기 혹은 JIT 컴파일러를 통해 바이너리 코드로 변환
- JAVA에서는 JVM을 위한 언어가 java Byte 코드
06. JIT 컴파일러란 무엇이며 어떻게 동작하는가?
07. JRE와 JDK의 차이
1) JRE(Java Runtime Environment) : 자바 프로그램 실행을 위한 환경을 구성하는 도구.
- Java를 실행시켜야 하는 경우 반드시 JRE가 있어야 함.
- 그러나, 개발은 불가능.
- 즉, 'Java를 단순히 실행만 해야 하는 경우' 설치
2) JDK(Java Development Kit) : 자바 개발 시 필요한 툴킷을 제공하는 도구 모음.
- Java 개발을 위해서는 반드시 설치해야 함.
- JRE를 내포하고 있음.
- 즉, JDK = JRE + 개발을 위한 툴킷
'Web_Backend > Java' 카테고리의 다른 글
야나의 코딩 일기장 :) #코딩블로그 #기술블로그 #코딩 #조금씩,꾸준히
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!