[JAVA] Java의 메모리 구조와 GC의 동작 방식

JVM의 동작 방식

자바 프로그램을 실행하면 OS로부터 JVM의 Runtime Data Area에 메모리가 할당된다.

이후 Class Loader에 의해 .class 파일이 동적으로 메모리에 올라가게 되고 Execution Engine에 의해 명령어 단위로 바이트 코드를 해석한다.

 

 

Java의 메모리 구조

Java의 메모리 구조는 크게 메서드, , 스택 세 가지 영역으로 나눌 수 있다.

이 중에서 메서드와 힙 영역프로세스 단위로 할당되어 스레드 간에 공유가 이루어지는 GC의 타겟 영역이다.

메서드 영역

  • 클래스 정보, 메서드 정보, 정적 변수, 상수를 저장한다. 
  • 실행 시점에 모두 알고있는 정보이기 때문에 실행 시점에 메모리에 바로 로드된다.

힙 

  • 객체와 배열을 저장한다.
  • 프로세스 실행 중에 동적으로 생성된다. 

스택

  • 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되며, 각각의 스레드 별로 가지는 영역이다.
  • 스레드 실행 중에 동적으로 생성된다

 

 

GC 동작 방식

힙 영역은 객체를 저장하는데 객체는 주로 일회성으로 사용되며 금방 참조가 사라진다.

하지만 참조가 사라지지 않고 아주 드물게 호출되는 경우도 존재하기 때문에 Young, Old 영역으로 나누어져있다.

perm 영역은 Java8부터 삭제되었다. 

 

 

Young Generation 영역

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

  • Heap 영역에 객체가 생성되면 최초로 eden 영역에 할당된 후 데이터가 쌓이게 되면 Servivor의 빈 공간으로 이동되거나 회수된다.
  • Survivor은 최소 1번 이상 GC에서 살아남은 객체가 저장되는 영역이다.
  • Young 영역에서의 GC를 Minor GC라고 한다.

Old Generation 영역

  • eden와 servivor 영역이 모두 차게되면 old 영역으로 이동되거나 회수된다.
  • old 영역이 GC가 덜 발생하기 때문에 young  영역보다 크다.
  • old 영역이 가득차게 되면 old 영역에 있는 모든 객체를 검사하여 참조가 있는 객체를 Mark 하고 Mark가 없는 객체를 메모리에서 제거하는데 이 과정을 Mark and Sweep이라고 한다.
  • 시간이 오래 걸리는 작업이고 이때 GC를 실행하는 스레드를 제외한 모든 스레드는 작업이 멈추게 된다.
  • 이것을 Stop-The-World라고 하며 old 영역의 메모리를 회수하는 GC를 Major GC라고 한다.

+ Young, old를 모두 제거하는 GC를 Full GC라고 한다.

 

'개발 > java' 카테고리의 다른 글

[JAVA] 자바란 무엇이고, 어떤 특징이 있는가?  (2) 2024.03.04