JVM(Java Virtual Machine) 내부 구조

 

JVM의 내부동작을 알고 있다면 본인이 만드는 애플리케이션의 성능을 더 높일 수 있으며 만들어진 애플리케이션의 성능을 최적화하기 위해서 JVM을 튜닝한다면 높은 성능을 끌어낼 수 있다. 그리고 자바 프로그래밍의 기법인 리플렉션(Reflection)과 클래스 로더(Class Loader)을 이해하는데 도움이 된다.

  • JVM의 내부구조는 큰 형태로 분리해보면 클래스로더 서브시스템(Class Loader Subsystem), 실행 데이터 영역(Runtime Data Area), Execution Engine 으로 나눌 수 있다.

 

JVM 내부구조

 

1. 클래스 파일

  • 클래스파일(Class file)은 개발자가 만들었거나 이미 만들어진 프로그램을 의미한다.
  • 우리가 개발할 자바 프로그램은 파일 확장자가 .java이며 이 파일이 자바 컴파일러에서 컴파일 과정을 거치면 .class파일이 생성 된다. 이렇게 생성된 클래스파일은 JVM에서 실행 가능하다.
  • 이 클래스파일이 서로 유기적으로 동작하면서 프로그램은 자기 기능을 수행하게 된다.

 

2. 클래스 로더 서브 시스템 (=클래스 로더)

  • JVM은 실행할 클래스 파일을 읽고, JVM 메모리에 올려놓는 과정이 필요한데 이 과정을 클래스 로딩(Class Loading)이라 한다. 그리고 이 작업을 JVM의 클래스 로더 서브 시스템이 담당한다. 클래스 로더 서브시스템을 줄여서 클래스 로더 라고도 부른다.
  • 클래스 로더는 다음과 같은 과정으로 JVM메모리에 클래스 파일을 로딩한다.
    • JVM에서 실행할 클래스 파일의 내부 구조를 분석한다. 즉, 어떤 메소드, 변수가 선언되어 있는지 각각의 성격은 어떤지 모두 분석한다.
    • 분석된 내용을 바탕으로 성격에 따라 JVM의 적합한 메모리 영역에 데이터를 올려 놓는다.
    • 분류된 데이터는 JVM의 특별한 메모리 영역에 저장되어 있다가 클래스가 실행되면 JVM의 실행영역의 힙 메모리로 복사된다. 그리고 시스템 리소스를 활용해서 클래스를 실행시킨다.
  • 클래스를 분석하는 과정에서 클래스 로더는 자바 언어의 기능 중 하나인 리플렉션 기법을 사용하여 컴파일된 클래스의 내부를 분석한다.

 

3. 실행 데이터 영역

  • 클래스로더 로 부터 분석된 데이터를 저장하고 실행 도중 필요한 데이터를 저장하는 영역을 실행 데이터 영역(Runtime data area) 이라 한다.
  • 메모리에 올라간 클래스, 객체, 변수 들이 저장되는 곳으로 크게 다섯 개 영역으로 구분되어 진다.
  • 이는 데이터의 목적과 종류에 따라서 메모리를 효율적으로 관리하기 위해서 구분하는 것이다.

 

4. 메소드 영역(Method Area)

  • 메소드영역은 클래스로더에 의해서 로딩된 클래스가 저장되는 곳이다.
  • 클래스는 메소드와 클래스 변수로 구성되어 있는데 이를 클래스의 메타정보라고 한다.
  • JVM에서 클래스를 실행하면 메소드 영역에서 클래스 정보를 복사하고 힙 영역에서 메모리를 할당하여 실행한다. 따라서 메소드 영역은 JVM메모리 영역 중 가장 먼저 데이터가 저장되는 영역이다.

 

9. Young Generation

  • Young영역은 Eden, Servivor1, Servivor2 영역으로 나눌 수 있다.
  • 이름에서 추측할 수 있듯이 얼마나 데이터를 오랫동안 저장하고 있어야 하는지에 따라 구분된다.
  • Young 영역 : 프로그램 내부에 어떤 코드가 실행되면서 새롭게 생긴 데이터가 저장되는 부분
  • Old 영역 : Young 영역 데이터가 계속 사용되면 Old 영역으로 이동한다.
  • Permanent 영역 : 클래스가 저장되는 곳이다.
  • Young영역에 저장된 데이터의 사용이 끝나고 일정 시간동안 사용되지 않으면 그 데이터는 지워진다. 이때 힙 영역의 데이터를 지우는 것은 JVM의 일부분인 가비지 컬렉터(=GC) 가 담당한다.

'📕 Programing > Java' 카테고리의 다른 글

[Java] 람다식(Lambda Expression) 실습  (0) 2020.07.28
[Java] CPU, Memory 사용량  (0) 2020.07.23
[Java] 스택(Stack)과 큐(Queue)  (0) 2020.05.22
배열의 선언  (0) 2020.05.13
[Java] 파일 읽기/쓰기  (0) 2019.11.28

댓글

Designed by JB FACTORY