본문 바로가기
프로그래밍 언어

[Java] JVM의 구조와 메모리 영역

by 내기록 2022. 7. 28.
반응형

JVM(Java Virtual Machine)

: 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체이며, CPU나 운영체제(플랫폼)의 종류와 무관하게 실행이 가능하다.

즉, 운영체제 위에서 동작하는 프로세스로 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜주는 역할을 한다.

JVM는 크게 4가지(Class Loader, Execution Engine, Garbage Collector, Runtime Data Area)로 구분된다.

 

 

https://jeong-pro.tistory.com/148

 

1. Class Loader

자바에서 소스를 작성하면 .java파일이 생성되는데, .java 소스를 자바컴파일러가 컴파일하면 .class파일(바이트코드)이 생성된다.

이렇게 생성된 클래스파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리영역인 Runtime Data Area로 적재하는 역할을 Class Loader가 한다.
(자바 애플리케이션이 실행중일 때 이런 작업이 수행된다.)

 

2. Execution Engine

Class Loader에 의해 메모리에 적재된 클래스(바이트 코드)들을 기계어로 변경해 명령어 단위로 실행하는 역할을 한다.

[참고]
명령어를 하나 하나 실행하는 인터프리터(Interpreter)방식이 있고 JIT(Just-In-Time) 컴파일러를 이용하는 방식이 있다.
JIT 컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다.

 

3. Garbage Collector

Garbage Collector(GC)는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.

GC가 역할을 하는 시간은 정확히 언제인지를 알 수 없다.
(참조가 없어지자마자 해제되는 것을 보장하지 않음)

또 다른 특징은 GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 모든 쓰레드가 일시정지된다.

특히 Full GC가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어지는 치명적인 문제가 생길 수 있는 것이다. (GC와 관련된 내용은 아래 Heap영역 메모리를 설명할 때 더 자세히 알아본다.)

 

4. Runtime Data Area

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.

이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.

https://jeong-pro.tistory.com/148

 

*[참고] Java 8부터 Heap Area에 Permanent 영역이 제거되고 Metaspace 영역이 추가됐다.

  • Perm은 JVM에 의해 크기가 강제되던 영역이다.
  • Metaspace는 Native memory 영역으로, OS가 자동으로 크기를 조절한다.
    옵션으로 Metaspace의 크기를 줄일 수도 있다.
  • 그 결과 기존과 비교해 큰 메모리 영역을 사용할 수 있게 되었다.
    Perm 영역 크기로 인한 java.lang.OutOfMemoryError를 더 보기 힘들어진다.

출처 : https://johngrib.github.io/wiki/java8-why-permgen-removed/

 

1. Method area (메소드 영역)

Class Loader가 class 별로 분류해서 저장한다.

 

필드 정보(클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보)
메소드 정보 (메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보)
Type정보(Interface인지 class인지)
Constant Pool(상수 풀 : 문자 상수, 타입, 필드, 객체 참조 저장)
static 변수, final class 변수등이 생성되는 영역

2. Heap area (힙 영역)

new 키워드로 생성된 객체와 배열이 생성되는 영역이다.

메소드 영역에 로드된 클래스만 인스턴스 생성이 가능하고 Garbage Collector에 의해 관리된다.

3. Stack area (스택 영역)

지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역이다.
메소드를 호출할 때마다 개별적으로 스택이 생성된다.

 

[ex1]
int a = 10;
a : 정수값이 할당될 수 있는 메모리 공간
10 : 메모리 공간에 들어가는 값
즉, 스택 메모리에 이름이 a이고 값이 10인 메모리 공간을 만든다.
[ex2]
Person p = new Person();
Person p -> 스택 영역에 생성
new로 생성된 Person 클래스의 인스턴스 -> 힙 영역에 생성
그리고 스택영역에 생성된 p는 힙 영역의 주소값을 가지고 있다.
즉, 스택 영역에 생성된 p가 힙 영역에 생성된 객체를 가리키고(참조하고) 있는 것이다.

 

4. PC Register (PC 레지스터)

Thread가 생성될 때마다 생성되는 영역
Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. (*CPU의 레지스터와 다름)

이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 한다.

 

5. Native method stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
보통 C/C++등의 코드를 수행하기 위한 스택이다.

 

 

마무리

쓰레드가 생성되면 메소드 영역과 힙 영역은 모든 쓰레드가 공유하고,
스택 영역과 PC 레지스터, Native method stack은 각각의 쓰레드마다 생성되고 공유되지 않는다.

 

 

 

 

 

References
https://jeong-pro.tistory.com/148

 

JVM 구조와 자바 런타임 메모리 구조 (자바 애플리케이션이 실행될 때 JVM에서 일어나는 일, 과정

JVM(Java Virtual Machine) : 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체다. CPU나 운영체제(플랫폼)의 종류와 무관하게 실행이 가능하다. 즉, 운영체제 위에서 동작하는 프로세스로 자

jeong-pro.tistory.com

 

반응형

댓글