본문 바로가기
Dev/JAVA

JVM에 관하여

by ulmu 2024. 11. 27.

JDK(Java Development Kit)

- 자바 어플리케이션 개발을 위한 도구 제공

- 자바 컴파일러(javac, 자바 언어 > 바이트 코드), 자바 클래스 파일 해석해주는 역어셈블리어(javap)

 

JRE(Java Runtime Environment)

- 자바 실행환경

- JVM, 자바 클래스 라이브러리, 기타 자바 어플리케이션 실행에 필요한 파일

 

JVM(Java Virtual Machine)

- 자바 가상머신

- 실제 컴퓨터로부터 Java 어플리케이션 실행을 위한 메모리 할당 받아서 Runtime Data Area 구성

- 인터프리터와 JIT 컴파일러를 통해 바이트 코드 > (OS 별) 기계어

- 가비지 콜레터를 통해 어플리케이션 동적 메모리 관리

 

 

JVM 구조 - Runtime Data Area

- 모든 스레드 공유 영역(Heap, Method 영역)

- 스레드 별 할당되는 영역(PC Register, Stack Native Method Stack 생성) -> 스레드 종료시 사라짐

- 모든 스레드 실행되고 종료되면, JVM이 종료되면서 Heap영역과 Method 영역도 사라짐

 

 

PC Register

- CPU가 다음에 실행할 명령어의 메모리 주소를 가리키는 레지스터

- CPU의 물리적인 PC Register(x), JVM이 관리하는 가상적인 PC Register(o)

- JAVA 코드는 CPU관점에서 명령어, 각 객체/코드는 메모리 공간에 할당

- 레지스터 : CPU 내부에 위치한 소량의 고속 메모리(데이터의 임시 저장소, CPU가 작업 처리 시 가장 빠르게 접근하는 기억장치)

 

 

Stack

 - Frame 이라는 자료 구조를 저장

 - 지역 변수, 함수의 실행 결과 저장

 - 함수 호출과 반환을 담당

 - 스택 프레임의 주요 구성 : 매개변수, 로컬 변수, 리턴주소, 동적 링크, 중간 결과

    - 리턴 주소 : 함수 실행 후 다시 돌아갈 호출자의 명령어 주소

    - 동적 링크 : 호출자의 스택 프레임을 참조하는 포인터(호출자의 컨텍스트 정보)

    - 중간 결과 : 연산 과정에서 필요한 임시 저장값(중간 계산 값 등)

 

 

Stack의 Push와 Pop

- Push: 데이터를 스택 자료구조의 가장 위(top)에 추가하는 작업
- Pop: 데이터를 스택의 가장 위(top)에서 제거하는 작업

- (메서드) 실행 순서를 보장하고자, LIFO 형태로 

 

[프레임 C]

[프레임 B]

[프레임 A] (main 함수 등)

 

 

Stack Frame 동작 과정

   1) 메서드 호출 > 새로운 스택 프레임 생성 > 함수 실행에 필요한 데이터 저장 > 스택 메모리에 Push

   2) 내부 연산 > 로컬 변수, 매개변수, 임시 값 등 스택 프레임에 저장

        +) 함수 실행 중 다른 함수 호출 > 새로운 스택 프레임 > 상위에 Push 

   3) 함수 실행 마치고 반환(return) > 스택에서 해당 스택 프레임 제거 > 리턴 주소를 통해 호출자로 돌아감

   

 

Heap

- Java 객체가 Heap 메모리에 생성 / 해당 주소를 참조 변수에 저장

- 힙 메모리에 할당된 주소는 JVM 내부에서 관리

- 프로그램에서는 주소대신 참조 변수로 객체 접근

- 힙 메모리에 할당된 주소란? 

   ex) 힙 메모리가 0x1000에서 시작한다고 가정

         객체가 첫 번째 공간에 저장된다면 그 주소는 0x1000
         두 번째 객체가 생성되면, 첫 번째 객체의 크기만큼 떨어진 위치 (0x1000 + 크기)에 할당

 

+) 컴퓨터 메모리에 관하여

 컴퓨터 메모리는 연속된 주소 공간 (0x1000, 0x1001, 0x1002, ..., 0x2000)

 기준점 : 메모리 공간의 시작점 주소

 오프셋(offset): 기준점에서부터 얼마나 떨어져있는지 나타내는 거리

 

 

 

Method

 - 클래스, 메서드, 상수가 저장됨

 - 각 메서드는 메모리에 로드, 바이트코드 명령어 실행시 JVM이 추적하여 실행

 

 

객체 메모리의 재사용

  • 힙 메모리에서 사용되지 않는 객체는 Garbage Collector (GC)에 의해 정리
  • 메모리가 정리된 영역은 다시 다른 객체가 생성될 때 사용

 

'Dev > JAVA' 카테고리의 다른 글

JAVA를 잡아(3) : 출력과 입력 기초  (0) 2023.05.28
JAVA를 잡아(2) : 변수와 타입 기초  (0) 2023.05.23

댓글