JVM 메모리

HyeBin, Park·2022년 5월 23일
0
post-thumbnail

🔎 JVM

  • 자바 바이트코드를 실행할 수 있는 주체
  • 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트코드를 실행할 수 있도록 구현된다.
  • 운영체제와 플랫폼에 독립적으로 실행 가능하게 해준다.
  • 출처 : 위키백과

🐻 Class Loader

  • 자바에서 소스를 작성하면(.java) 자바 컴파일러가 컴파일을 하여 바이트 코드로(.class) 변환시킴
  • 클래스 파일들을 Runtime Data Area로 로드하고 배치하는 역할
    -> runtime에 작업을 수행함 !

💫 Execution Engine

  • 클래스 로더를 통해 JVM 내의 Runtime Dat Area에 배치된 바이트 코드를 명령어 단위로 읽어서 실행

- 인터프리터

  • 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행하여 개별 해석이 빠름
  • 전체적인 실행 속도는 느리다.
  • 초기 JVM 안에서 바이트 코드는 기본적으로 인터프리터 방식으로 동작

- JIT(Just-In-Time Compiler)

  • 인터프리터의 단점을 보완하기 위한 방식
  • 프로그램을 실제 실행하는 시점에 각 OS에 맞는 Native Code로 변환하여 실행 속도를 개선

❓ 그래서 어떤걸 쓰는데 ?

  • 바이트 코드를 Native Code로 변환하는데 비용이 소모되어 모든 코드를 JIT 방식을 사용하지 않고, 인터프리터 방식을 사용하다 일정 기준이 넘어가면 JIT 컴파일 방식으로 명령어를 실행한다.
  • 반복 수행이 발생하지 않으면 interpreter 방식이 빠름 !
    -> Loop 문에서 ByteCode를 반복 수행한다.

🛒 Garbage Collector(GC)

  • JVM의 자동화된 메모리 관리 기능
  • Application이 생성한 객체의 생존 여부를 판단해서 더 이상 사용되지 않는 객체를 해제함으로써 메모리 관리가 자동화 되도록함

🤖 Runtime Data Area

1. Method Area

  • 클래스의 필드 정보와 메소드 정보, Type 정보, Constant Pool, static 변수, final class 변수 등을 분류해서 저장
  • 클래스가 로딩될 때 생성
  • 모든 스레드에서 공유

🔎 Runtime Constant Pool

  • Method Area 영역에 포함되지만 독자적인 중요성이 있다.
  • 클래스, 인터페이스, 메소드, 필드에 대한 모든 레퍼런스를 저장
  • JVM은 이를 통해 해당 메소드나 필드의 실제 메모리상 주소를 찾아 참조한다.

2. HEAP

  • 인스턴스 또는 객체를 저장하는 공간
  • 런타임 시 동적으로 할당하여 사용하는 영역
  • GC의 대상으로 객체가 더이상 사용되지 않거나 명시적 NULL 선언시 GC !
  • 모든 스레드에서 공유

3. JVM Language Stacks

  • 스택 프레임이라는 구조체를 저장하는 스택
  • 연산 중 발생하는 임시 데이터 저장
  • 스레드가 시작될 때 생성되며 스레드마다 하나씩 존재

4. PC Resgisters

  • 현재 수행 중인 명령의 주소를 가진다.
  • 연산 견과 값을 메모리에 전달하기 전 저장하는 CPU 내의 기억 장치
  • 스레드가 시작될 때 생성되며 스레드마다 하나씩 존재

5. Native Method Stacks

  • JAVA 외의 언어로 작성된 네이티브 코드를 위한 스택
  • Java Native Interface를 통해 호출하는 C/C++ 등의 코드를 수행하기 위한 스택
  • 언어에 맞게 스택이 생성된다.

Reference

0개의 댓글