자바

[JVM] 런타임 영역 알아보기 -(2)

2023. 5. 16. 18:32
목차
  1. 1. Method Area
  2. 2. Heap Area
  3. 3. PC Register
  4.  
  5. 4. JVM Stack
  6. 5. Native Method Stack
728x90

Runtime Data Area(런타임 영역) 은 JVM 이 런타임 환경에서 자바 프로그램을 수행할 때 OS 로부터 할당받는 메모리 영역이다.

이 메모리 영역은 논리적으로 5가지 영역으로 구분한다.

 

  • Method area
  • Heap
  • PC Register
  • Native Method Stack
  • JVM Stack

 

 

색깔을 구분한 이유는 해당 영역을 thread 간 공유하는 지의 여부를 나타내기 위함이다.

Method Area 와 Heap Area 는 모든 thread 가 공유하는 자원이고 PC Register, Native Method Stack, JVM Stack 은 Thread 별로 생성이 되어 운영된다.

 


 

1. Method Area

Method Area 는 JVM 벤더마다 다르게 구현되어 있다. 다만, 거의 모든 운영체제에서 쓰이는 벤더는 Hotspot 벤더이므로 이것을 기준으로 설명하겠다.

 

Hotspot JVM 벤더는 JDK 8 버전을 기준으로 메모리 영역에 변화가 생겼다.

크게는 기존 Perm 영역(Perm generation) 이 사라지고 Metaspace 영역이 등장하게 된 것인데 Method area 가 JVM 에서 어떤 역할을 하는지, JDK 8 버전이 되며 어떤 변화가 생겼는지 알아보자.

 

 

기존 Perm Gen 의 역할

Perm Gen 은 런타임 환경에서 Class Loader 를 통해 로드된 클래스와 메서드의 메타 데이터가 저장되는 영역이다.

전역변수나 static 변수 또한 이 영역에 저장되며 프로그램이 종료될 때까지 남아있게 되고, 해당 정보에 대한 요청이 오면 실제 물리 메모리 주소로 변환할 수 있게 해주는 영역이다.

 

이 영역에 저장되는 데이터를 좀 더 세부화하자면 다음과 같다.

 

1. Type Information

 - 클래스와 인터페이스 정보이다. 다음과 같은 분류에 따라 정보를 저장한다.

  • Type 명: Package name + Class name
  • Type 종류: Type 이 Class 인지 Interface 인지에 대한 정보
  • Type 의 제어자: 접근 제어자(public, private, default 등), 제어자(abstact, final)
  • 연관된 Interface 정보: 사용된 Interface 의 정보

 

2. Runtime Constant Pool

 - Type 의 상수 정보를 저장하는 Pool 이다. 각 상수로는 인덱스를 통해 접근이 가능하다.

    또한 method, field, type 으로 접근하기 위한 reference 정보가 저장되기 때문에 독자적인 중요성이 있다.

 

 

3. Field Information

 - 인스턴스 변수의 정보를 저장한다. 저장되는 변수 정보는 다음과 같다.

  • Type 명: 인스턴스 변수의 타입
  • 제어자: public, private, static, final ... 

 

4. Method Information

 - 메서드의 모든 정보를 저장한다.

  • method 명
  • method 반환 타입
  • method parameter 타입 정보 와 parameter 수에 대한 정보
  • 그 외 메서드 정보

5. Class Variable

 - static 키워드로 선언된 변수가 저장된다.

 

 

 

 

Perm Gen 의 한계

Perm Gen 은 논리적으로 Method Area 에 속해 보통 heap 취급을 하진 않지만, 사실 엄밀히 말해서 Perm Gen 은 Heap 영역에서 분리된 특수한 Heap 공간이다.

때문에 처음 JVM 에 의해 메모리가 할당이 될 때 영역의 크기가 제한적으로 할당을 할 수밖에 없어 런타임 환경에서 OutOfMemory 에러를 유발하고, GC 를 수시로 진행해야 해 메모리 누수가 발생하곤 했다.

이러한 문제들로 인해 JDK 버전이 8로 올라감에 따라 Perm Gen 이 제거되고 Metaspace 가 등장하게 된다.

 

 

Metaspace 의 등장

Metaspace 는 JDK 8 버전 이후 Perm Gen 을 대체하는 새로운 메모리 공간이다.

 

