간단히 세 가지 영역만 구분해서 정리해보았다
메서드를 하나 호출할 시 statck 메모리 영역에 stack frame이 하나 생성되고, 메서드가 종료되면 해당 stack frame은 사라진다(LIFO 순서대로).
LIFO순으로 메모리가 쌓이기 때문에 stack에 새로 생성될 공간의 주소값은 이전 저장 공간의 주소값보다 작다.
ex)
| 0x996 |
| 0x1000 |
| 0x1004 |
Stack Frame의 구성요소
메서드가 무한히 호출되어 stack 메모리 영역의 데이터가 꽉차면 stack overflow가 뜬다.
Created
Heap 영역에 객체 저장 공간을 할당후 Super class의 생성자 호출을 통해 초기화를 수행.
In use or reachable(사용중)
생성된 인스턴스가 참조되고 있는 상태.
Invisible(사용중이나 접근불가)
향후 정리
Unreachable(미사용중)
인스턴스가 어디에서도 참조되고 있지 않을 때 Garbage Collecting의 후보가 된다. GC의 후보라고 해서 바로 수집되는 건 아니고, 일단 GC 대상 Queue에 등록된다.
Collected(GC 대상이 된 상태)
메모리 해제단계의 도입부. Garbage Collector가 객체의 finalize()가 정의되어 있는지 판단하고, finalize가 있다면 finalizer라는 queue에 넣고, 없다면 다음 단계인 finalized 상태로 전환 시킨다.
Finalized(Finalize를 거친 상태)
finalizer의 Queue에 있다가 finalizer에 의해 finalize가 실행된 후의 상태이다. finalize의 호출 시점은 정확히 알기 어렵고 JVM마다 수행시간도 다르다.
Deallocated(메모리가 해제된 상태)
GC의 작업이 마무리되어 메모리 반환이 끝난 상태.