Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Kotlin
- bean
- mirror maker2
- Streams
- cd
- centos7
- ECS
- QueryDSL
- spring
- JPA
- K8s
- offsetdatetime
- CI
- producer
- spring kafka
- AWS
- consumer
- entity graph
- API
- Spring JPA
- CodePipeline
- Kubernetes
- topic생성
- kafka
- transactionaleventlistener
- git
- mysql
- PAGING
- Entity
- Spring Data JPA
Archives
- Today
- Total
Yebali
[Java] Java 컴파일과 실행 순서 본문
자바는 'WORA(Wirte Once, Run Anyway)라는 모토를 가진 언어이다. 즉 한번 작성된 코드는 어떠한 플랫폼에서든 쓸 수 있다.
이런 마법은 JVM(Java Virtual Machine)에 의해 가능하는데, JVM은 OS와 Java 프로그램 사이에 일종의 중계 역할을 하는 가상 머신으로 OS와 독립적인 가상의 환경을 만들어 Java 프로그램이 실행될 수 있게 해 준다. 즉, OS에 JVM만 설치되어 있다면 어디서든 Java 프로그램을 실행할 수 있게 해 준다.
Java 컴파일 순서
- 자바 컴파일러(Java Complier/ javac)가 자바 소스를 컴파일한다. (.java -> .class)
컴파일 결과로 생성되는 파일(.class)을 바이트 코드라고 하며, 바이트 코드는 컴퓨터가 이해할 수 없고 JVM이 이해할 수 있는 코드이다. 바이트 코드의 명령어는 1Byte 크기의 Opcode와 피연산자로 이루어져 있다. - 컴파일된 바이트 코드를 JVM의 클래스 로더(Class Loader)에게 전달한다.
- 클래스 로더(Class Loader)는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(RunTime Date Area / JVM의 메모리 영역)에 올린다.
- 클래스 로더의 세부 동작
- 로드 : 클래스 파일(.class)을 가져와 JVM의 메모리에 로드한다.
- 검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사한다.
- 준비 : 클래스가 필요로 하는 메모리를 할당한다.
- 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
- 초기화 : 클래스 변수들을 적절한 값으로 초기화한다.(static 필드)
- 클래스 로더의 세부 동작
- 실행 엔진(Execution Engine)은 JVM메모리에 올라온 바이트 코드를 명령어 단위로 하나씩 가져와서 실행한다.
이때 실행 엔진은 두 가지 방식으로 동작한다- 인터프리터(interpreter) : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다.
하나하나의 실행 속도는 빠르나 전체적인 실행 속도가 느리다. - JIT 컴파일러(Just In Time Compiler) : 인터프리터의 단점을 보완하기 위한 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고, 이후 인터프리팅 하지 않고 바이너리 코드를 직접 실행하는 방식이다. 전체적인 실행 속도는 인터프리터보다 빠르다.
- 인터프리터(interpreter) : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다.
참고.
- https://news.skhynix.co.kr/post/james-gosling-founder-of-java
- https://93jpark.tistory.com/54
'Backend Common' 카테고리의 다른 글
Time zone과 표준시 (0) | 2022.11.27 |
---|---|
[WebSocket] WebSocket이란? (0) | 2022.09.27 |
[JAVA] Garbage Collection의 개념과 동작 (0) | 2022.09.25 |
[JAVA] JVM의 구조 (0) | 2022.09.25 |
쿠키, 세션 그리고 토큰 (0) | 2022.01.21 |