자바는 JVM위에서 코드가 실행된다는 것은 사실 아실 것입니다.
C와 같은 언어는, 운영체제 바로 위에서 운영체제에게 메모리를 요구하거나, 연산을 요구하는 등... 직접적으로 실행되므로, 빠르고 가볍지만, 개발에 있어서 그만큼 메모리 회수라던지 신경쓸게 많지만, 자바의 경우 JVM이라는 가상머신, 즉 운영체제 위의 응용프로그램 위에서 돌아가는 코드이기에, 약간 무거워지지만, 메모리 공간을 저절로 해제해주는 가비지 컬렉터와 같은 편리한 기능으로 개발자가 온전히 논리적인 개발을 하며, 쉽고 빠르게 개발을 하도록 도와줍니다.
C의 경우 우리가 알 수 있는 고급언어인 소스토드를 먼저 작성한 후, 그 ,c라는 확장자의 텍스트 파일이, 컴파일이라는 과정을 거쳐서 기계가 이해할 수 있는 바이너리 코드인 기계어로 번역되어 ,exe나 ,lib과 같은 파일로 변환이 됩니다.
사실 이는 많이 축약된 것으로, 텍스트 소스코드(c)나 OS나 하드웨어에 맞춰 제작된 컴파일러에 의해 컴파일 되어, CPU나 제작되며 미리 디자인된 어셈블리어(obj)로 변환되고, 여러 obj파일에서, 서로 이어진 부분이,링커라는 것을 통해, 외부 라이브러리나 다른 코드파일이 하나의 코드로 합쳐지고, 그 어셈블리어가 또 어셈블러라는 CPU제작자가 만들어 놓은 완전한 기계어 번역 과정을 거치게 되어 exe실행 파일로 변형되는 것입니다.
C 코드는
C 소스코드 -> 어셈블리어 -> 기계어
자바의 경우는, JVM이라는 가상머신이 해당 자바코드를 사용하여, 실행에 대한 하드웨어, 운영체제 측면의 작업을 대신해 주는 것입니다.
자바 프로그램 실행과정
java 언어로 프로그래밍된 파일은 java컴파일러가 가상 기계어 파일인 java클래스 파일로 만듭니다. 다시 말해, 소스 코드를 java바이트 코드로 번역합니다. 이후 java바이트 코드를 JVM이 읽고 실행합니다.
< 자바 바이트 코드 >
JVM이 이해할 수 있는 언어로 변형된 자바 소스 코드를 의미합니다. 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트여서 자바 바이트 코드라고 불립니다.
이러한 자바 바이트 코드의 확장자는 .class이며 바이트 코드는 자바 가상 머신이 설치만 되어 있으면, 어떤 운영체제에서라도 실행될 수 있습니다.
JVM은 Java클래스 파일을 해석하고 수행하는데 Java클래스 파일을 class loader를 통해 로드하고 클래스 파일은 execution engine을 통해 해석됩니다. 또 해석된 프로그램들은 runtime data erea에 배치되어 수행이 이루어집니다. 이 과정속에서 JVM은 필요에 따라 garbage collection등의 작업을 수행하게 됩니다.
< 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된 클래스 바이트코드를 해석합니다. 이 과정에서 바이트코드가 바이너리 코드로 변경됩니다. 일반적인 윈도우 프로그램의 경우 Assembler가 Assembly언어로 쓰여진 코드파일을 바이너리 코드로 변경합니다.
< Runtime Data Area >
JVM이 프로세스로써 수행되기 위해 OS로 부터 할당받는 메모리 영역입니다. 저장 목적에 따라 다음과 같이 5개로 나눌 수 있습니다.
<Method Area >
모든 Thread에게 공유됩니다. 클래스정보, 변수정보, Method정보, static변수정보, 상수정보 등이 저장되는 영역
< Heap Area >
모든 Tread에게 공유됩니다. new명령으로 생성된 인스턴스와 객체에 저장되는 구역, 공간이 부족해지면 Garbage Collection이 실행됩니다.
< Stack Area >
각 Thread마다 하나씩 생성됩니다. Method안에서 사용되는 값들(매개변수, 지역변수, 리턴값 등)이 저장되는 구역, 메소드가 호출될 떄 LIFO로 하나씩 생성되고 메소드 실행이 완료되면 LFIO로 하나씩 지워집니다.
< PC Register >
각 스레드마다 하나씩 생성됩니다. CPU의 Register의 역할이 비슷합니다. 현재 수행 중인 JVM의 명령의 주소값이 저장됩니다.
< Native Method Stack >
각 Thread마다 하나씩 생성됩니다. 다른 언어(C/C++)등의 메소드 호출을 위해 할당되는 구역 언어에 맞게 Stack이 형성되는 구역입니다. JNI(Java Native Interface)라는 표준 규역을 제공합니다.
'School > Java Programming' 카테고리의 다른 글
Java Programming - 중첩 클래스 & 중첩 인터페이스 (0) | 2022.03.17 |
---|---|
Java Programming - Interface (0) | 2022.03.10 |
Java Programming - Inheritance (0) | 2022.03.09 |
Java Programming - Class (0) | 2022.03.09 |
Java Programming - Array (0) | 2022.03.09 |