코드 영역

실행할 프로그램의 코드가 저장되는 영역

텍스트 영역이라고도 함

CPU는 코드 영역에 저장된 명령어를 하나씩 처리

 

 

데이터 영역

전역 변수, 정적 변수 (static) 저장 영역

프로그램 시작과 동시에 할당

프로그램 종료 시 소멸

 

스택 영역

함수의 호출과 관련된 지역변수, 매개변수가 저장되는 영역

함수의 호출과 함께 할당

함추 호출이 완료되면 반환

메모리의 높은 주소에서 낮은 주소로 할당

 

힙 영역

사용자가 관리해야 하는 영역

사용자에 의해 메모리 공간이 동적으로 할당되는 공간

 

배열을 예로 들면, 

 

int a = 10;
int array[10];

위 코드는 동작하지 않는다

a 라는 변수의 값은 런타임에 초기화되는데, array 배열 변수는 컴파일 과정에서 선언되고 크기를 할당해야 하기 때문

 

int a = 10;
int array = new int[a];

 

 

위와 같이 런타임 단계에서 힙 영역에 array 객체를 동적으로 할당하여 사용

 

 

 

 

 

JVM 동작방식

 

 

1. Java 프로그램 실행 시, JVM 은 OS 로부터 메모리 할당

2. Java 컴파일러가 소스코드를 자바 바이트코드 (.class) 로 컴파일

3. Class Loader 를 통해 JVM Runtime Data Area 로 로딩

4. Runtime Data Area 에 로딩 된 .class 들은 Execution Engine 을 통해 해석

5. 해석된 바이트 코드는 Runtime Data Area 각 영역에 배치되어 수행

이 과정에서 Excution Engine 에 의해 GC 작동, 스레드 동기화 이루어짐

 

 

 

JVM 구조

클래스로더 (Class Loader)

 

자바는 동적으로 클래스 로딩

런타임에서 모든 코드가 JVM과 연결

동적으로 클래스를 로딩해 주는 역할이 바로 Class Loader 

.java 파일을 컴파일한 결과인 .class 파일을 묶어서 OS 로부터 할당된 메모리영역인 Runtime Data Are 로 적재

 

실행 엔진 (Execution Engine)

Method Area 의 바이트코드를 실행 엔진에 제공

정의된 내용되로 바이트코드 실행

이 때, 로드된 바이트코드를 실행하는 런타임 모듈이 실행엔진

 

실행엔진은 바이트코드를 명령어 단위로 읽어서 실행

 

 

가비지 콜렉터 (Garbage Collector)

 

사용되지 않는 메모리 자동 회수

힙 영역에 적재된 객체들 중 더이상 참조도지 않는 객체를 탐색하고 제거

GC 수행중인 스레드가 있으면, 해당 스레드를 제외한 다른 스레드는 잠시 멈춤

 

 

 

런타임 데이터 영역 (Runtime Data Area)

 

 

JVM 메모리의 영역

자바 애플리케이션 실행할 때 사용되는 데이터 적재 영역

 

 

- 모든 스레드가 공유하는 영역 >> GC 대상

힙, 메서드

 

 

- 스레드마다 하나씩 별개로 생성됨

스택, PC 레지스터, 네이티브 메서드 스택

 

 

메서드 영역 (Method Area)

클래스 멤버 변수, 데이터 타입, 접근제어자 같은 정보

메서드 정보

데이터 타입 정보

Constant Pool

정적 (Static) 변수

final class 

등이 생성되는 영역

 

 

힙 영역 (Heap Area)

new 키워드로 동적 생성되는 객체, 배열이 저장되는 영역

주기적으로 GC 의 메모리 회수 대상이 되는 영역

 

 

 

 

Young Generation

자바 객체가 생성되자마자 저장되고, 생긴지 얼마 안되는 객체가 저장되는 공간

힙에 객체 생성 시, 최초로 Eden 영역에 생성

>> 이 영역에 데이터가 누적되면 참조 정도에 따라 Servivor 의 공간으로 이동 (참조 없으면 회수)

 

Young Generation (Eden + Servivor) 영역이 가득 차게 되면 참조 정도에 따라 Tenured Generation (Old 영역)으로 이동/회수

>> GC 의 이 동작을 Minor GC 라고 부름

 

Old 영역 차면 Old 영역의 모든 객체를 검사하여 참조하지 않는 객체를 한꺼번에 삭제하는 GC 실행

>> 이 때 GC 스레드 제외한 다른 스레드 멈춤 (Stop-the_world)

Stop-the-world 이후 Old 영역의 메모리를 회수하는 GC 동작을 Major GC 라고 부름

 

 

스택 영역 (Stack Area)

지역변수, 파라메터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역

 

 

PC Register

스레드 생성 될 때 마다 생성되는 영역

현재 스레드가 실행되는 부분의 주소와 명령을 저장하는 영역 (프로그램 카운터)

 

네이티브 메서드 스택 (Native Method Stack)

자바 이외의 언어로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역 (일반적인 C스택)

보통 C, C++ 등의 코드 수행을 위한 스택을 의미

JNI 자바 컴파일러에 의해 변환된 자바 바이트코드를 읽고 해석하는 자바 인터프리터

 

 

 

'끄적 > ?' 카테고리의 다른 글

업캐스팅 다운캐스팅  (0) 2023.08.27
Generic  (0) 2023.08.27
Java ArrayList와 List 차이  (0) 2023.08.27
String, StringBuffer, StringBuilder  (0) 2023.08.27
추상클래스 인터페이스  (0) 2023.03.12

+ Recent posts