Android

Android 08. Garbage Collection(가비지 컬렉션)

shin96bc 2022. 6. 7. 15:59

(1) Garbage Collection(가비지 컬렉션 줄여서 GC) 이란?

     1) JVM 은 Heap 메모리에 객체를 생성합니다. GC 는 이런 JVM 의 Heap 메모리를 정리하는

          알고리즘을 말합니다.

 

     2) 한마디로 GC 는 메모리 관리 기법 중 하나로 메모리 영역 중에서 더 이상 사용하지 않는 영역들을

          정리해서 메모리를 관리해주는 기법이라고 할 수 있습니다. 즉, 동적으로 할당된 메모리 영역 중에서

          어떤 변수도 가리키지 않는 메모리 영역을 탐지하여 자동으로 해제하도록 해줍니다.

 

     3) 좋은 Java 개발자가 되려면 GC 에 대해 잘 알고 있어야 합니다. 자신이 개발하는 애플리케이션의

          특징에 따라 어떤 GC 알고리즘을 선택할 것인지 고민해야 합니다.

 

(2) Garbage Collection 의 동작 원리

     1) Garbage Collection 에는 Garbage Collection 알고리즘을 수행하는 Garbage Collector 가 존재합니다.

 

     2) Java 의 Heap 메모리는 3개의 Generation(제너레이션)으로 쪼갤 수 있습니다.

          <1> Young Generation

               1> Young Generation 은 모든 새로운 객체가 할당되는 영역입니다.

               2> Young Generation 은 또다시 Eden, Survivor Space 0, Eden, Survivor Space 1 로 세분화

                    되어집니다.

                    1. 새로 생성한 대부분의 객체는 Eden 영역에 위치합니다.     

                    2. Eden 영역에서 Minor GC 가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로

                        이동됩니다.

                    3. Minor GC 가 계속 발생해서 Survivor 영역에 객체가 계속 쌓이다가 하나의 Survivor 영역이

                        가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동시킵니다. 그리고

                        가득 찼던 Survivor 영역은 아무 데이터도 없는 상태가 됩니다.( Survivor 영역 중에 하나는

                        반드시 비어 있는 상태로 남아 있어야 합니다.)

                    4. 이 과정이 반복되다가 계속해서 오래 살아있는 객체는 Old 영역으로 이동하게 됩니다.             

 

               3> Minor GC 는 Stop the world 를 발생시킵니다. 객체가 사라질 가능성이 높다면 빠르게 정리가

                     되고, 살아남은 객체들은 Old 영역으로 옮겨집니다. Young 영역에서만 GC 가 자주

                     발생되도록 해야합니다.

 

               3> Stop the World 란 GC 스레드를 돌리기 위해서 JVM 앱을 중지시키는 것 입니다. GC 가

                     이루어지는 동안에는 모든 프로세스와 스레드가 잠시 동작을 멈춥니다.

 

          <2> Old Generation

               1> Old Generation 은 Young 영역에서 오래 살아남은 객체를 저장합니다. 

               2> Old 영역은 대부분 Young 영역보다 크게 할당합니다. 크기가 Young 보다 크기 때문에 GC는 

                     Young 보다 적게 발생하게 됩니다.

               3> Old 영역도 역시 객체들로 다 차면 Major GC 가 발생합니다. Major GC 역시 Stop the world

                     일으키는데,  Major GC 는 전부 살아있는 객체가 있을 수 있기 때문에 시간이 오래 걸릴 수도

                     있습니다. Stop the World 에 걸리는 시간은 이 Major GC 에 의해 결정된다고 해도 과언이

                     아닙니다.

 

          <3> Permanent Generation( Java8 부터는 Metaspace )

               1> Permanent Generation 는 JVM 이 Class 와 Method 에 대한 메타데이터를 저장하도록 하는

                    영역입니다.

               2> 앱의 생명주기 동안 JVM 에 의해 사용중인 Class 가 채워지고, Java 라이브러리, Method 가

                    이 구역에 저장될 수 있습니다. 또한 JVM 이 더 이상 필요하지 않은 메타데이터를 발견하면

                    Full GC 가 수행됩니다. (단, Java 8 부터는 Permanent Generation 영역이 Metaspace 영역으로

                    대체되었습니다.) Heap 영역 보다는 Method 영역에 적합한 것 같습니다.

 

 

참고 자료:

https://holika.tistory.com/entry/%EB%82%B4-%EB%A7%98%EB%8C%80%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%9C-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-1-Garbage-Collection%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94%EA%B0%80

 

https://d2.naver.com/helloworld/1329

 

https://imasoftwareengineer.tistory.com/103

 

https://lovestudycom.tistory.com/207

 

https://blog.naver.com/PostView.naver?blogId=nakim02&logNo=222433423154&parentCategoryNo=&categoryNo=213&viewDate=&isShowPopularPosts=true&from=search