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 |
댓글