JVM 메모리 구조

-·2022년 3월 22일
0

Runtime Data Areas

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

이 부분에 대해서 자세히 알아보자

Method Areas

클래스, 변수, Method, static 변수, 상수 정보 등이 저장되는 영역이다.(모든 Thread가 공유한다.)

Heap Areanew

명령어로 생성된 인스턴스와 객체가 저장되는 구역이다.(Garbage Collection 이슈는 이 영역에서 일어나며, 모든 Thread가 공유한다, 동기화이슈)

Stack AreaJava Method

내에서 사용되는 값들(매개변수, 지역변수, 리턴값 등)이 저장되는 구역으로 메소드가 호출될 때 LIFO로 하나씩 생성되고, 메소드 실행이 완료되면 LIFO로 하나씩 지워진다.(각 Thread별로 하나씩 생성된다.)

PC Register

CPU의 Register와 역할이 비슷하다. 쓰레드가 시작될때 생성, Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록, 현재 실행 중인 JVM 명령의 주소값이 저장된다.(각 Thread별로 하나씩 생성된다.)

Native Method Stack

JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택이다.

자바 외 다른 언어(C/C++ 등)의 메소드 호출을 위해 할당되는 구역으로 언어에 맞게 Stack이 형성되는 구역이다.

GC(Garbage Collector)

C언어의 경우 malloc, free등을 이용해서 메모리를 할당하고, 일일이 그 메모리를 수거해줘야했다. 그러나 Java 에서는 메모리 관리를 jvm이 대신하기 때문에 GC가 이 역할을 해준다.

Young Generation

eden

heap에서 최초 할당하면 이 영역으로 가게된다.

suvivor
  1. eden이 꽉차면 참조여부를 따져 참조가 되어있으면 suvivor로 넘기고 참조가 끊어졌으면 eden에 남겨둠
  2. 이렇게 정리가 끝나면 eden을 다 비움

이 과정이 minorGC 이다

Old Generation

여기서는 새로 할당하는게 아니고 오랫동안 참조되고 앞으로도 계속 씌여질확률이 높은 object들이 여기에 있게된다.

  1. minorGC가 끝나면 suvivor에 있는 object들이 넘어옴
  2. 이 과정이 반복되다가 old도 꽉차면 GC가 발생

이 과정이 Full GC(MajorGC) 이다

Metaspace( java8 이후)

Perm부분이다. java8 이전에는 Permanent Generation 이었지만

java8 이후로 Metaspace로 변경되었다.

그러니까 Metaspace만 기억하도록 하자.

클래스 로더에 의해 로드되는 클래스, 메소드 등에 대한 메타 정보가 저장되는 영역(프로그램 코드가 올라가는 부분)으로 JVM에 의해 사용된다.

리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다.

Code가 모두 로딩되고 나면 거의 일정한 수치를 유지.

동적으로 사이즈를 바꿀 수 있다. MetaspaceSize 및 MaxMEtaspaceSize 옵션이 새로 생겼다.

Full GC(MajorGC) 대상이다.

Stop-the-world

GC를 실행하기 위해 JVM이 어플리케이션의 실행을 멈춘다, 이를 Stop-the-world라고 한다.

GC 튜닝이란, 이 Stop-the-world의 시간을 줄이는 것이다.

profile
거북이는 오늘도 걷는다

0개의 댓글