상세 컨텐츠

본문 제목

[자바] JVM 구조

😎 지식/자바

by :부셔져버린개발자 2025. 3. 27. 19:53

본문

자바 메모리 구조 

https://inpa.tistory.com/entry/JAVA-%E2%98%95-JVM-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD-%EC%8B%AC%ED%99%94%ED%8E%B8

 

Java Compiler : JVM 이 해석할 수 있는 Java Byte Code로 변경한다

Java Byte Code : Java Compiler에 의해 수행될 결과물로 .class 파일이다

Class Loader : JVM 내로 .class 파일을 로드하여 Loading 된 클래스들을 Runtime Data Area 에 배치한다

Execution Engine : Loading 된 클래스의 Bytecode를 Interpret(해석) 한다

Runtime Data Area : JVM이라는 프로세스가 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간

 

자바에서 프로그램을 실행하는 것의 의미 

Java 파일을 컴파일러(javac) 바이트코드(.class)로 만들고,

이를 ClassLoader가 JVM내로 로딩한다.

로딩된 Class 파일들은 Exceute Engine을 통해 Interpret(해석)된다.

해석된 프로그램은 Runtime Data Area 에 배치되어 실질적인 수행이 이루어지게 된다.

 

클래스 멤버 변수 초기화 순서

1. static : 클래스가 로드 될 때 변수가 제일 먼저 초기화 된다.

2. field 

3. 생성자 : 객체가 생성될 때, JVM이 내부적으로 Locking (Thread-Safe 영역)


프로그램 카운터

- 현재 실행 중인 스레드의 바이트코드 줄 번호 

- 스레드 프라이빗 

 

멀티스레딩은 CPU 코어를 여러 스레드가 교대로 사용하는 방식으로 구현된다.

특정 시각에 각 코어는 한 스레드의 명령어만 실행하게 된다.

따라서, 스레드 전환 후 이전에 실행하다 멈춘 지점을 정확하게 복원하려면 스레드 각각에는 고유한 프로그램 카운터가 필요하다. 즉, 각 스레드의 카운터는 서로 영향을 주지 않는 독립된 영역인 스레드 프라이빗 메모리에 저장된다. 

 

스레드가 네이티브 메서드를 실행 중일 때 PC는 Undefined이다 

 

자바 가상머신 스택 

- 스레드 프라이빗

각 메서드가 호출될때마다 자바 가상 머신은 스택 프레임을 만들어 지역 변수 테이블, 피연산자 스택, 동적 링크, 메서드 반환값 등의 정보를 저장한다. 스택 프레임을 가상 머신 스택에 푸시하고 메서드가 끝나면 팝하는 일을 반복한다. 

 

지역 변수 테이블

자바 가상 머신이 컴파일 타임에 알 수 있는 기본 데이터 타입, 객체 참조, 반환 주소 타입 을 저장한다

이 데이터 타입들을 저장하는 공간을 지역 변수 슬롯이라 한다 

슬롯 하나의 크기는 32비트이다. 따라서, double 타입처럼 길이가 64비트인 데이터는 슬롯 두 개를 차지하며 나머지 타입은 모두 슬롯 하나에 저장된다. 지역 변수 테이블을 구성하는 데 필요한 데이터 공간(슬롯 개수)은 컴파일 과정에서 할당된다. 

 

네이티브 메서드 스택

네이티브 메서드를 실행할 때 사용한다 

 

자바 힙

- 모든 스레드가 공유

객체 할당 효율을 높이기 위해 스레드 로컬 할당 버퍼 여러 개로 나뉨

데이터가 자바 힙에 저장된다는 사실은 달라지지 않음 

- 가상 머신이 구동될 때 만들어짐

- 가비지 컬렉터가 메모리를 관리하는 공간 

 

메서드 영역

- 모든 스레드가 공유

- 타입 정보, 상수, 정적 변수, JIT 컴파일러가 컴파일한 코드 캐시

- 논힙 

 

런타임 상수 풀

- 메서드 영역의 일부 

- 상수 풀 테이블 : 클래스 버전, 피리드, 메서드, 인터페이스 등 클래스 파일에 포함된 설명 정보에 더해 컴파일타임에 생성된 다양한 리터럴과 심벌 참조가 저장됨 

- 동적 

런타임에도 메서드 영역의 런타임 상수 풀에 새로운 상수가 추가될 수 있음 String 클래스의 intern() 메서드 

 

다이렉트 메모리 

- 물리 메모리를 직접 할당 

- 물리 메모리, 스와프 파티션, 페이징 파일 과 프로세서가 다룰 수 있는 주소 공간을 넘을 수 없음 

사용되는 모든 메모리 영역의 합이 물리 메모리 한계를 넘어서면 OutOfMemoryError 발생 

 

728x90

관련글 더보기