티스토리 뷰

반응형

 JAVA라는 언어를 공부한 적이 있다면, JVM(Java Virtual Machine)에 대해 들어본 적 있을 것이다. 이번 포스팅에서는 평소에 간단하게 공부하고 지나치기 쉬운 JVM에 대해 알아보려고 한다.



그림1. 일반적인 윈도우 프로그램의 실행구조와 JAVA 프로그램의 실행구조 (출처: 자체제작)

 



 JAVA라는 언어를 공부하기 위해 어떤 교재를 구매했든, 대체로 맨 앞 챕터에서 볼 수 있는 그림이다. 두 그림의 차이점은 Program Operating System(운영체제) 사이에 JVM이라는 것이 존재한다는 점이다. 그림으로 봤을 때는 윈도우 프로그램과 JAVA프로그램의 차이는 오로지 JVM이다. 이러한 JVM이 어떤 기능을 하는지 간략하게 기술하자면... 

 

1. JAVA OS에 상관 없이 동작할 수 있도록 중계자 역할을 한다.


2. GC(Garbage Collection)등의 기능을 제공한다.


더 쉽고 자세한 이해를 위해, 일반적인 윈도우 프로그램의 제작 및 실행 과정에 대해 알아보겠다.

 


그림2. 일반적인 프로그램의 실행 과정 (출처자체제작)


 


 

 일반적인 프로그램은 ComplieLinking을 거쳐 Executable File(exe파일)의 형태로 생성된다. 그 후, 로딩이라는 과정을 거쳐, 메모리에 이 프로그램을 적재한다. 프로그램은 CPU를 동작시키는 명령으로 구성되어 있으므로 이 명령어들을 하나씩 CPU의 레지스터에 넣게 되는데, 이 작업이 바로 Fetch이다



 CPU는 이러한 명령어(보통 16진수로 표현하지만, 결국 01로 구성된 Binary Code)를 각 필드 별로 분해하고 적절히 해석하여 어떤 연산을 할 것인지 결정하는데 이 작업이 바로 Decoding이다

  


 

 

그림3. 일반적인 프로그램의 실행과정 (출처: 자체제작)


 

 


 조금 설명이 부족했지만 일반적인 윈도우 프로그램의 실행과정에 대해 알아봤다.  이제 본격적으로 자바 프로그램이 실행될 때 JVM이 어떤 역할을 하는지 알아보겠다.



그림4. JAVA 프로그램의 실행과정 및 JVM의 구조

 

 



     ① 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로부터 할당 받는 메모리 영역이다.


     ⑤ Method Area: 클래스정보, 변수정보, Method정보, static변수정보, 상수정보 등이 저장되는 영역. 모든 Thread가 공유한다


     ⑥ Heap Area: new 명령어로 생성된 인스턴스와 객체가 저장되는 구역, Garbage Collection 이슈는 이 영역에서 일어난다. 모든 Thread가 공유한다.


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


     ⑧ PC Register Area: CPU Register와 역할이 비슷하다. 현재 수행 중인 JVM 명령의 주소값이 저장된다. Thread별로 하나씩 생성된다.


     ⑨ Native Method Stack: 다른 언어(C/C++)의 메소드 호출을 위해 할당되는 구역 언어에 맞게 Stack이 형성되는 구역이다. 



 위 그림은 JAVA프로그램의 제작과정 및 JVM의 구조이다. 그 아래에 각 요소별 역할을 기술하며 프로그램의 실행과정을 설명했다. 이를 통해 미루어볼 수 있는 두 과정의 차이점은 

 

Compile 후 생성된 파일이 해석(Interpret)과 Link없이 바로 JVM에 적재된다는 점(프로그램의 생성과정 일부에 JVM이 관여함)과, OS로 부터 메모리를 할당받아 스스로 메모리 관리를 한다는 점(프로그램의 실행과정 일부에 JVM이 관여함)이 있었다. 

 

이러한 차이가 JAVA 프로그램의 주요한 특징을 만들어냈는데, 정리하면 다음과 같다.


 1. JVM은 Bytecode를 구동하고 있는 OS에 맞추어 BinaryCode로 해석(Interpret)한다. 그러므로 JAVA 프로그램은 OS에 독립적이다. (Platform Independence)


2. Bytecode는 클래스 단위(.class)로 생성되므로, 프로그램의 수정이 일어나더라도 전체 소스코드를 다시 컴파일할 필요가 없다.


3. 프로그램이 실행되는 도중에도 JVM은 OS로부터 메모리를 할당받아 스스로 관리한다. 대표적으로 GC(Garbage Collection)이 있다.

 



 




-끝-




«   2022/08   »
  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      
글 보관함
Total
820,508
Today
9
Yesterday
266