Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

끄적끄적

[java]JVM의 구조 본문

CS 공부

[java]JVM의 구조

yenacathy97 2022. 3. 17. 01:27

JVM이란

- 자바 가상머신으로 운영체제 종류에 영향 받지 않고 독립적으로 자바를 동작하게 해주는 중계자.

 

JVM의 메모리 구조

- 총 4단계로, Garbage Collector, Execution Engine, Class Loader, Runtime Data Area가 있다.

자바 실행 시 동작 과정

먼저 자바 컴파일러에 의해 자바 소스(.java) 파일은 Byte code형태인 클래스 파일로 변환된다. 이 클래스 파일을 JVM이 읽어가면서 수행된다. 

 

1. Class Loader

- JVM 내로 class를 로드하고 Link 작업을 통해 배치 등 일련의 작업을 한다.

- 런타임 시 동적으로 클래스를 로드한다.

 

2. Execution Engine

- 클래스 로더를 통해 JVM Runtime Data Area에 배체된 바이트 코드들을 명령어 단위로 읽어서 실행한다.

- 두가지 방식이 존재한다. 

  • Interprenter : 바이트 코드들을 명령어 단위로 읽어서 실행
  • JIT(Just in Time): 바이트 코드 전체를 네이티브 코드로 변경하여 직접 수행. 한번 실행하면 캐시에 저장되어 빠르게 읽을 수 있지만 실행 시간 자체는 Interprenter에 비해 오래걸려 빈도를 체크후에 수행해야 한다.

 

 

3. Garbage Collector

- Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다.

- GC가 역할을 하는 시간은 언제인지 정확히 알 수 없다.

 

4.  Runtime Data Area

- JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용할 떄 데이터들을 적재하는 영역.

- Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.

(1) Method Area

- 모든 쓰레드가 공유하는 메모리 영역. 

- 코드에서 사용되는 클래스 파일을 클래스 로더로 읽어 클래스 별로 런타임 상수풀, 필드 데이터, 메서드 데이터, 메서드 코드, 생성자 코드 등을 분류해서 저장.

- 저장하는 데이터: 타입 정보 / 런타임 상수 풀/ 필드 정보/ 메서드 정보 / 클래스 변수(static 키워드로 선언한 변수)

  • 클래스 변수
    • static 키워드로 선언된 변수를 의미.
    • 모든 인스턴스에 공유. 클래스를 사용하기 전에 미리 메모리에 할당되어 있음.
    • final class 변수는 상수로 치환되어 상수풀에 복사.
    • static 변수는 이곳에 저장. static 클래스 형 변수는 레퍼런스 변수만 저장되고 실제 데이터는 Heap에 저장
  • 런타임 상수 풀
    • Type의 모든 상수 정보를 가지고 있음.
    • 인덱스 번호를 통해 접근
    • Object 접근 등 모든 참조를 위한 핵심 요소
  • 타입 정보
    • 타입의 이름, 하위 클래스 이름
    • 타입 클래스/ 인터페이스 여부
    • 타입의 modifier(public/abstract/final)
    • 연관된 인터페이스 이름 리스트
  • 필드 정보
    • 필드 타입
    • 필드 제어자
  • 메서드 정보
    • 메서드 이름, 리턴 타입, 파라미터
    • 메서드 제어자
    • 메서드 byteCode

(2) Runtime Constant Pool

- Method Area에 속하지만 독자적인 중요성을 갖는다.

- 클래스 파일 Constant_pool 테이블에 해당

- Type, Field, Method에 대한 모든 래퍼런스 저장

- JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리 상의 주소를 찾아 참조

 

(3) Heap Area

- 모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역

- 메서드 에리아에 로드된 클래스만 생성이 가능

- 가비지 컬렉터가 제거하는 영역  

 

(4) Stack Area

-  메서드 호출 시마다 각각의 (메서드만을 위한) 스택 프레임이 생성

- 메서드 안에서 사용되는 값들을 저장하고

- 호출된 메서드의 매개변수, 지역 변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장

- 메서드 수행이 끝나면 프레임 별로 삭제

 

(5) PC Register

- 쓰레드가 시작될 때 생성. 쓰레드마다 하나씩 존재

- 현재 수행중인 JVM 명령의 주소를 가짐

 

(6) Native Method Stack

- 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역

 

모든 쓰레드가 공유-> Method Area, Heap Area

쓰레드 별로 생성 -> Stack Area, PC Register, Native Method Stack

 

참조)

https://steady-coding.tistory.com/305

https://sgcomputer.tistory.com/64 

https://m.blog.naver.com/vanillasea81/220390087174

'CS 공부' 카테고리의 다른 글

thread와 런에이블  (0) 2022.03.20
[java] static  (0) 2022.03.18
[java] 배열 리스트의 동적 동작  (0) 2022.03.17
[java]String 생성과 메모리  (0) 2022.03.17
[java]final 키워드  (0) 2022.03.17
Comments