JAVA 실행 과정
JVM을 설명하기 전에 왜 저것을 알아야 하는지를 위해, JAVA 실행 과정을 간단한 사진으로 빠르게 설명하고자 한다. 위 그림과 같이 우리는 MyProgram.java라는 파일에 간단한 소스코드를 작성했다. 이를 실행하기 위해 나는 이클립스에서 CTRL + F11을 눌렀다. 그리고 그 결과가 나왔다.
컴퓨터는 우리가 작성한 JAVA 코드를 읽을 수 있는걸까? 정답은 아니다! 컴퓨터는 자기가 이해할 수 있는 기계어로 작성되어져야 우리가 실행하고자 하는 바를 할 수 있다. 우리가 작성한 자바 소스 코드를 기계어로 변환하기까지 위와 같은 과정이 이루어지는 것이다.
MyProgram.java를 컴파일러가 MyProgram.class 바이트 코드로 변환하고 OS에 맞게 설치된 JVM이 컴퓨터가 이해할 수 있도록 기계어로 변환해준다. 그리고 이제 컴퓨터는 동작이 가능하다.
바이트코드란 무엇인가
바이트코드는 고급언어로 작성된 소스 코드를 JVM이 이해할 수 있는 중간코드로 컴파일한 것을 말한다. 자바 바이트 코드는 위에서 본 사진에서와 같이 .class 확장자를 갖는다. 이는 자바 코드를 배포하는 가장 작은 단위이다. 간단히 Hello World를 출력하는 소스코드를 작성한 후 바이트 코드를 확인했다.
JVM이란 무엇인가
JVM이 하는 역할이 뭔지 대충 틀이 생겼다. 그럼 이제 JVM이 무엇인지 진짜 알아보자. JVM은 Java Virtual Machine으로 자바 바이트코드를 해석하고 실행하는 것이다.
JVM은 다음과 같은 특징을 갖는다.
스택 기반의 가상 머신
LIFO한 성격을 갖는 스택 기반의 가상 머신으로 만들어졌다. 가상 머신은 operand의 주소 값을 명확하게 알아야할 필요가 없이 PUSH POP으로 계산하고 결과를 저장한다.
심볼릭 레퍼런스
말 그대로 physical하게 메모리의 위치를 가리키는 것이 아니라 symbolic하게 가리킨다.
가비지 컬렉션
프로그램이 동적으로 할당했던 메모리(Heap Space) 영역 중에서 필요없게 된 영역을 해제한다.
플랫폼 독립성 보장
기본 자료형을 명확하게 정의하여 호환성을 유지하고 플랫폼 독립성을 보장 JRE가 설치된 모든 운영체제에서 재컴파일없이 실행 가능하다 (이식성)
네트워크 바이트 오더
플랫폼 독립성을 위해, 고정된 바이트 오더를 유지해야 하므로 네트워크 전송 시에 사용하는 바이트 오더인 네트워크 바이트 오더(빅 엔디안)를 사용
컴파일 & 실행하는 방법
컴파일러에의해 컴파일된 바이트 코드를 클래스로더가 런타임 데이터 영역에 올리고, 실행 엔진이 자바 바이트 코드를 실행한다. 좀 더 자세한 용어가 나왔다. 클래스로더, 런타임 데이터 영역, 실행 엔진 .. JVM 구성요소에서 자세히 알아보도록 하겠다. 먼저 컴파일과 실행 과정에 대해서 알아보자.
JVM 구성 요소
클래스 로더
JVM이 시작되면 Bootstrap Class Loader, Extension Class Loader, System Class Loader가 사용된다.
자바 클래스를 JVM으로 동적 로드(컴퓨터 프로그램이 메모리로 라이브러리 또는 다른 프로그램을 적재/링크 하는 방식)하는 JRE의 일부이다. 컴파일 타임이 아니라 런타임에 클래스가 로딩된다.
- 계층 구조
부모-자식 관계를 이루어 계층 구조를 갖는다. Bootstrap classloader가 최상위 로더이다.
- 위임 모델
그림과 같이 계층 구조를 바탕으로 클래스 로드를 위임하는 구조를 갖는다. 먼저 상위 클래스 로더를 확인하여 없으면 로드를 요청 받은 클래스 로더가 로드한다.
System Loader -> Extension Loader -> Bootstrap Loader 이렇게 상위 클래스 로더로 위임하여 확인하고, Bootstrap Loader에서 못 찾으면 -> Extension Loader -> System Loader -> Exception 다음과 같은 순서로 요청을 넘긴다.
- 가시성 제한
하위 클래스 로더는 상위 클래스 로더의 클래스를 찾을 수 있지만, 그 역은 안된다.
- 언로드 불가
클래스 로더는 클래스 로드는 가능하지만 언로드 할 수 없다.
클래스 로드하는 과정은 다음과 같다.
1. Loading
2. Verifying
3. Preparing
4. Resolving
5. Initializing
JDK와 JRE의 차이
JIT 컴파일러란 무엇이며 어떻게 동작하는가
출처
'Backend > JAVA' 카테고리의 다른 글
🙀 log4j 보안 취약점 발견 기념(?)으로 짧게 공부하기 (0) | 2022.01.04 |
---|