일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Pattern
- Numpy
- error
- 함수
- db
- LIST
- DeepLearning
- java
- Server
- Web
- interface
- framework
- Python
- Linux
- learning
- Spring
- git
- Github
- Deep
- 인공지능
- ai
- javascript
- data
- 자바
- mysql
- SSH
- Analysis
- centos
- Security
- mariaDB
- Today
- Total
PostIT
[Java/JVM] JVM 이해를 통한 Java 작동원리 이해하기 본문
[Java/JVM] JVM 이해를 통한 Java의 작동원리 이해하기
최근 작성일 : 2017.06.01
## 1. JVM이란?
JVM은 물리적 머신을 소프트웨어 구현한 Java 프로그램을 실행할 수 있게 해주는 추상컴퓨팅 시스템입니다. Java는 WORA(Write Once Run Anywhere)의 철학을 위해 VM을 개발하였습니다. JVM은 OS에 상관없이 어느 환경에서도 Java가 실행이 가능토록 만들어 준 것입니다. Java를 컴파일 언어로서 실행하기 위해서는 컴파일을 거쳐야 합니다. Java 컴파일러는 .java 파일을 .class 파일로 컴파일 합니다. 이는 .java 파일을 Java byte code로 변환하여 .class 만드는 것입니다. Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행이 되지 않습니다. 이를 해결하기 위해 JVM을 통해 .class 파일을 로드/해석하여 Java 프로그램을 실행합니다.
(초기 Java는 JVM의 해석을 거치기 때문에 c언어 같은 네이티브 언어에비해 속도가 많이 느렸습니다. 하지만, JIT(Just In Time)컴파일러를 구현해 이점을 극복했습니다.
[JVM 아키텍쳐 사진]
## 2. JVM은 어떻게 작동되는가?
### 1. Class Loader Subsystem
- Java의 동적 클래스 로딩 기능은 클래스 로더 하위 시스템에서 처리합니다. 이 시스템은 컴파일 타임이 아닌 런타임에 클래스를 처음 참조 할 때 클래스 파일을 로드/링크/초기화합니다.
1.1 Loading
클래스들은 이 구성 요소에 의해 로드됩니다. Boot Strap class Loader, Extension class Loader 그리고, Application class Loader는 이를 달성하는 데 도움이되는 세 가지 클래스 로더입니다.
Boot Strap ClassLoader
rt.jar 이외의 부트 스트랩 클래스 경로에서 클래스를로드하는 역할을합니다. 이 로더는 우선 순위가 가장 높습니다.
Extension ClassLoader
ext 폴더 (jre \ lib)에 있는 클래스를 로드하는 작업을 담당합니다.
Application ClassLoader
응용 프로그램 수준 클래스 경로, 환경 변수 등을로드하는 데 사용됩니다. 위 클래스 로더는 클래스 파일을 로드하는 동안 위임 계층구조 알고리즘을 따릅니다.
1.2 Linking
Verify
바이트 코드 검증기는 생성 된 바이트 코드가 올바른지 여부를 검증합니다. 검증이 실패하면 검증 오류가 발생합니다.
Prepare
모든 정적 변수에 대해 메모리가 할당되고 기본값이 지정됩니다.
Resolve
모든 기호 메모리 참조가 메소드 영역의 원래 참조로 바뀝니다.
1.3 initialization
이것은 클래스 로딩의 마지막 단계입니다. 여기서 모든 정적 변수는 원래 값으로 지정되고 정적 블록이 실행됩니다.
- 런타임 데이터 영역은 5 개의 주요 구성 요소로 나뉩니다.
- 런타임 데이터 영역에 할당 된 바이트 코드는 실행 엔진에 의해 실행됩니다. 실행 엔진은 바이트 코드를 읽고 조각 별로 실행합니다.
- JNI는 Native Method Libraries와 상호 작용하고 Execution Engine에 필요한 Native Libraries를 제공합니다.
- 실행 엔진에 필요한 원시 라이브러리의 모음입니다.
'Java' 카테고리의 다른 글
[Java/Regex] 자바 정규표현식에 대해서 공부하고 예제 만들기 (0) | 2017.06.02 |
---|---|
[Interpreter/Compiler] 인터프리터와 컴파일러의 차이점 (0) | 2017.06.01 |
[Java/Stack/Heap] JAVA의 Stack과 Heap의 이해를 통해 Java의 메모리 관리 (1) | 2017.05.31 |
[Java] Java Stream의 개념과 종류 (0) | 2017.04.24 |
[Java] Interface와 Abstract class의 차이점 및 사용방법 이해하기. (1) | 2017.04.18 |