저번 포스팅에서는 JRE와 JDK, JVM을 간략하게 알아보았습니다.
이번에는 JVM을 자세히 알아봅시다!
Java 프로그램이 실행될 때, 컴퓨터가 이해할 수 있는 기계어로 변환해야 한다. 하지만 운영체제마다 기계어가 다르기 때문에, Java 개발자들은 윈도우, 리눅스 등 각 운영체제에 맞는 바이트 코드를 따로 만들어야 할 수 있다. 이를 해결해 주는 것이 바로 JVM(Java Virtual Machine)이다.
JVM을 운영체제에 맞게 설치만 하면, 바이트 코드를 각 운영체제에 맞는 기계어로 변환해 프로그램을 실행할 수 있게 해준다. 즉, Java 코드를 한 번만 작성해서 컴파일하면 여러 운영체제에서 실행이 가능해진다. 운영체제에 맞는 JVM만 있으면 Java 프로그램은 별도의 수정 없이 다양한 플랫폼에서 동작할 수 있다.
추가적으로 JVM 덕분에 Java 외의 다른 언어들도 사용할 수 있다. 예를 들어, Kotlin으로 작성된 파일도 컴파일하면 바이트 코드로 변환되고, JVM이 이를 기계어로 변환해 실행할 수 있게 해준다. 덕분에 Kotlin 역시 Java처럼 JVM을 통해 다양한 운영체제에서 실행될 수 있는 것이다.
JVM의 이러한 특성 덕분에 Java는 플랫폼 독립적인 언어로 자리 잡았으며, Kotlin 등 다른 언어와도 쉽게 호환이 가능하다.
JVM에는 Class Loader와 Runtime Data Area, Execution Engine이 있다.
Class Loader에서 바이트 코드들을 엮어서 Runtime Data Area에 로드, 링킹을 통해 배치한다.
클래스 파일의 로딩 순서는 다음과 같다.
Loading->Linking->Initialization
자바의 클래스들이 언제 어디서 메모리에 올라가고 클래스 멤버들이 초기화되는지, 원리를 알기 위해서는 클래스 로더의 진행 방식에 대해 알 필요가 있다.
특히 static 키워드가 붙고 안붙고의 유무에 따른 메모리 로드 차이와 쓰레드에 세이프하다는 등의 부분을 이해하기 위해서는 클래스 로더를 알 필요가 있다.
다음 블로그 포스팅 때 Class Loader에 대해 더 자세히 알아보겠습니다.