자바 런타임 메모리 구조와 가비지 컬랙터

๑⁰⊖⁰๑·2021년 6월 4일
0

1. JAVA Runtime Data area

  1. method area
  2. heap area
  3. stack area
  4. PC register
  5. native nethod stack

method 영역

클래스 멤버 변수 이름, 데이터타입 등 필드 정보, 상수 Pool, static var, final class value

heap 영역

new 키워드/realloc() 로 생성된 객체와 배열이 생성. 메소드 영역에 로드된 클래스만 생성 가능, 가비지 컬랙터에 의해 제거될 수 있음. 사용자에 의해 메모리 공간이 동적으로 할당/해제되는 공간. 사용자가 관리 책임.

stack 영역

지역 변수, 파라미터, 리턴값 등이 저장된다.

PC Register

쓰레드가 생성될 때마다 생긴다. 프로그램 카운터(PC)의 주소와 명령을 저장하고 있는 영역

native method stack

자바 이외의 네이티브 코드(바로 컴파일되는 언어들)를 위한 메모리 영역

2. 가비지 컬랙터

Java는 프로그램 코드에서 메모리를 명시적으로 지정하여 해제하지 않는다. 가끔 명시적으로 해제하려고 해당 객체를 null로 지정하거나 System.gc() 메서드를 호출하는 개발자가 있다. null로 지정하는 것은 큰 문제가 안 되지만, System.gc() 메서드를 호출하는 것은 시스템의 성능에 매우 큰 영향을 끼치므로 System.gc() 메서드는 절대로 사용하면 안 된다

스택으로 Reachable 하지 않은 오브젝트들이 가비지 컬렉션의 대상이다.
young / old 영역으로 나누고 데이터 흐름을 다음과 같이 정의한다.

효율적인 GC를 위해 다섯개의 영역으로 나눈다.
1. eden
2. survivor1
3. survivor2
4. old
5. permanent (Method Area)

Minor GC (new 영역)

Eden --full--> GC (survivor1 영역에 그대로 복사)
Eden --full again--> GC (참조되고 있는 객체만 survivor2에 복사)

  • 위의 과정중에 일정 횟수 이상으로 참조되는 객체들은 old 영역으로 이동시킨다. survivor2 꽉 차기 전까지 old로 비움
  • 일정 횟수 이상으로 참조되었다는것을 어떻게 알까?
    올드 영역에는 512바이트의 청크로 되어있는 카드 테이블이 존재해서 Old 영역의 객체가 young영역의 객체를 참조할 때마다 정보가 표시된다. YOUNG 영역의 GC를 실행할 때, 이 카드 테이블만 보고 GC 대상인지 식별한다.

Major GC (old 영역)

old 영역에 있는 참조가 없는 객체들을 표시하고 그 해당 객체들을 모두 제거. 힙 영역에 듬성듬성 빈 메모리 공간이 생기는데 이를 제거하기 위해 재구성, 이 과정에서 메모리를 옮기는 중 혼란이 없도록 다른 모든 쓰레드가 정지하게 됨. (stop the world)

profile
지독한 컨셉

0개의 댓글