JDK, JRE, JVM 에 대해서 무엇인지 그리고 차이점은 어떠한지 알았다. 그럼 끝일까? 만약 누군가 너에게 이렇게 물으면 넌 뭐라고 대답할 것인가.
JRE 는 자바 애플리케이션을 실행하기 위한 최소한의 환경을 제공해준다고 배웠고, JVM 은 자바 컴파일러에 대해서 변환된 자바 바이트 코드를 실행하기 위한 가상 머신이라면 이것들이 어떻게 작동하는지 알아?
글을 쓰고 있는 이 시점에서 대답하지 못한다. 그럼 공부해야지.
1 2 3 4 5 6 7 8 9 10 | class Example { public static void main(String[]args){ Example example = new Example(); example.print(); } public void print(){ System.out.println("Hello World"); } } | cs |
이런 코드가 존재한다. 실행하면 당연하게 Hello World 가 콘솔 창에 출력될 것이다. 출력되는 과정을 살펴보자. 우선 해당 자바 파일이 존재하는 디렉토리로 이동하고 이후에 아래의 명령을 일련의 순서로 실행하게 된다.
javac Example.java [ java 파일을 class 파일로 변환 ]
java Example [ class 파일 실행 ]
이렇게하면 출력값이 나온다. 물론 위의 과정을 제대로 수행하기 위해서는 환경변수 JAVA_HOME 과 CLASSPATH 가 올바르게 설정되어 있어야 한다.
아래의 그림은 컴파일과 런타임때 수행되어지는 작업들이다.
컴파일은 아까와 같이 cmd를 통해서 수행한 작업들을 플로우 형태로 나타낸 것이다. 중점적으로 살펴보아야 할 것은 런타임이다. 런타임 수행 시 그림과 같은 작업들이 나타나고 살펴보자.
Class Loader
클래스 로더는 프로그램 실행에 필요한 모든 클래스들을 로드한다. 위의 코드에서 new Example example = new Example(); 이라는 코드를 최초로 실행할 때, JVM은 Example 이라는 클래스를 클래스 로더를 통해 메모리에 로드(Load)하게 된다.
"로드" 라는 표현은 운영체제에서 컴퓨터가 프로그램을 수행할 수 있도록 기억장치에 적재하는 것을 의미하여 이에 해당하는 프로그램을 로더라고 한다. 따라서 클래스를 로드하는 프로그램을 클래스 로더라고 말할 수 있는 것이다.
Byte Code Verifier
JVM 으로부터 로드된 ByteCode 는 Execution Engine에 의해 Runtime Data Area에 배치되기 전에 ByteCode에 대한 검증 절차(형식 및 불법 코드에 대한 검사)를 가지는데 불법 코드는 객체에 대한 액세스 권한을 위반하거나 혹은 포인터 구현을 위반하는 코드들이다. 주요 내용은 아래와 같다.
(1) 코드가 JVM이 명시한 내용과 일치하는지
(2) 메모리에 허가되지 않은 접근이 존재하는지
(3) 스택오버플로우 체크
(4) 데이터 타입 체크
위의 검증절차의 목적은 JVM이 손상될 수 있는 작업들을 사전에 수행하지 않기 위함에 있다. ( JVM to crash )
Interpreter
런타임 시 바이트 코드는 인터프리터에 의해 로드되고, 검사되고, 실행된다. 인터프리터는 다음의 두 가지 기능을 수행한다.
(1) 바이트 코드의 실행
(2) 기본 하드웨어 호출
결론 (How Java Code Runs?)
아래의 그림과 같이 나타낼 수 있다.
관련 상세한 내용은 다음 기회에...
'jvm lang' 카테고리의 다른 글
20180214 Use UNIVocity-Parser (tsv, csv, json) (0) | 2018.02.14 |
---|---|
20180212 자바 공백 및 개행 제거 (0) | 2018.02.12 |
20180209 Java Exception Handling (0) | 2018.02.09 |
20180212 How JVM Works (수정 2020-08-16) (0) | 2018.02.09 |
20180209 Difference between JDK & JRE & JVM (0) | 2018.02.09 |