JVM 구조와 동작 원리

|

image

JVM의 특징

자바의 특징은 “Write once, run everywhere (한 번 작성하면, 어디서든 실행된다)” 라고 할 수 있다. 다시 말해서 자바 어플리케이션은 어떤 OS에서도 동일하게 동작한다는 것이다.

다른 언어의 경우에는 OS에서 제공하는 라이브러리들을 가져와서 써야 하고 각 OS의 특성에 맞게 다시 개발해야 하지만, JVM을 사용하면 일종의 가상 서버에서 동작한다.

JVM의 내부 구조를 큰 형태로 분리하면, 클래스 로더 서브 시스템, 실행 데이터 영역, 실행 엔진으로 나눌 수 있다.

  1. 자바 파일은 컴파일을 거쳐 .class 파일로 변환된다.
  2. 클래스 로더 서브 시스템은 실행할 클래스 파일을 읽고, 리플렉션 기법을 사용하여 JVM 메모리에 올려놓는다.
  3. 클래스 로더로부터 분석된 데이터를 저장하고 실행 도중 필요한 데이터를 실행 데이터 영역에 저장한다.
  4. 메소드 영역에는 클래스 로더에 의해서 로딩된 클래스가 저장된다.
  5. 호출된 (실행된) 메소드 정보는 스택 영역에 저장된다.
  6. 객체는 클래스가 실행될 때 생성되서 힙 영역에 저장된다. 그 때 메소드 영역에서 클래스 정보를 복사하여 힙 영역에 실행할 클래스를 위한 메모리를 동적으로 할당한다.

힙 영역

힙 영역은 크게 young, old, permanent 영역으로 나누어진다.
그 중 young 영역은 다시 Eden, Servivor1, Servivor2 영역으로 나눌 수 있다.

가비지 컬렉터는 힙의 세부 영역에 따라서 다르게 동작한다. young 영역에 있는 가비지 컬렉터는 자주, 그리고 빠르게 수행된다.

old 영역은 young에서 old 영역으로 이동된 데이터이다. old 영역에서는 오랫동안 데이터가 보관되며 가비지 컬렉터의 속도가 느리다.

permanent 영역은 클래스들의 정보가 저장되는 영역이며 JVM에서 클래스 정보를 바탕으로 메모리 위에 객체를 빠르게 생성하기 위해 저장하는 곳이다. 이는 자주 사용되는 데이터를 더 오랜동안 보관하게 하여 STW(Stop the World)를 줄인다.