프로그래밍/JAVA&J2EE

JVM(Java Virtual Machine)

모지사바하 2007. 7. 3. 10:12
JVM은 Java Virtual Machine의 약자이다. Machine이라는 말이 들어가 있긴 하지만, 실제로는 소프트웨어이다. Machine이라는 말이 들어간 이유는 JVM이 실제적으로 CPU와 같은 역할을 하기 때문인 것이라고 추정된다.

프로그램은 CPU 위에서 돌아가게 된다. 따라서 C나 C++과 같은 일반적인 프로그램 언어에서 컴파일하여 생성된 코드는 바로 해당 CPU에서 실행이 가능한 코드이다. 하지만 자바 소스코드(*.java)를 컴파일한 경우 생성되는 클래스파일(*.class)은 직접 CPU에서 동작할 수 있는 코드(native code)가 아니다. 생성된 클래스파일은 중간단계의 언어라고 할 수 있는 byte code로 이루어져 있다. 바로 이 byte code를 실행시키기 위한 가상적인 CPU가 필요한데 바로 그것이 Java Virtual Machine이 되는 것이다.

그렇다면 왜 Java 언어는 native code가 아닌 byte code를 생성하는가? 그 이유는 바로 이식성 때문이다. 직접 native code를 생성하게 되면, 그 native code는 CPU에 종속적인 특성을 갖게 된다. 즉 컴파일된 CPU에서만 돌아간다는 것이다. 반면에 byte code는 JVM 위에서 돌아가기 때문에, 어떤 플랫폼이건 JVM만 있으면 실행이 가능하게 되는 것이다.


아래 두 그림에서 Interpreter의 역할을 하는 것이 바로 JVM이다. 실제로 JDK에 포함되어 있는 파일 중에 JVM(Java Interpreter)은 java.exe이고, Java Compiler는 java.exe이다.




아래 그램에서 보는 바와 같이, 일반적으로 Java Platform이라고 말할 때, 이는 Java API와 Java Virtual Machine을 두고 하는 말이다. Java API가 프로그램을 짤 때 사용하기 위한 라이브러리의 집합이라고 한다면, Java Virtual Machine은 작성된 프로그램을 실행시키기 위한 환경이라고 볼 수 있다.



JVM은 이와 같이 기본적으로 byte code를 실행시켜 주는 역할을 감당하고 있는데, 그 역할을 감당하기 위해서, runtime linking과 garbage collection을 지원한다.

runtime linking은 실행 class가 JVM을 통해서 실행되는 중에 필요한 외부 class와 결합(linking)되도록 하는 방식을 말한다. JVM에서 이런 runtime linking이 지원되므로, 여러 클래스들이 한 프로그램을 구성하는 경우에, 한 클래스를 수정해야 할 일이 발생할 경우, 전체를 다시 컴파일할 필요가 없이, 단지 변경된 클래스가 속한 파일만을 컴파일해주면 된다는 장점을 갖게 된다.

garbage collection은 더 이상 사용하지 않는 메모리 영역을 시스템 자원으로 돌려주는 것이라고 말할 수 있다. 이것은 프로그래머의 실수로 인한 memory leak(메모리 누수 현상)을 방지해주며, 그에 따라 프로그래머의 부담을 덜어주게 된다.


JVM의 단점은 다른 인터프리터 방식의 언어(ex. BASIC)보다는 상당히 빠른 수행능력을 보이지만, 일괄 컴파일 방식 언어(ex. C, C++)보다는 수행 속도가 느리다는 것이다. 이것은 JVM이 컴파일하여 생성한 byte code를 사용하긴 하지만, JVM이 실행 중에 byte code를 native code로 변환하는 시간을 필요로 하기 때문이다.


인터넷 프로그래밍에 있어서는 대부분의 웹브라우저 자체가 plug-in 형태로 JVM의 역할을 내장하고 있다. 따라서 웹 개발자가 Java Applet으로 개발을 한 경우, 사용자의 웹브라우저가 JVM을 내장하고 있다는 조건만 충족된다면, 그 사용자가 웹브라우저를 구동하고 있는 플랫폼이 어느 곳이건 간에 문제가 되지 않는다는 이점이 있다.

또한 서버측 스크립트 언어를 사용하면, 그 자체로 사용자가 웹브라우저를 구동하고 있는 플랫폼 자체가 문제가 되지 않으며, 따라서 JVM이 웹브라우저에 포함되어 있지 않다고 하더라고 문제가 되지 않는다. 그러나 이 경우 서버측 스크립트 언어가 돌아가고 있는 환경이 문제가 될 수 있다. 즉 웹서버가 돌아가는 플랫폼이 어떤 환경인가에 따라서 ASP와 같은 스크립트 언어는 실행될 수 없는 경우가 있다. 반면 Servlet이나 JSP와 같이 JVM을 이용하는 언어로 작성되어져 있는 경우에는, 돌아가는 웹서버가 어떤 플랫폼인가에 무관하게 잘 동작한다는 이점을 갖게 된다. (돌아가는 플랫폼에서 동작하는 JVM이 있을 경우)