JVM 메모리 구조에 대해 아시나요??
자바를 학습하기 위해선 필수로 알아야하는 것이라고 생각해요!
JVM(Java Virtual Machine) 이란?
자바 가상 머신은 Java의 바이트 코드를 해석하고 실행하는 역할을 한다.
- OS(운영체제)에 상관없이 실행할 수 있음.
- java는 JVM 위에서 실행 됨.
- JVM이 설치된 모든 운영체제에서 java 파일을 실행할 수 있음.
: 자바는 플랫폼에 독립적이므로, 자바로 작성된 프로그램은 어떠한 운영체제에서도 실행시킬 수 있음.
JVM 실행 순서
1) .java 파일을 컴파일러(Compiler)를 통해 바이트 파일(.class)로 변환
2) .class 파일을 JVM의 클래스로더(ClassLoader)에게 전송
3) 클래스로더에서 JVM 런타임 영역으로 로딩(할당)하여 메모리(Java Runtime Data Area)에 올림
JVM 메모리 구조
① Class Loader
클래스 파일들(.class)을 엮어 JVM 내부의 메모리 영역인 Runtime Data Area로 적재하는 역할을 수행.
자바 어플리케이션이 실행 중 일 때 해당 작업 수행됨.
② Execution Engine
메모리에 적재된 클래스들을 기계어로 번역해, 명령어의 단위로 실행시켜주는 역할을 수행.
이때, JVM 내부에서는 인터프리터 방식과 JIT 컴파일러 방식 두가지 모두 사용. GC도 이 영역에 포함됨.
③ Garbage Collector(GC)
메모리 영역 중 Heap 영역에 존재하는 객체들 중에 참조되지 않아 unreachable(도달할 수 없는)한 상태에 빠진 객체들을 탐색 후 제거하는 역할을 수행. Execution Engine에 속해 있음.
④ Runtime Data Area
JVM의 메모리 영역으로 총 5가지로 나뉨.
- Static(Method) 영역
클래스 변수 / 메소드 정보 / static 변수(전역변수) 등 Class에 대한 바이트코드가 저장되는 영역.
*JVM이 어떤 메소드를 호출하기 위해서는 해당 메소드들에 대한 클래스 파일의 바이트코드가 반드시 Static(Method)영역에 적재되어 있어야 함. - Heap 영역
참조형 데이터 타입(new 키워드로 생성된 객체와 배열, Wrapper 타입)의 실제 데이터가 저장되는 영역.
GC의 대상이 되는 구역이 되어 주기적으로 사용하지 않는 메모리 해제가 일어남. - Stack 영역
기본 자료형(Primitive type) / local 변수(지역변수) / 매개변수 등 어떤 메소드를 실행 시켰을 때 사용되는 임시 값들이 생성되는 영역. 해당 함수 호출이 종료될 때 마다 stack에서 제거됨.
- Heap 영역의 참조값(주소값)을 가지고 있음
- 각 Thread마다 자신만의 Stack을 가짐(1:1=Thread : Stack), Thread는 다른 Thread에 접근할 수 없지만, Statc, Heap 영역을 공유하여 사용 가능. - Program Counter(PC) Register 영역
하나의 스레드가 실행되고 있는 부분, 실행중인 주소와 명령어 등을 저장하는 영역
*JVM은 멀티스레드의 환경이기 때문에 스레드간 전환이 일어날 때, 각 스레드의 상태를 저장해줄 필요가 있음. - Native Method stack 영역
자바 이외의 언어(C/C++ 등)로 작성된 코드가 실행되기 위해 필요한 스택 영역
- 각 Thread마다 생성됨.
JVM 메모리 생명주기
저장 요소 | 스레드 공유 여부 | 생성 시점 | 소멸 시점 | 가비지 컬렉터 대상 | |
Static(Method) 영역 | 메소드, 클래스 변수, Static 변수 | O | JVM 실행 시 | JVM 종료 시 | X |
Heap 영역 | 객체, 배열 정보 | O | 프로그램 실행 시 | 프로그램 종료 시 | O |
Stack 영역 | 매개변수, 지역변수, 리턴값, 임시값 | X (스레드 별로 생성) | 스레드 시작 시 | 스레드 실행 종료 시 | X |
PC 레지스터 영역 | 실행중인 명령어 주소 정보 | X (스레드 별로 생성) | 스레드 시작 시 | 스레드 실행 종료 시 | X |
Native Method stack | 네이티브 메서드 정보 | X (스레드 별로 생성) | 네이티브 메서드 호출 시 |
네이티브 메서드 실행 완료 시 |
X |
Java의 Call by Value
자바는 Call by Value 만 존재 (Call by Reference 라는 개념이 없다)
- Call by Value(값에 의한 호출)
:변수의 복사본이 전달되며, 원래 값이 수정되지 않는다. 실제 인수는 다른 메모리 위치에 생성 - Call by Reference(참조에 의한 호출)
: 변수 자체가 전달되며, 원래의 값이 수정된다. 실제 인수는 같은 메모리 위치에 생성
원시값이 복사되냐(Call by Value) vs 주소값이 복사되냐(Call by Reference)
2024.07.15 - [CS] - [Java] 자바 데이터 타입 & 변수 종류
[Java] 자바 데이터 타입 & 변수 종류
Java의 데이터 타입이랑 변수의 종류에 대해 적어볼게요!이게 정말정말 기초인데 은근히 잘 까먹는다니깐요~^^ 잘 기억해봐요!Java 데이터 타입원시 타입(Primitive Type): Numeric Type(byte, short, int, float,
yeonglee-developer.tistory.com
자바의 Call by Value
원시 타입(Primitive Type) 전달 방식
public class Main {
void main() {
int val = 10;
add(val);
System.out.println(val); // 10
}
void add(int num) {
num++;
System.out.println(num); // 11
}
}
자바에서 변수를 선언하면 기본적으로 Stack 메모리 영역에 할당
즉, Stack 영역 내부에 main()과 add()영역이 각각 나뉘어 있고, 서로 다른 변수가 존재
원시 타입의 전달은 "값을 복사하는 Call by Value 방식"으로 동작
참조 타입(Reference Type) 전달 방식
public class Main{
void main() {
int[] arr = {1, 2, 3};
add(arr);
System.out.println(Arrays.toString(arr)); // [10, 2, 3], 주소: 0x001
}
void add(int[] arrArg) {
arrArg[0] += 10;
System.out.println(Arrays.toString(arrArg)); // [10, 2, 3], 주소: 0x001
}
}
Q. 결국 주소값을 복사하므로 Call by Reference?
: 원래의 Call by Reference는 참조 자체를 넘기기 때문에 새로운 객체를 할당하면 원본 변수도 영향을 받음.
자바의 참조는 객체가 힙에 저장된 위치를 가리키는 메모리 주소. 가장 큰 핵심은 원본과 새로운 객체가 Stack 영역에서 각각 존재하는 변수라고 생각
public class Main{
void main() {
int[] arr = {1, 2, 3};
add(arr);
System.out.println(Arrays.toString(arr)); // [1, 2, 3], 주소: 0x001
}
void add(int[] arrArg) {
arrArg[0] = new int[] {10, 2, 3};
System.out.println(Arrays.toString(arrArg)); // [10, 2, 3], 주소: 0x002
}
}
매개변수로 전달받은 값을 새로운 객체로 변경해도 원본 변수는 변하지 않는다.
즉, 참조 타입의 전달 역시 "Call by Value 방식"으로 동작함을 보여준다.
=> 호출자 변수와 수신자 파라미터는 Stack 영역에서 각각 독립적으로 존재하는 다른 변수라는 것
참고 사이트
https://velog.io/@fastdodge7/Java-%EC%9E%90%EB%B0%94%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
https://velog.io/@kangyun9957/JVM-%EA%B4%80%EC%A0%90%EC%9D%98-%EC%8A%A4%EB%A0%88%EB%93%9C
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9E%90%EB%B0%94%EB%8A%94-Call-by-reference-%EA%B0%9C%EB%85%90%EC%9D%B4-%EC%97%86%EB%8B%A4-%E2%9D%93
https://adjh54.tistory.com/280
https://coding-zzang.tistory.com/44
https://dev-coco.tistory.com/189
'CS' 카테고리의 다른 글
[자료구조] B-Tree란 (1) | 2025.04.10 |
---|---|
[Java] String equals() 비교 (0) | 2025.02.19 |
[Java] HashMap, LinkedHashMap, TreeMap (0) | 2025.02.17 |
DAO, DTO, VO, Entity (0) | 2025.01.20 |
[Java] 자바 데이터 타입 & 변수 종류 (0) | 2024.07.15 |