JVM이란 무엇인가

컴파일 하는 방법

컴파일은 소스코드를 모두 기계어 파일로 바꿔주는 과정을 말한다. 자바에서 빌드 시, 자바 컴파일러는 'javac'라는 명령어를 통해 자바파일(.java)을 반기계어인 자바 바이트코드(.class)로 바꿔준다.

자바 파일이 아닌 클래스 파일을 다른 OS로 넘겨 JVM으로 실행시켜도 문제없나? 없다고 한다!

javac hello.java

실행하는 방법

컴파일 된 클래스파일을 'java'라는 명령어를 이용하면 실행된다. 하지만 여기서 파일 확장자는 빼줄 것! 스페이스를 주고 매개변수(메인 메서드의 String[] args에 해당)를 전달할 수 있다.

java hello

바이트코드란 무엇인가

자바 바이트코드란 자바파일이 컴파일을 통해 변환된 JVM이 읽을 수 있는 반기계어다. 변환된 코드의 명령어 크기가 1바이트라서 바이트코드라고 불린다고 한다. JVM은 이 바이트코드를 운영체제에 맞게 기계어로 해석해준다.

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

바이트코드는 JVM내로 로드되고 실행엔진에 의해 기계어로 해석된다. Interpreter는 바이트코드를 한줄씩 읽어 해석하고 실행하는데 이런 방식은 속도가 느리다는 단점이 있어 이 단점을 보완하기 위해 나온 것이 JIT 컴파일러다. 처음에는 인터프리터로 바이트코드를 해석하다가 한 번 실행되었던 메소드가 재호출될 때 해당 바이트코드를 통째로 기계어로 변환시켜주어 바로 실행시켜준다. 이 방법은 동적번역(dynamic translation)이라고도 부른다.

JVM 구성 요소

JVM은 실행엔진과 Runtime Data Area 그리고 클래스로더로 구성되어있다.

Class Loader

클래스로더는 JVM으로 클래스파일을 로드해주는 역할을 맡는다. 자바는 동적으로 클래스를 로드하기 때문에 필요한 부분(실행이 될 때)만 로딩해서 사용하게 된다. 클래스로더는 로딩, 링킹, 초기화 과정을 통해 동작한다.

Runtime Data