JAVA 실행 과정
JAVA 언어로 프로그래밍된 파일을 JAVA컴파일러가 가상 기계어 파일인 JAVA클래스 파일로 만들어 이를 JVM이 실행을 하게 된다. 다시 말해 사용자가 작성한 .java파일이 JAVA컴파일러를 거쳐서 중간 코드인 .class(Java Byte Code)로 변환되며 이를 JVM이 실행하게 된다.
○ 컴파일러
프로그래밍 언어로 작성된 파일을 컴퓨터가 바로 이해할 수 있도록 번역(컴파일)을 하는 프로그램이다. JAVA 프로그래밍 언어를 컴파일할 시에는 javac라는 컴파일러를 통하여 .java파일을 .class파일로 컴파일을 수행하게 된다.
○ .class(Java Byte Code)
JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다. Java Byte Code는 JVM만 설치되어 있으면 어떤 운영체제에서라도 실행될 수 있다.
JVM
JVM은 Java Virtual Machine의 줄임말로 write once, run everywhere(한번 작성하면 어디서든 실행이 가능) 줄여서 WORA라는 개념을 강조하고 있다. 쉽게 말해 OS마다 따로 코드를 작성해야 하는 번거로움 없이 JAVA가 플랫폼에 독립적일 수 있게 만들어 준다. 예를 들어 C 프로그램은 바로 기계어로 컴파일하므로 HW 기종에 맞게 컴파일되어야 한다. 이를 '플랫폼에 종속적이다'라고 한다. 반면 Java 프로그램은 중간 단계 언어로 컴파일하여 JVM만 각 OS만 설치되어 있다면 HW 기종에 상관없이 단 한 번만 컴파일하면 된다. 이를 '플랫폼에 독립적이다'이라고 한다. JVM의 특징을 정리해 보면 아래와 같다.
○JAVA의 중간 코드를 실행할 수 있는 주체
○JAVA와 OS 사이의 중개자 역할
○JAVA가 OS에 종속되지 않고 사용 가능하게 해 줌
○메모리 관리 기능(용도에 따라 여러 영역으로 나누어 관리), Garbage Collection을 제공
왼쪽이 JAVA 오른쪽이 그 외 JVM을 사용하지 않는 언어들로 작성한 프로그램의 실행 구조이다. 앞서 설명한 바와 같이 JAVA의 경우는 JVM이 OS로부터 메모리 사용권한을 받아 프로그램을 실행시켜주기 때문에 JVM이 지원하는 모든 OS들에 독립적일 수 있다.
JVM의 구성
크게 나누어 Class Loader, Execution Engine, Runtime Data Areas의 세 가지로 나눌 수 있다. 쉽게 말해 Class Loader는 .class파일로 부터 class 정보를 읽어와 데이터 영역에 로딩해주는 역할을 하고 Execution Engine은 데이터 영역에 로딩된 클래스 정보를 실행하는 역할을 하며 Runtime Data Areas는 Class Loader가 로딩한 클래스 정보를 저장하는 역할을 한다.
○ Class Loader
.class파일을 읽어 들여 class 객체를 생성하는 역할을 담당한다. 자바 클래스들은 한 번에 모든 클래스가 메모리에 올라가지 않으며 각 클래스들이 필요할 때 애플리케이션에 올라게 된다. 즉 클래스가 요청될 때 .class파일로 부터 바이트 코드를 읽어 메모리로 로딩되는데 이러한 동적 로딩은 Class Loader을 통해서 이루어진다.JVM은 클래스에 대한 정보를 알지 못하기 때문에 그 정보를 Class Loader가 Class 파일을 찾아 검사하고 메모리에 저장해두는 것이다.
○ Execution Engine
Class Load 작업 후 , Byte Code는 Runtime Data Area에 배치된다. JVM은 Class Area의 Byte Code를 Execution Engine에 제공하여 Class에 정의된 내용대로 실행하게 된다. 즉 Execution Engine이란 ByteCode를 실행하는 Runtime Module이다. ※ Runtime Module의 방식은 Interpreter와 JIT(just in time) Compiler 방식이 있다.
○ Runtime Data Areas
프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
Runtime Data Areas
사용하는 클래스가 JVM이 종료될 때까지 유지된다. 이렇게 Class 영역에 바이트 코드가 올라가는 것을 ClassLoding이라고 하며 ClassLoding 이 돼야 하는 이유는 메소드를 호출하기 위해서는 먼저 그 메소드를 갖고 있는 클래스 파일(바이트 코드)이 메모리에 로딩되어 있어야 하기 때문이다. 모든 Thread에 공유된다.
○ Heap 영역
기본형 변수를 제외한 참조형 변수들이 가리키는 곳(주소)에 내용이 저장되는 영역이다. 흔히 new를 통해 생성된 인스턴스가 저장되는 곳이다. 모든 Thread에 공유된다.
○ Stack 영역
Method 안에서 사용되는 값들(매개 변수, 지역 변수, 리턴 값 등)이 저장되는 구역이다. 지역변수와 매개변수가 저장되는 곳으로 메소드가 호출되었을 때 스택 영역에 메모리를 할당한다. 지역문 안에서만 임시 할당돼있다가 지역문이 끝나면 삭제된다. 각 Thread마다 하나씩 생성된다.
'JAVA' 카테고리의 다른 글
람다식(Lambda Expression) (0) | 2022.07.17 |
---|---|
enum (0) | 2022.01.16 |
예외 처리 (0) | 2022.01.05 |
예외 (0) | 2022.01.01 |
final & static (0) | 2021.12.31 |