목차

JVM

JVM 이란 Java Virtual Machine 의 약자로, Java 바이트코드로 컴파일된 프로그램들을 실행할 수 있게 해주는 가상 머신이다. JVM 이 존재하는 이유는 Java 바이트코드로 컴파일된 다른 프로그램을 실행하기 위해서 이다. JVM 은 크게 두 가지 기능을 갖고 있다. 첫 번째는 Java 프로그램이 어느 운영체제에서든 실행될 수 있도록 하는 것이고, 두 번째는 프로그램 메모리를 관리하고 최적화하는 것이다.

JVM 의 구성요소

image
JVM의 구조 개요, JVM Specification Java SE 7 Edition, Wikipedia

Class loader

JVM 바이트 코드의 구성 단위 중 하나가 바로 클래스이다. 클래스 로더는 바로 이 클래스를 JVM의 메모리에 동적으로 로딩한다. 클래스 로더는 Java 바이트 코드 파일이나 해당 파일을 저장한 파일 시스템에 대한 정보를 담당한다.

Execution Engine

JVM의 중심이 되는 구성요소로, Interpreter, JIT Compiler, GC 등을 포함한다.

Interpreter & JIT Compiler

하드웨어 아키텍처에 맞는 자바 바이트코드 인터프레터가 필요하다. 컴퓨터는 이 인터프레터를 이용해서 자바바이트 코드를 실행한다. 인터프레터를 사용하여 프로그램을 실행하는 방식은 네이티브 기계어(native machine language)로 컴파일하여 실행하는 것보다 느릴 수 밖에 없다. 이를 보완하기 위해 JIT(Just In Time) 컴파일러가 사용된다. JIT 컴파일러는 프로그램이 실행되는 동안, 자바바이트 코드를 네이티브 기계어로 변환한다. 기계어로 변환된 부분은 인터프레터만을 사용하는 것보다 훨씬 빠르게 실행될 수 있다. 이 방식은 프로그램에서 빈번하게 사용되는 부분에 적용된다. 이러한 방식을 통해 JIT 컴파일러는 전체 성능을 향상시킨다.

Java & Java bytecode

프로그래밍 언어 Java로 작성된 프로그램은 위와 같은 과정을 거치지 않고 직접 기계어로 변환될 수 있으며, 다른 언어로 작성된 프로그램이 Java 바이트 코드로 컴파일될 수 있다. 즉, 반드시 Java 로 작성된 프로그램만 Java 바이트코드로 컴파일되는 것이 아니며, Java로 작성된 프로그램 또한 Java 바이트코드로 컴파일되지 않을 수 있다.

Garbage collection

JVM에서 메모리 관리를 담당한다. 더 이상 필요없는 메모리를 확인하고 제거하는 역할을 한다.


JVM의 힙

image
JVM Heap 메모리 구조(~ Java 7), Wikipedia

JVM의 메모리는 크게 두 가지 영역으로 구분된다. 힙 메모리와 그 외 메모리. 힙 메모리는 어플리케이션에서 생성된 오브젝트들이 저장되는 공간이다. 힙의 오브젝트들은 더 이상 참조되지 않아서 garbage collection으로 들어가기 전까지 힙에 존재한다.

Heap

힙은 크게 세 가지 영역으로 나뉜다.

1. Young Generation

새로운 오브젝트는 이 곳에 생성된다. Young Generation은 다시 세 가지 영역으로 나뉜다.

  • eden: 새로운 오브젝트가 생성되는 곳이다.
  • survivor space(s0, s1): 한 번의 gc 이후 살아남은 오브젝트들은 eden에서 s0, s1으로 번갈아 이동된다. 예를 들어, 첫 번째 GC에서 살아남은 오브젝트들이 s0로 이동한 뒤, 다음 GC 사이클에서 살아남은 오브젝트들은 s1으로 이동하는 방식, 이후 같은 과정이 반복된다.

2. Old Generation

Young Generation에서 오랫동안 살아남은 오브젝트들은 이곳으로 옮겨진다. major GC 이벤트가 발생할 때, Old Generation에서도 오브젝트가 제거될 수 있다.

3. Permanent Generation

클래스와 메서드 정의와 같은 메타데이터들이 저장되는 공간이다. 더 이상 사용되지 않는 클래스도 GC 이벤트가 발생할 때 제거될 수 있다. (Java 7까지만 존재. 자세한 내용은 이후 포스트에서 다룬다.)


참고자료