1. 자바 프로그램은 JVM 위에서 동작하는데, 우리가 자바 클래스를 컴파일하면 바이트코드로 변환이 되고 .class 파일로 디스크에 저장합니다.
2. 그러고 난 다음 디스크에서 class 파일을 찾아서 클래스 로더는 그것들을 메모리에 적재합니다.
3. 그리고 자바는 static memver들 예를 들어 static method, static field, static block들을 찾습니다.
4. 스태틱 필드나 메소드에 접근할 때 클래스들을 초기화 하는데 예를 들어 클래스에서 메인 메서드를 실행하면 메인 메서드가 정적이기 때문에 클래스가 초기화됩니다. 클래스의 객체나 인스턴스들이 new keyword를 통해 생성될 때도 클래스가 초기화됩니다.
5. 그런 다음 자바는 메모리를 할당하고 객체 참조 변수에 대해서는 스택에 메모리를 할당합니다.
6. 메모리를 할당한 후에 JVM은 클래스의 생성자를 호출합니다.
7. 필드 및 메소드 액세스가 완료되면 JVM에 의해 메모리에서 객체와 참조가 제거됩니다.
1. Created 단계로 객체 생성을 뜻합니다. 객체가 생성되면 사용할 준비가 되고 JVM의 메모리 힙에 저장됩니다.
2.두번째는 In Use 단계로 객체가 생성되어 다른 객체에 의해 참조되어 있는 상태입니다. 위 코드에서 Dog 객체는 사용 중에 있다고 볼 수 있습니다. 이렇게 사용중인 객체는 GC 대상에서 제외됩니다. Created 상태와 In Use 상태의 차이점은 객체가 생성 될 때 사용 중이거나 사용 중이 지 않을 수 있다는 것입니다. 객체를 생성하고 Reference가 없으면 In Use 상태로 볼 수 없습니다.이 경우에는 Unrechable 상태로 간주합니다.
3. 세번째 단계는 Invisible 단계로 모든 객체가 이 상태를 거치는 것은 아닙니다. Invisible 상태는 Strongly referenced 는 되어 있지만 직접 접근할 수 없는 상태이며 바로 GC의 대상이 되지 않는다는 점입니다. foo의 역할이 이미 종료되었어도 run() 이 리턴될떄까지 strong reference를 가집니다. 이 상태가 바로 invisible 상태인데, strong reference를 가졌지만 foo를 다시 접근할 수 없는 상태이며 while 문이 끝날 때까지 계속 메모리가 유지되는 것입니다. 그래서 memory leak 을 유발할 수 있기 때문에 명시적으로 null 을 만들어 주는 것이 좋습니다. null이 되면 strong reference이 해지되면서 Unreachable 상태가 되기 때문입니다.
4. 네번째 단계인 Unreachable은 Strong Reference가 해제되어 GC의 후보가 된 상태를 말합니다. 후보가 된다고 해서 바로 GC가 되는 것은 아니지만 GC 대상 <큐>에 들어갑니다.
5. 다섯번째 단계인 Collected 단계는 메모리 해제 단계의 도입 부분으로 Unreachable Object로 인식된 다음의 상태인데 할당된 메모리가 해제되기 직전의 상태로 보면 됩니다. 이 상태에서는 GC가 객체의 finlize() 가 정의되어 있는지 판단하게 되고 finlize 메소드가 있다면 finalizer 라는 queue 에 넣고, 없으면 바로 다음 단계인 finalized 상태로 전환 시킵니다.
6. 여섯번째 단계인 Finallized 단계는 finalizer 를 통해 finalize가 실행된 후의 상태입니다. finalize는 Collected 상태라고 해서 바로 수행되는 것이 아니라 finalizer의 Queue에 들어가는 것이기 때문에 finalize가 호출되는 시간이 보장되지 않습니다. Finalizer는 데몬 스레드로써 객체가 메모리에서 제거하기 전에 사용하는 리소스를 해제하는 역할을 수행합니다.
7,. 마지막 단계인 Deallocated는 메모리 반환이 끝난 상태로 GC 동작이 마무리 된 상태라고 볼 수 있습니다.
1.Garbage collector는 reference root set으로 부터 참조를 통해 도달 가능한 객체들을 제외하고는 모두 garbage로 간주한다. 즉 garbage collector의 관점에서는 참조할 수 있는 객체(reachable)와 참조할 수 없는 객체(not reachable)로 나뉘게 된다. Reference object들을 이용하면 reachable한 객체에 대해서 참조에 대한 강약을 조절할 수 있다.
2.Root set으로 부터 시작한 참조 사슬에 속한 객체들은 reachable객체이고 이 참조 사슬과 무관한 객체들이 unreachable 로 GC 대상이 됨
3.참조가 계속 남아있는 경우가 있을 수 있고 이런 경우에 객체는 수거되지 않고 memory leak으로 이어질 수 있다. 이와 같이 참조를 부주의하게 사용하여 발생할 수 있는 memory leak현상을 막기 위해서는 객체에 대한 참조를 유연하게 다루어 필요하지 않은 객체들이 수거될 수 있도록 해야한다.
'자바' 카테고리의 다른 글
매일 써도 잘 몰랐던 Java Map에 관한 스터디 (rehashing, 해싱, hashmap, loadfactor, doubling) (0) | 2021.08.03 |
---|---|
자바 Stream (바이트기반스트림/문자열기반스트림), IO 입출력 (0) | 2021.07.02 |
Java Volatile And Atomic - 멀티스레딩 환경에서.. (0) | 2021.05.18 |
Java Singleton 의 7가지 패턴 (0) | 2021.05.17 |
자바 '변수' - 변수 별 차이 및 메모리 내 저장 위치 / static에 대한 심화 학습 (0) | 2021.04.29 |