클래스 멤버 변수 이름, 데이터타입 등 필드 정보, 상수 Pool, static var, final class value
new 키워드/realloc() 로 생성된 객체와 배열이 생성. 메소드 영역에 로드된 클래스만 생성 가능, 가비지 컬랙터에 의해 제거될 수 있음. 사용자에 의해 메모리 공간이 동적으로 할당/해제되는 공간. 사용자가 관리 책임.
지역 변수, 파라미터, 리턴값 등이 저장된다.
쓰레드가 생성될 때마다 생긴다. 프로그램 카운터(PC)의 주소와 명령을 저장하고 있는 영역
자바 이외의 네이티브 코드(바로 컴파일되는 언어들)를 위한 메모리 영역
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)
Eden --full--> GC (survivor1 영역에 그대로 복사)
Eden --full again--> GC (참조되고 있는 객체만 survivor2에 복사)
old 영역에 있는 참조가 없는 객체들을 표시하고 그 해당 객체들을 모두 제거. 힙 영역에 듬성듬성 빈 메모리 공간이 생기는데 이를 제거하기 위해 재구성, 이 과정에서 메모리를 옮기는 중 혼란이 없도록 다른 모든 쓰레드가 정지하게 됨. (stop the world)