일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Android Studio
- gitlab submodule
- 앱개발
- 게임개발
- 내 맘대로 정리한 안드로이드
- 타이쿤
- java
- 앱
- submodule sourcetree
- submodule pull
- 안드로이드개발
- DataBinding
- github submodule
- firebase
- 2d게임
- github
- 티스토리
- 카페오냥
- 서브모듈 sourcetree
- Kotlin
- Unity
- Android
- 안드로이드
- 유니티
- 서브모듈 pull
- 쿼터뷰
- 개발
- 안드로이이드 submodule
- 코틀린
- GIT
- Today
- Total
Uing? Uing!!
[내 맘대로 정리한 안드로이드] Garbage Collection(GC) 은 어떻게 동작하는가? 본문
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)
'Android' 카테고리의 다른 글
[내 맘대로 정리한 안드로이드] Java와 Kotlin에서의 접근 제한자 (0) | 2020.07.29 |
---|---|
[안드로이드 삽질기록] 구글 로그인 결과가 Status{statusCode=DEVELOPER_ERROR, resolution=null}일 때 (0) | 2020.07.29 |
[내 맘대로 정리한 안드로이드] 시작하며 (0) | 2020.07.28 |
코로나위젯 - 위젯으로 보는 코로나바이러스 국내현황 (2) | 2020.02.23 |
[안드로이드 삽질기록] 구글 플레이스토어 인증키 분실 시 새로운 인증키 요청 방법 (0) | 2019.07.10 |