[JAVA] JVM의 구조와 JAVA의 실행방식

JiKwang Jeong·2021년 11월 23일
0
post-custom-banner

JVM의 구조

  • JVM이란 자바 가상 머신의 약자로 JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행하는 것이다. 메모리 관리(GC)을 수행하며 스택기반의 가상머신이다.
  • JVM의 구조는 Class Loader, Execution engine, Runtime Data Area, JNI, Native Method Library로 이루어져 있다.
  • Class Loader: JVM내로 클래스를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
  • Execution engine: 바이트 코드를 실행시키는 역할
    - 인터프리터: 바이트 코드를 한 줄씩 실행한다.
    • JIT 컴파일러: 인터프리터 효율을 높이기 위한 컴파일러로 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러가 반복되는 코드를 네이티브 코드로 바꿔준다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.
    • GC(Garbage Collector): 가비지 컬렉터로 힙 영역에서 사용되지 않는 객체들을 제거하는 작업을 의미한다.
  • Runtime Data Areas: 프로그램 실행 중에 사용되는 다양한 영역이다.
    - PC Register: Thread가 시작될 때 생성되며 현재 수행 중인 JVM 명령의 주소를 갖고 있다.
    • Stack Area: 지역 변수, 파라미터 등이 생성되는 영역. 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장된다.
    • Heap Area: 동적으로 생성된 오브젝트와 배열이 저장되는 것으로 GC의 대상 영역이다.
    • Method Area: 클래스 멤버 변수, 메소드 정보, Type 정보, Constant Pool, static, final 변수 등이 생성된다. Constant Pool은 모든 Symbolic Reference를 포함하고 있다.
  • JNI(Java Native Interface): 자바 애플리케이션에서 C, C++, 어셈블리어로 작성된 함수를 사용할 수 있는 방법을 제공해준다. Native 키워드를 사용하여 메서드를 호출한다. 대표적인 메서드는 Thread의 currentThread()이다.
  • Native Method Library: C, C++로 작성된 라이브러리이다.

Java의 실행방식

  • 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변환시킨다.
  • Class Loader를 통해 class 파일들을 JVM으로 로딩한다.
  • 로딩된 class파일들은 Execution engine을 통해 해석된다.
  • 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실직적인 수행이 이루어진다.

Garbage Collector

  • Garbage Collector는 힙 영역에서 사용하지 않는 객체들을 제거하는 작업을 총칭한다. 이 객체를 제거하는 작업이 필요한 이유는 자바는 개발자가 메모리를 직접 해제해줄 수 없는 언어이기 때문이다. 따라서 객체를 사용하고 제거하는 기능일 필요하다.
  • GC의 동작방식은 가장 간단한 Serial GC 방식으로 설명한다.
  • GC는 Minor GC, Major GC로 구분할 수 있다. Minor GC는 young 영역에서, Major GC는 old 영역에서 일어난다고 정의한다. GC를 수행할 때는 GC를 수행하는 스레드 이외의 스레드는 모두 정지한다. 이를 Stop-the-world라고 한다.
  • Minor GC는 Eden 영역이 가득 참에서부터 시작된다. Eden 영역에서 참조가 남아있는 객체를 mark하고 survivor 영역으로 복사한다. 그리고 Eden 영역을 비운다. Survivor 영역도 가득차면 같은 방식으로 다른 Survivor 영역에 복사하고 비운다. 이를 반복하다보면 계속해서 살아남는 객체는 old 영역으로 이동하게 된다.
  • Major GC는 old 영역에서 일어난다. 위와 반대로 삭제되어야 하는 객체를 mark한다. 그리고 지운다. 메모리는 단편화된 상태이므로 이를 한 군데에 모아주는 것을 Compaction이라 하며 compact라고 한다. 그래서 Mark-Sweep-Compact 알고리즘이라고 한다.
  • 이것이 중요한 이유는 GC 수행시 시스템이 멈추기 때문에 의도치않은 장애의 원인이 될 수 있다. 따라서 이를 위해 힙 영역을 조성하는 것을 GC 튜닝이라고 하고 JVM 메모리는 절대 마음대로 조정해서는 안된다.
profile
기억보다 기록, 난리보다 정리
post-custom-banner

0개의 댓글