Uing? Uing!!

[내 맘대로 정리한 안드로이드] Garbage Collection(GC) 은 어떻게 동작하는가? 본문

Android

[내 맘대로 정리한 안드로이드] Garbage Collection(GC) 은 어떻게 동작하는가?

Uing!! 2020. 7. 28. 20:06
반응형

Garbage Collection

Java는 Garbage Collection(GC)을 이용하여 메모리를 관리한다.

필요에 따라 GC가 실행되고, 그 과정에서 사용하지 않는 객체들을 정리해 준다.

 

Q. 하지만 어떻게?

지난 면접에서 Garbage Collector가 어떤 식으로 객체를 정리하는지에 대해 질문을 듣자 머리가 멍해졌다.

뭔가... 참조를... 활용할 것 같은데... 뒷부분의 코드를 확인하나...?

코드를 활용한다고 답변했다. 잘 모르는 것이 느껴졌는지 추가 질문이 있었고 완전히 잘못 답변했다.

지금 생각해 보니 이 면접... 왜 나를 붙여주셨나 싶다 ㅋㅋ

 

구글링을 통해 많은 자료들을 둘러보고, 가장 기본적인 내용부터 이해하고자 했다.

도움이 된 사이트들이 많았지만 지금 검색해 보았을 때 유익해 보이는 자료들을 일단 링크한다.

 

https://d2.naver.com/helloworld/1329 (정리가 상세히 되어 있어서 잘 읽었는데 지금 보니 2011년 글. 세상에.)

https://imasoftwareengineer.tistory.com/103 (Mark & Sweep)

 

Garbage Collection의 동작 원리

아래 기술되는 내용은 GC의 모든 것을 다루지 않는다.

그저 GC라는 것이 있고 그것이 어떤 방식으로 돌아간다- 하는 간략한 요약 정도일 뿐이다.

여러 GC 방식이라든가, 메모리 영역에 대한 자세한 내용은 위의 Naver D2 링크 등에서 확인할 수 있다 :)

 

1. 자바에서는 Garbage Collection(또는 GC)를 이용하여 메모리를 정리한다.

1-1. GC는 더이상 사용되지 않는 쓰레기 객체들을 정리하는 작업을 한다.

1-2. GC는 필요에 따라 자동으로 실행된다. (2-2의 경우에 실행된다.)

 

2. GC에 의해 관리되는 메모리는 Young과 Old로 나뉜다.

2-1. Young은 3단계로 다시 나뉜다. (Eden, Survivor 1, Survivor 2)

2-2. 객체가 GC에 의해 정리되지 않고 오래 살아남을수록 Eden -> Survivor 1 -> Survivor 2 -> Old로 이동된다.

2-2. 각 메모리 영역에 할당된 메모리가 적정 수치를 넘었을 때 GC가 실행된다.

 

3. GC는 Mark & Sweep 방식으로 동작한다.

3-1. GC가 실행되면, 아래와 같이 외부에서 접근할 수 있는 객체들을 GC Root로 설정한다.

- 실행 중인 쓰레드 (Active Thread)

- 정적 변수 (Static Variable)

- 로컬 변수 (Local Variable)

- JNI 레퍼런스 (JNI Reference)

3-2. GC Root에서 출발하여, 참조되고 있는 변수들을 순차적으로 Mark한다. (Mark)

3-3. Mark되지 않은 객체들은 쓰레기 객체로 판정하고 정리한다. (Sweep)

 

4. GC가 발생하는 동안은 stop-the-world 상태가 된다.

4-1. 객체 참조를 정확히 판단해야 하기 때문에, GC 과정에서 참조가 변경되면 안 된다.

4-2. 참조를 유지하기 위해 GC 실행시간 동안은 모든 작업이 멈춘다. (stop-the-world)

반응형
Comments