# 객체의 생명주기
1. Created (생성)
2. In use or reachable ( 사용중 )
3. Invisible ( 사용 중이며 접근불가 )
4. Unreachable ( 사용되지 않음 )
5. Collected ( GC 대상이 되는 상태)
6. Finalized ( Finalize 를 거친 상태 )
7. Deallocated (메모리 해제 된 상태 )
# 단계별 상태
1. Created
객체를 위한 메모리 공간을 Heap 에 할당합니다. 그 다음 Super class의 생성자 호출을 하면서 initializer 및 instance variable의 initialize 를 수행한 후에 객체의 생성자를 수행합니다.
2. In use or reachable ( 사용중 )
객체가 생성되어 다른 객체에 의해 참조되어 있는 상태입니다. 이 상태를 Strongly referenced 상태 라고 합니다.
3. Invisible ( 사용 중이며 접근불가 )
모든 객체가 이 상태를 거치는 것은 아닙니다.
Invisible 상태는 Strongly referenced 는 되어 있지만 직접 접근할 수 없는 상태이며 바로 GC의 대상이 되지 않는다는 점입니다.
public void run(){
Object foo = new Object();
foo.doSomething();
while( true ){
// do something.
}
}
위와 같이 실행했을 때, foo의 역할이 이미 종료되었어도 run() 이 리턴될떄까지 strong reference를 가집니다. 이 상태가 바로 invisible 상태인데, strong reference를 가졌지만 foo를 다시 접근할 수 없는 상태이며 while 문이 끝날 때까지 계속 메모리가 유지되는 것입니다.
그래서 memory leak 을 유발할 수 있기 때문에 명시적으로 null 을 맏늘어주는 것이 좋습니다. null이 되면 strong reference이 해지되면서 Unreachable 상태가 되기 때문입니다.
4. Unreachable ( 사용되지 않음 )
strong reference 가 존재하지 않을 경우이며 이 상태의 객체는 GC의 후보가 됩니다. 후보가 된다고 해서 바로 GC가 되는 것은 아니지만 GC 대상 큐에 들어갑니다. 명확히 설명하자면 이러한 객체들은 GC의 루트가 가지는 체인에 참조되는 형태이며 GC가 수행될 때 이 루트의 체인을 따라가며 메모리 해제를 합니다.
5. Collected ( GC 대상이 되는 상태)
메모리 해제단계 도입부입니다. 이 상태에서는 GC가 객체의 finlize() 가 정의되어 있는지 판단하게 되고 finlize 가 있다면 finalizer 라는 queue 에 넣고 없다면 바로 다음 단계인 finalized 상태로 전환 시킵니다.
6. Finalized ( Finalize 를 거친 상태 )
finalizer 를 통해 finalize가 실행된 후의 상태입니다. finalize는 Collected 상태라고 해서 바로 수행되는 것이 아니라 finalizer의 Queue에 들어가는 것이기 때문에 finalize가 호출되는 시간이 보장되지 않습니다. 또한 JVM에 따라 수행시간도 다릅니다. 그래서 finalize 가 구현되어 있다면 객체의 반환시간은 그만큼 더 늦어집니게 되고, finalize를 위한 객체의 메모리도 그만큼 증가하게 됩니다.
7. Deallocated (메모리 해제 된 상태 )
메모리 반환이 끝난 상태로 GC의 동작이 마무리 된 상태 입니다.
'공부 > 프로그래밍' 카테고리의 다른 글
[SpringSecurity] 인증 실패 시 핸들링 하는 법. (0) | 2018.08.09 |
---|---|
[SpringBoot2.x] Interceptor 안에 발생한 Exception, ControllerAdvice 로 관리하기. (0) | 2018.08.04 |
[React.js] 생명주기(LifeCycle) 정리 (0) | 2018.08.02 |
[알고리즘] 이진 검색(Binary Search) 이란? (0) | 2018.07.31 |
[React] Redux 사용하기전 알아야할 Flux 개념 (0) | 2018.07.28 |
댓글