곰돌이 놀이터

[JAVA] 자바 프로그램 실행과정 및 JVM 의 구조 본문

Back-End/JAVA

[JAVA] 자바 프로그램 실행과정 및 JVM 의 구조

달나라 곰돌이 2018. 6. 26. 12:22

JVM 


JVMJava Virtual Machine 의 줄임말로 write once, run everywhere 즉, OS마다 따로 코드를 작성해야 하는 번거로움을 없이 Java가 '플랫폼에 돌립적' 일 수 있게 만들어준다.

예를들어 C 프로그램은 바로 기계어로 컴파일 하므로 HW 기종에 맞게 각각 컴파일되어야 한다. 이를 '플랫폼에 종속적이다' 라고 한다. 반면, Java 프로그램은 중간 단계언어로 컴파일하여 JVM만 각 OS에 설치되어 있다면 HW 기종에 상관없이 단 한번만 컴파일하면 된다. 이를 '플랫폼에 독립적' 이라고 한다.

간단히 말해 JVMJava 클래스 파일을 로드하고 바이트 코드를 해석하며, 메모리 등의 자원을 할당하고 관리하며 정보를 처리하는 작업을 하는 프로그램이다. OS는 JVM을 실행하고, JVM은 Java프로그램을 실행한다. JVM의 구조는 아래서 설명하겠다.


자바 프로그램 실행과정 

Java 언어로 프로그래밍된 파일을 Java 컴파일러가 가상 기계어 파일인 Java 클래스 파일로 만든다. 다시 말해, 소스 코드를 Java 바이트 코드로 번역한다. 이후 Java 바이트 코드를 JVM이 읽고 실행하게 된다.


■ 자바 바이트 코드

 JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다. 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다.

이러한 자바 바이트 코드의 확장자는 .class 이며 자바 바이트 코드는 자바 가상 머신만 설치되어 있으면, 어떤 운영체제에서라도 실행될 수 있다.


JVM 은 Java 클래스 파일을 해석하고 수행하는데 Java 클래스파일을 class loader를 통해 로드하고 클래스 파일들은 execution engine을 통해 해석된다. 또 해석된 프로그램은 runtime data area배치되어 수행이 이루어진다. 이과정 속에서 JVM은 필요에 따라 garbage collention 등의 작업을 수행하게된다.


■ Java Compiler

 JAVA Source파일을 JVM이 해석할 수 있는 JAVA Byte Code(.class 파일)로 변경한다일반적인 윈도우 프로그램의 경우, Compile 이후 Assembly 언어로 구성된 파일이 생성된다.

■ Class Loader

 JVM 내로 .class파일들을 Load한다. Loading된 클래스들은 Runtime Data Area에 배치된다. 일반적은 윈도우 프로그램의 경우, Load과정은 OS가 주도한다.

Execution Engine

 Loading된 클래스의 Bytecode를 해석(Interpret)한다이 과정에서 Bytecode Binary Code로 변경된다. 일반적인 윈도우 프로그램의 경우 Assembler가 Assembly언어로 쓰여진 코드파일을 Binarycode로 변경한다.

Runtime Data Area

 JVM 이 프로세스로써 수행되기 위해 OS로 부터 할당받는 메모리 영역이다. 저장 목적에 따라 다음과 같이 5개로 나눌수 있다.

Method Area

 모든 Thread에게 공유된다클래스정보변수정보, Method정보, static변수정보상수정보 등이 저장되는 영역

Heap Area

 모든 Thread에게 공유된다. new 명령어로 생성된 인스턴스와 객체가 저장되는 구역, 공간이 부족해지면 Garbage Collection 이 실행된다.

Stack Area

→ 각 스레드마다 하나씩 생성된다. Method 안에서 사용되는 값들(매개변수지역변수리턴값 등)이 저장되는 구역메소드가 호출될 때 LIFO로 하나씩 생성되고메소드 실행이 완료되면 LIFO로 하나씩 지워진다.

PC Register

 각 스레드마다 하나씩 생성된다. CPU Register와 역할이 비슷하다현재 수행 중인 JVM 명령의 주소값이 저장된다.

Native Method Stack

 각 스레드마다 하나씩 생성된다. 다른 언어(C/C++)의 메소드 호출을 위해 할당되는 구역 언어에 맞게 Stack이 형성되는 구역이다. JNI(Java Native Interface)라는 표준 규약을 제공한다.



'Back-End > JAVA' 카테고리의 다른 글

[JAVA] 명명규칙1( Naming Conventions )  (2) 2018.07.06
[JAVA] 자바란 무엇인가?  (5) 2018.06.19
Comments