자바프로그램을 실행하기 위해 OS에서 할당받은 메모리 공간인 Java Virtual Machine이라 불리는
: 스레드가 생성될 때 마다 함께 생성되는 영역으로, 현재 스레드가 실행되는 부분의 주소와 명령을 저장하는 영역. 현재 수행중인 JVM 명령의 주소를 갖는다.
: 지역변수, 파라미터 등에 사용되는 임시 값 등이 생성된다. 메소드를 호출할 때마다 개별적으로 스택이 생성된다.
: 프로그램 실행 과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다.메소드 호출 시마다 그 메서드만을 위한 "스택 프레임"이 각각 생성되고, 메소드가 끝나면 "스택 프레임"을 삭제한다.
예1) "int a = 10" 이라는 소스코드는 정수(int)가 할당될 수 있는 메모리 공간을 "a"라고 잡아두고, 그 메모리 공간 영역에 값으로 10을 넣는다.
예2) "Class class = new Class()"라는 소스코드는 "Class class"는 스택영역에 생성되고, new로 생성된 Class의 인스턴스는 힙 영역에 생성된다.
: C/C++등의 자바 외의 언어로 작성된 네이티브 코드를 수행하기 위한 메모리 공간이다.
: 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역이다.
: new키워드로 생성된 객체와 배열이 생성되는 영역으로, [new/young], [old], 그리고 [퍼머넌트] 영역으로 구성되어있다.
: 메소드(클래스) 영역에 저장된 클래스들만 힙 영역에 객체로 생성할 수 있다.
: 퍼머넌트 제너레이션 - 생성된 객체의 주소값이 저장된 공간으로, 클래스/메소드에 대한 메타 정보가 저장된다.
: 리플렉션을 사용해 클래스를 동적으로 로딩하는 경우에 사용된다.
: new 제너레이션 - 에덴 : 객체들이 최초로 생성되는 공간 / 서바이버0, 1 : 에덴에서 참조되는 객체들이 저장되는 공간
: old 제너레이션 - 마이너 GC가 한번 발생 후 살아남은 객체는 서바이버 영역으로 이동되는데, 이 과정을 반복하다 계속 살아남는 객체는 Old 영역으로 이동된다.
GC(가비지 컬렉션)
- Minor GC : New 영역에서 일어나는 GC
- 최초에 객체가 생성되면 Eden영역에 생성된다.
- Eden영역에 객체가 가득차게 되면 첫 번째 CG가 일어난다.
- survivor1 영역에 Eden영역의 메모리를 그대로 복사된다. 그리고 survivor1 영역을 제외한 다른 영역의 객체를 제거한다.
- Eden영역도 가득차고 survivor1영역도 가득차게된다면, Eden영역에 생성된 객체와 survivor1영역에 생성된 객체 중에 참조되고 있는 객체가 있는지 검사한다.
- 참조 되고있지 않은 객체는 내버려두고 참조되고 있는 객체만 survivor2영역에 복사한다.
- survivor2영역을 제외한 다른 영역의 객체들을 제거한다.
- 위의 과정중에 일정 횟수이상 참조되고 있는 객체들을 survivor2에서 Old영역으로 이동시킨다.
- 위 과정을 계속 반복, survivor2영역까지 꽉차기 전에 계속해서 Old로 비움
- Major GC(Full GC) : Old/Perm 영역에서 일어나는 GC
- Old 영역에 있는 모든 객체들을 검사하며 참조되고 있는지 확인한다.
- 참조되지 않은 객체들을 모아 한 번에 제거한다.
- Minor GC보다 시간이 훨씬 많이 걸리고 실행중에 GC를 제외한 모든 쓰레드가 중지한다.
- Major GC(Full GC)가 일어나면,
Old영역에 있는 참조가 없는 객체들을 표시하고 그 해당 객체들을 모두 제거하게 된다.
그러면서 Heap 메모리 영역에 중간중간 구멍(제거되고 빈 메모리 공간)이 생기는데 이 부분을 없애기 위해 재구성을 하게 된다. (디스크 조각모음처럼 조각난 메모리를 정리함)
따라서 메모리를 옮기고 있는데 다른 쓰레드가 메모리를 사용해버리면 안되기 때문에 모든 쓰레드가 정지하게 되는 것이다.- 참조되고있는 객체란?
참조사슬 중 루트 셋 오브 레퍼런스(최초에 참조)
- JVM 스택(자바스택) 메소드 실행 시에 사용하는 지역변수와 파라미터에 의한 참조
- 네이티브 메소드 스택에 의해 생성된 객체에 의한 참조
- 메소드 영역의 정적(static) 변수에 의한 참조
: 클래스 멤버 변수의 이름, 데이터 타입, 리턴 타입, static 변수, final class 변수 등이 생성되는 영역
: 클래스 정보를 처음 메모리공간에 올릴 때, "초기화 되는 대상을 저장하기 위한" 메모리 공간.
: Runtime Constant Pool 이라는 별도의 관리 영역이 존재하여 상수 자료형을 저장해서 참조하고, 중복을 막는 역할을 한다.
: 클래스에 대한 정보를 저장하는 영역으로, "필드 정보 : 멤버변수명, 데이터타입, 접근제어자 정보", "메소드 정보 : 메소드명, 리턴타입, 매개변수, 접근제어자", "타입 정보 : 클래스인지, 인터페이스인지, 슈퍼클래스의 전체 이름 등" 정보를 저장한다.
메소드 영역이 클래스에 관한 정보를 위한 공간이라면,
힙 영역은 객체를 위한 공간이다.
두 영역 모두 GC(가비지 콜렉션) 대상 영역이다.