JAVA

[JAVA] #1.JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가

cattaku 2021. 1. 30. 02:15

JVM이란 무엇인가?

Java Virtual Machine 의 약자로 OS와 프로그램의 사이에서 기계어로 해석해 주는 역할을 해주며,
운영체제 종류에 상관없이 실행 가능하도록 해준다.

JVM 구성 요소

- Class Loader
클래스 로더는 로딩, 링크, 초기화 순서로 진행됩니다. 클래스 로더라는 이름 그대로 클래스 파일을 적재(Runtime Data Area) 하는 역할을 하며, 자바 소스 파일을 컴파일 하면 바이트 코드(.class 파일)이 생성되고 class 파일들을 모아 클래스 로더가 메모리에 적재시킨다.

- Execution Engine
class Loder에 의해 메모리에 적재된 클래스(바이트코드)들을 컴퓨터가 이해할 수 있는 기계어로 변경해 명령어 단위로 실행하는 역할을 한다. 이 때 명령어를 하나씩 실행하는 인터프리터 방식이 있고, 바이트 코드를 네이티브 코드로 변환하는 JIT Compiler 방식이 있다.

- Runtime Data Area 
클래스 파일이 적재되어 있는 장소로 Rumtime Data Area에는 5개의 영역이 존재한다. 
클래스 멤버 변수의 이름, 테이터타입, 리턴타입, 상수풀, static 변수등이 저장되는 메서드 영역(Method Area), 
new연산자로 생선된 객체와 배열이 저장되는 힙 역역(Heap Area),
스레드가 생성될 때 마다 생성되는 스택 영역(Stack Area), 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 PC Register, 자바 언어 이외의 언어로 작성된 코드를 저장하는 메모리 영역인Native Method Stack 이 있다.

- Garbage Colloetor
가비지 컬렉터는 힙 영역에 생성된 객체들 중에 참조되지 않는 객체들을 메모리에서 제거하는 역할을 한다.


자바 컴파일 하는 방법과 실행하는 방법

 

 

class Hello {
	public static void main(String[] args) {
    	System.out.println("Hello, World!");
    }
}

 

위에 Hello.java 실행한다고 가정하면 우선 자바컴파일러(javac.exe)를 사용해서 소스파일 Hello.java로 부터 클래스 파일을 생성해야 한다. 그 다음 자바 인터프리터(java.exe)로 실행한다.

CMD 창을 열고 자바 소스파일을 저장한 위치로 이동 후 javac Hello.java 를 입력하면 해당 폴더에 Hello.class 파일이 생성된다. 이 상태에서 Hello.java를 입력하면 자바파일이 컴파일 되는 것을 확인 할 수 있다. 

 

바이트코드란 무엇인가?

자바 바이트 코드(Java bytecode)란 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다.
자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 한다.이러한 자바 바이트 코드의 확장자는 .class이며, 자바 바이트 코드는 JVM이 설치되어 있으면, 어떤 운영체제에서라도 실행할 수 있다.

JDK와 JRE의 차이

- JDK
Java Devilopment Kit의 약자로 JDK는 JRE + 개발을 위해 필요한 도구(javac, java등)들을 포함한다.

- JRE
Java Runtime Environment의 약자로 컴파일된 자바 프로그램을 실행시킬 수 있는 자바 환경을 의미한다.
JRE 는 자바 개발 kit를 다운로드할 때 기본적으로 포함되며 각 JRE 에는 코어 자바 클래스 라이브러리, 자바 클래스 로더, 자바 가상 머신이 포함되어 있다.

JIT 컴파일러란 무엇이며 어떻게 동작하는지

JIT는 'Just-in-time'의 약자로, JIT 컴파일은 Java, C# 등에서 제공하는 실시간 컴파일 방식이다. C나 C++과 같이 프로그램 실행 전에 컴파일을 하는 방식이 아닌, 프로그램을 실행하는 시점에 필요한 부분을 즉석에서 컴파일 하는 방식으 기법이다.  
Java에서 Compile 을 하면 Bytecode 로 변환되는데, 
바이트코드는 기계가 바로 읽을 수 있는 형태가 아니기 때문에
기계가 읽을 수 있는 형태(native code)로 interpreter 를 통해 해석해 줘야 한다. 
JVM( Java Virtual Machine ) 이 이 bytecode 를 해당 기계에 맞는 기계어로 다시 번역하는 작업을 하는 것이다. 이 JVM이 바이트코드를 기계어로 interpret(해석) 할 때, 반복되는 내용은 컴파일을 해서 사용한다. 이 과정을 JIT 컴파일JIT 컴파일링은 한번만 실행되기 때문에, 최초 실행시에는 조금 느릴 수 있다. JIT 컴파일러를 사용하면, 컴파일 없이 Interpret만 하는 경우보다 반복적인 작업을 할 때 훨씬 높은 성능을 낼 수 있다. 

출처: https://aroundck.tistory.com/1949 [돼지왕 놀이터]