Perm Gen 과 비교해 가장 중요한 차이점은 메모리 할당을 처리하는 방법이 달라졌다는 것이다.

Metaspace 는 JVM 에 의해 메모리가 제한되지 않고, Native Memory 영역으로 전환되면서 OS에 의해 메모리 할당 공간이 자동으로 조절되어 이론상 아키텍쳐가 지원하는 메모리 크기까지 확장할 수 있게 되었다.

따라서 메모리 공간 확보에 대한 기능이 향상되면서 보다 유연하고 안정적인 메모리 사용을 제공할 수 있게 되었다.

또한, Method Area 이면서 애매하게 Heap 영역에 걸쳐져 있던 과거와 달리 명확하게 Heap 영역과 독립된 개념으로 존재할 수 있게 되었다.

 

다음으로 중요한 변경점은 string과 static object 의 저장 방법이다.

먼저, String 값 저장 방식의 변경은 다음과 같다.

JDK 7 버전 이하에서 문자열 리터럴 방식을 통해 생성하는 String 값은 Runtime Constant Pool 이라는 개념으로 Perm Gen 에 저장되었다. Runtime Constant Pool 은 리터럴 상수 값을 저장하는 공간으로서 String 뿐만 아니라 모든 종류의 숫자, 문자열, 식별자 이름 등등을 포함한다.

그러나 JDK 8 버전 이후 Runtime Constant Pool 에서 String 저장에 대한 개념인 String Contant pool 이 별도로 분리되어 Heap Area 에 저장되게 변경되어 GC 의 대상이 될 수 있도록 변경되었다.

 

static object 도 마찬가지로 비슷하게 변경되었다.

기존 Perm Gen 에서는 static object 가 Perm Gen 에 저장되어 GC 의 대상이 되지 않았지만,

JDK 8 이후 static object 는 Heap Area 에 저장되도록 변경되고 그 reference 만 Metaspace 에서 관리하게 함으로써 사용되지 않는 static object 는 GC 의 대상이 될 수 있게 변경되었다.

 

 

 


2. Heap Area

Heap Area 는 Object 클래스를 상속받는 모든 객체들(클래스 인스턴스) 과 해당 인스턴스의 변수들을 담는 공간이다.

이곳에서는 실제 데이터를 가진 인스턴스, 배열 뿐만 아니라  문자열에 대한 정보를 가진 String constant pool(JDK 8 이후로) 등이 저장된다.

 

이 영역은 JVM 당 하나만 생성이 되고, 해당 영역이 가진 데이터는 모든 JVM Stack 영역에서 참조되어 thread 간 공유되기 때문에 같은 애플리케이션을 사용하는 thread 사이에서 인스턴스를 공유하는 경우 동기화 문제가 수반될 수 있다.

또한 참조되지 않는 인스턴스와 배열에 대한 정보를 얻을 수 있기 때문에 GC 의 주 대상이 되는 영역이다.

 

Method Area 와 마찬가지로 Heap Area 또한 어떻게 나눠지고 동작하는 지는 JVM 벤더에 따라 달라지게 된다.

 

앞선 이유로 마찬가지로 Hotspot 모델을 기반으로 Heap Area 영역에 대해 살펴보자.

 

Hotpot JVM 의 Heap Area 구조

Hotspot JVM 은 크게 Yong Generation 과 Old Generation 으로 나뉘어져 있다.

 

Yong 영역은 Eden, Servior0, Servior1 이 포함된 영역으로 객체가 새로 생성되면 할당되는 영역이다.

대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 이 영역에서 생성되었다가 사라진다.

이 영역에서 발생하는 GC 를 Minor GC 라 부른다.

 

Old 영역은 Yong 영역에서 Reachable 상태를 유지하며 살아남은 객체가 복사되는 영역이다.

Yong 영역보다 크게 할당되며 이 영역에서 일어나는 GC 를 Major GC 라 부른다.

Yong 영역보다 크기가 큰 관계로 Major GC 는 Minor GC 보다 훨씬 오래 걸린다.

 

 

 


 

 

3. PC Register

JVM 에서 PC Register 는 쓰레드가 현재 실행중인 메서드의 명령을 담고 있는 JVM 명령어 주소를 저장한다.

다만, 경우에 따라서 undefined 상태가 될 수 있다.

 

