본문 바로가기
공부/프로그래밍

[JAVA] 객체 생명주기(LifeCycle)

by demonic_ 2018. 8. 3.
반응형

# 객체의 생명주기

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의 동작이 마무리 된 상태 입니다.



반응형

댓글