[Java] JVM의 구조

in #kr7 years ago

1. JVM (Java Virtual Machine)이란?


자바 가상 머신(Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다. 일반적으로 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트코드를 실행할 수 있도록 구현되나 자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다. (이론적으로는 100% 하드웨어 구현도 가능하나 비효율적이다)

자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.

JVM의 특징


  • 스택 기반의 가상 머신
  • 단일 상속 형태의 객체 지향 프로그래밍을 가상 머신 수준에서 구현
  • 포인터를 지원하되 C와 같이 주소 값을 임의로 조작이 가능한 포인터 연산이 불가능
  • 가비지 컬렉션 사용
  • 모든 기본 타입의 정의를 명확히 함으로써 플랫폼 독립성 보장
  • 데이터 흐름 분석(Data flow analysis)에 기반한 자바 바이트코드 검증기(Verifier)를 통해 스택 넘침, 명령어 피연산자의 타입 규칙 위반, 필드 접근 규칙 위반, 지역 변수의 초기화 전 사용 등 많은 문제를 실행 전에 검증하여 실행 시 안전을 보장하고 별도의 부담을 줄여줌
  • 명령어에서 스택에서 가져올 피연산자의 타입을 명령어에 지정(예: 정수 덧셈은 iadd, 단정도 실수 덧셈은 fadd)

2. JVM의 구조



  • Class Loader : JVM내로 class를 로드하고 Link를 통해 적절히 배치하는 일련의 작업을 수행하는 모듈.


  • Execution Engine : class loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드는 실행 엔진에 의해 실행, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행

  • Garbage Collector : JVM은 Garbage Collector를 통해 자동화된 메모리 관리 기능을 제공.

Garbage Collection을 수행하는 모듈 쓰레드. Application이 생성한 객체의 생존 여부를 판단해서 더 이상 사용되지 않는 객체를 해제함으로써 메모리 관리가 자동화 되도록 한다.

  • Runtime Data Areas : JVM이라는 프로그램이 운영체제 위에서 실행되면서 할당받는 메모리 영역. 런타임 데이터 영역은 6개의 영역으로 나뉜다.





3. 힙 영역 (Heap Area)의 구조



- New/Young Generation : Java 객체가 생성되자마자 저장되고, 생긴지 얼마 안되는 객체가 저장되는 공간, java 객체가 생성되면 이 영역에 저장되다가, 시간이 지남에 따라 우선순위가 낮아지면 Old영역으로 옮겨진다. 이 영역에서 사라질 때 Minor GC가 발생한다.


  • Old(Tenured) Generation : Young Generation 영역에서 저장되었던 객체 중에서 오래된 객체가 이동되어서 저장되는 영역, 이 영역에서 객체가 사라질 때 Major GC(Full GC)가 발생한다.

  • Permanent Generation : Class loader에 의해 load되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역으로 JVM에 의하여 사용된다. Reflection을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다. 내부적으로 Reflection 기능을 자주 사용하는 Spring Framework를 이용할 경우 이 영역에 대한 고려가 필요하다.




참고 :

  • 위키백과, "자바가상머신", 링크, (2017.09.08)
  • hipercube, "JVM과 메모리구조", 링크, (2017.09.08)