명령어가 자바 메서드를 수행하고 있다면 JVM 명령어의 주소를 저장하지만, 만약 다른 언어의 메서드를 수행한다면 undefined 상태가 되고, 다른 언어의 메서드는 뒤에 설명할 Native Method Stack Area 에서 수행하게 된다.

 

 

 


 

4. JVM Stack

JVM Stack 은 메서드를 호출할 때마다 frame 이라는 단위의 정보를 push(추가)하고 메서드가 종료되면 해당 frame 을 pop(제거) 하는 동작을 수행한다.

 

이러한 특징으로 자바에서 변수는 선언된 블록 안에서만 유효하고, 블록을 벗어나면 스택에서 제거되어 알 수 없게 된다.

 

frame 은 다음 3가지로 구성된다.

 

  • Local Variable: 메서드의 지역 변수들을 갖는다.
  • Operand Stack: 메서드 내 계산을 위한 작업 공간이다. 바이트 코드 명령문들이 들어있는 공간이라고 할 수 있다.
  • Constant Pool Reference: Constant Pool 참조를 위한 공간이다.

 

 


5. Native Method Stack

프로그램을 실행하다 보면 경우에 따라서는 순수하게 Java 로 구성된 코드만을 사용할 수 없는 시스템의 자원이나 API 가 존재한다.

이러한 다른 프로그래밍 언어로 작성된 메서드들을 native method 라고 하는데, Native Method Stack 은 이러한 native method 들을 다루는 영역이다.

 

기본 동작 과정은 다음과 같다.

 

 

일반적인 메서드가 실행될 때 해당 frame 들이 JVM Stack 에 쌓이며 실행이 되다가 native method 를 만나면 해당 메서드를 Native Method Stack Area 에 쌓고 수행이 끝난 뒤 다시 JVM Stack 으로 돌아오게 된다.

이 때, native method 를 호출한 stack frame 으로 돌아가는 것이 아닌 새로운 stack frame 을 생성하여 다시 작업을 수행하게 된다.

 

 

또한 JVM 은 Native Method Stack 영역을 통해 JNI(Java Native Interface) 방식을 지원한다고 할 수 있다.

JNI(Java Native Interface): 다른 언어로 작성된 라이브러리들을 호출하거나 반대로 호출되는 것을 가능하게 하는 프로그래밍 프레임워크를 말한다.

 

 

 

저작자표시 (새창열림)

'자바' 카테고리의 다른 글

[JAVA] @Retention 어노테이션 알아보기  (0) 2024.03.25
[JAVA] Supplier Interface  (0) 2024.03.25
리플렉션(Reflection)  (0) 2023.07.11
[JVM] 실행 엔진 알아보기 - (3) / 인터프리터, JIT Compiler, GC  (0) 2023.05.17
[JVM] Class Loader 알아보기 - (1)  (0) 2023.05.16
  1. 1. Method Area
  2. 2. Heap Area
  3. 3. PC Register
  4.  
  5. 4. JVM Stack
  6. 5. Native Method Stack
'자바' 카테고리의 다른 글
  • [JAVA] Supplier Interface
  • 리플렉션(Reflection)
  • [JVM] 실행 엔진 알아보기 - (3) / 인터프리터, JIT Compiler, GC
  • [JVM] Class Loader 알아보기 - (1)
누누01
누누01
개발이 좋아
누누01
codeCom
누누01
전체
오늘
어제
  • 분류 전체보기 (60)
    • 자바 (6)
    • 스프링 (2)
    • 알고리즘 (0)
    • 자료구조 (0)
    • 백준 (44)
      • 재귀 (6)
      • 브루트포스 (11)
      • 정렬 (12)
      • 백트래킹 (8)
      • DFS&BFS (7)
      • DP (0)
    • leetcode (7)
    • Tool (1)
      • Intellij (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 알고리즘
  • Spring
  • 백트래킹
  • BFS
  • Majority Element
  • Rotate Array
  • Supplier Interface
  • dfs
  • 자료구조
  • 재귀
  • Merge Sorted Array
  • Java
  • jvm
  • 브루트포스
  • Leetcode
  • 정렬
  • 자바
  • BOJ
  • Remove Duplicated from Sorted Array
  • Spring Security

최근 댓글

최근 글

hELLO · Designed By 정상우.
누누01
[JVM] 런타임 영역 알아보기 -(2)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.