백엔드 기술/Java
JVM (Java Virtual Machine) ?
DvdHan
2023. 4. 8. 16:25
JVM (Java Virtual Machine)
1. 자바 프로그램이 어떠한 운영체제 상에서도 실행될 수 있도록 하는 도구.
2. Java 프로그램 런타임시 메모리를 관리하고 최적화 하는 것.
[JVM 구성 요소]
#Compiler (컴파일러/ javac)
자바 소스 코드(.java 파일)를 JVM이 이해할 수 있는 바이트코드(.class) 파일로 변환하는 역할.
#Class Loader (클래스 로더)
.java 파일이 컴파일러를 통해 바이트코드(.class)로 변환되면
이 파일들을 메모리가 할당된 Runtime Data Area로 적재하는 역할.
[로딩-링크-초기화] 순서로 진행된다.
A. 로딩
클래스 로더가 바이트코드(.class) 파일을 읽고, 적절한 바이너리 데이터를 만들어 메서드 영역에 저장
B. 링크
컴파일러의 결과물인 바이트코드(.class)를 실행가능한 실행파일(.exe)로 만들기 위해 연결해주는 작업
C. 초기화
static 변수의 값을 할당, 즉 변수에 값이 저장될 때 . static의 블럭이 실행되는 시점.
#Execution Engine(실행 엔진)
클래스 로더에 의해 메모리에 배치된 .class 파일들을
컴퓨터가 이해할 수 있는 기계어로 변경해 명령어 단위로 실행하는 역할.
-기계어로 변경하는 방식-
Interpreter (인터프리터 방식) : 명령어를 한줄씩 번역하여 실행,
JIT (컴파일러 방식) : 바이트코드를 네이티브 코드로 변환
-JVM 메모리 관리 프로세스-
Garbage Collection (가비지 컬렉션) - a.k.a Heap 메모리 관리자 -
자바 프로그램에서 사용되지 않는 Heap 메모리 속 객체들을 지속적으로 관리 및 제거하는 역할
[순서]
참조되지 않은 객체들을 탐색 후 삭제 -> 삭제된 객체의 메모리 반환 -> 힙 메모리 재사용
#Runtime Data Areas (JVM 메모리 영역)
총 5가지 영역으로 나누어짐.
1. 메서드 영역 (Method Area / Static Area)
JVM이 시작될 때 생성되고, 모든 스레드가 공유하는 영역.
JVM이 읽은 코드 중 사용되는 바이트코드(.class)들을 클래스 로더로 읽어
클래스 별로 정적필드(static field), 상수, 메서드 코드, 생성자 코드 등을 저장.
JVM이 동작하고 클래스가 로딩될 때 생성되어 JVM이 종료될 때 까지 유지된다.
2. 힙 영역 (Heap Area)
런타임에 동적으로 할당되는 데이터가 저장되는 영역, 객체(new)나 배열 생성이 해당.
힙 영역은 가비지컬렉터의 관리 대상이 되어 삭제되기도 한다.
** JVM 성능 이슈에서 가장 많이 언급되는 공간.
여기서 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
Ex)
(A)Instance (B)instance = new (C)Instance();