JVM 구조
- 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리함
- Source Code (.java) 파일을 Java Compiler를 통해서 Byte Code(.Class)파일로 변환 (컴퓨터가 이해할 수 있는 코드로 변환)
- Byte Code로 변환된 파일을 JVM의 Class Loader 로 보냄
- Class Loader는 말 그대로 Class 파일을 불러와서 메모리에 저장하는 역할
- Execution Engine 은 Class Loader에 저장된 Byte Code를 명령어 단위로 분류하여 하나씩 실행하게 하는 엔진
- Garbage Collector 는 사용하지 않거나 필요없는 객체들을 메모리에서 소멸시키는 역할
- Runtime Data Area (Memory Area) 는 JVM이 프로그램을 수행하기위해 운영체제로부터 할당받은 메모리 공간
자바 변수의 종류
변수 종류 | 선언 위치 | 설명 | 생성 시기 | 소멸 시기 | 저장 메모리 |
클래스 변수(Static variable) | 클래스 영역 | static 키워드가 붙고 여러 객체에서 공통으로 사용 할 때 사용 | 클래스가 메모리에 올라갈때 | 프로그램 종료 시 | Static |
인스턴스 변수(Instance variable) | 클래스 영역에서 static이 아닌 변수 | 인스턴스가 생성될 때 | 인스턴스 소멸시 | Heap | |
지역 변수(Local variable) | 메서드 영역 | 메서드 내부에서 선언된다. 초기 값을 지정해야 사용가능. |
블록 내에서 변수의 선언문이 실행 될 때 | 블록을 벗어날 때 | Stack |
- 클래스 변수, 인스턴스 변수: 전역변수(global variable), 멤버변수(member variable), 필드(filed)
메모리 영역 (Runtime Data Area)
- JVM의 메모리 공간(Runtime Data Area)은 세 가지 영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당
- Method(Static) 영역
- Stack 영역
- Heap 영역
Method(Static) 영역
- JVM이 동작해서 클래스가 로딩될 때 생성
- JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 상수(final), 생성자(constructor)와 메소드(method) 등을 저장하는 공간
- 어느곳에서나 접근 가능
- 데이터가 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있음
그래서 static 메모리에 있는 데이터들은 프로그램이 종료될 때까지 어디서든 사용이 가능
그러나 static 데이터를 무분별하게 많이 사용할 경우 메모리 부족 현상이 일어남
Stack 영역
- 메소드 내에서 정의하는 기본 자료형에 해당되는 지역변수의 데이터 값이 저장되는 공간
- primitive 타입의 데이터(int, double, byte, long, boolean 등) 에 해당되는 지역변수, 매개 변수 데이터 값이 저장
- 메소드가 호출 될 때 메모리에 할당되고 종료되면 메모리에서 사라짐
- 후입선출 LIFO(Last-In-First-Out)
- 스코프(Scope) 의 범위를 벗어나면 스택 메모리에서 사라짐
Heap 영역
- JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역
- 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장 되는 공간
- 단, Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 Stack에 적재
- Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지
- 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 되면, GC(가비지 컬렉터)에 의해 메모리에서 청소됨
- Stack은 스레드 갯수마다 각각 생성되지만, Heap은 몇개의 스레드가 존재하든 상관없이 단 하나의 Heap 영역만 존재
가비지 컬렉션
- 힙 영역에 저장된 객체들 중에서 더 이상 사용되지 않는 객체들을 찾아내어 메모리를 해제
- 메모리 누수를 방지하기 위해 필요
가비지 컬렉션의 동작 방식
공통 동작 방식
- Stop The World
- Mark and Sweep
Stop The World
- 가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업
- GC가 실행될 때는 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되고, GC가 완료되면 작업이 재개
- 모든 쓰레드들의 작업이 중단되면 애플리케이션이 멈춤
- GC의 성능 개선을 위해 튜닝을 한다고 하면 보통 stop-the-world의 시간을 줄이는 작업을 함
Mark and Sweep
- Mark: 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
- Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업
- Stop The World를 통해 모든 작업을 중단
- GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각이 어떤 객체를 참고하고 있는지를 탐색
- 사용되고 있는 메모리를 식별 (=Mark)
- 이후에 Mark가 되지 않은 객체들을 메모리에서 제거 (=Sweep)
'Java > Java' 카테고리의 다른 글
[Java(자바)] Java 21 - Virtual thread (0) | 2024.05.12 |
---|---|
[Java(자바)] 자바의 Thread(쓰레드) (0) | 2024.05.12 |
[Java(자바)] Java 접근제어자 (0) | 2024.05.12 |
[Java(자바)] 동일성 / 동등성 (0) | 2024.05.12 |
[Java(자바)] JPA에서 복잡한 쿼리 작성 (0) | 2024.05.12 |