[Java] 가비지 컬렉터 이번에 끝내자!!!!!!!!!!!!

YoungHo-Cha·2021년 9월 25일
3

Java

목록 보기
5/7
post-thumbnail

나는 봤던 내용을 까먹는게 정말 싫다.. 가비지 컬렉터를 예전에 공부를 했지만 까먹고 까먹고..

그래서 ㅇㅋ.
또 까먹을거 ㅇㅈ

여기서 완전 보기 편하게 정리하고, 다음에 까먹으면 5분보고 기억나도록 만들어 보자.

미래의 영호야.

또 보러 왔어?


🚗목차

  • 가비지 컬렉터란(Garbage Collector)?
  • 가비지 형님은 어떻게 수집함?

🧐가비지 컬렉터란?

나를 위한 3줄 요약

영호야
1. 가르키는 변수가 없는 메모리 영역를 수집한단다.
2. 메모리 영역의 메모리 해제(free())를 자동으로 해주는 것이란다.
3. 니 방 치워주시는 어머니 같은 존재란다. (방 좀 치워라)

🌈코드 예시

그러면 가르키는 변수가 없는 메모리가 무엇일까?


Product product = new Product("TV");

sellTo(product);

product = null; // 삐용삐용 new Product("TV") 왕따됐음

위 코드를 보면, new Product("TV") 가 메모리 어딘가에 할당되었을 것이다. 그리고 해당 메모리 영역을 가르키던 "product"가 null이 되었다.

그럼 new Product("TV")는 누가 챙겨?

바로 우리 어머님.
"가비지 컬렉터"님 께서 메모리 해제를 해서, 집으로 보낸다.(메모리 해제)

🌈장점

  1. 이미 해제된 메모리에 접근하는 버그를 방지해준다.
  2. 이미 해제된 메모리를 또다시 해제하는 버그를 방지해준다.
  3. 메모리 누수를 방지한다.

🌈단점

  1. 메모리가 해제되는 시점을 알 수가 없다.
  2. 해제할 메모리를 결정하는데 비용이 든다.
  3. 쓰레기 수집이 이루어지는 시점을 예측할 수가 없어서, 어떤 타이밍에 점유당할지 모른다.

🧐가비지 형님은 어떻게 수집함?

나를 위한 3줄 요약

  1. 수집하는 방법이 많다. "표시하고 쓸기", "삼색 표시 기법", "객체 이동 기법", "세대 단위 쓰레기 수집" 이 있다.
  2. 자바는 "세대 단위 쓰레기 수집"을 사용한다.
  3. 응애

각 방법을 살펴보자.

🌈세대 단위 쓰레기 수집

나는 자바를 사용하니까 자바에서 사용하는 "세대 단위 쓰레기 수집"을 보자.

나를 위한 3줄 요약

  1. 할당된 시간에 따라 세대별로 구분하여, 서로 다른 메모리 영역에 객체를 할당한다.
  2. 한 세대의 메모리 영역이 꽉 차면, 이 메모리 영역에서 살아남은 객체를 더 오래된 메모리 영역으로 옮긴다.
  3. 오래된 영역의 객체는 해제될 확률이 줄어서 새로 할당 영역만 주기적으로 수집하게 되는 장점이 있다.

🔎좀 더 구체적으로 보자.

  1. 사용하고 있는 객체를 수집하여, 메모리 해제하면 프로그램에 문제가 생긴다!

어떻게 이것을 해결할까?

먼저 JVM의 구조를 보자!!

여기서 주목해야 할 것은 Heap이다.

Heap의 내부 구조는 다음과 같다.

  1. "new Fruit()"를 생성하면 "Eden"에 위치한다.

  2. "Minor GC"가 발생하면, 참조되지 않는 객체는 메모리에서 제거된다.

  3. Eden에서 살아남은 객체는 s0 & s1으로 이동한다.

  4. "MinorGC"가 발생하면 s의 영역에 있는 객체는 s1과 s2를 왔다갔다 이동한다.

  5. 이 과정에서 참조되지 않는 객체는 메모리에서 제거된다.

  6. s영역에서 살아남은 객체는 old영역으로 이동된다.

  7. Old 영역의 미사용 객체는 Full GC를 통하여 메모리 해제된다.

🔎오랫동안 살아남았다는 기준은 뭐야?

각 객체는 Minor GC에서 살아남은 횟수를 기록하는 "age bit"를 가지고 있다. Minor GC의 발생마다 "age bit"는 1씩 증가한다. "age bit"가 설정값을 초과하면 영역이동이 발생한다!

🌈표시하고 쓸기

그림판으로 그려서 손보다 잘그린다 ^^

이해가 안될 수도 있으니 글로 또 보자.

표시하고 쓸기 기법은 포인터 추적 기법 가운데 가장 단순한 기법이다. 먼저 각 메모리 할당 영역에 표시를 위해 1비트의 메모리를 남겨 둔다. 표시 단계에서, 모든 변수가 가리키는 영역을 "사용 중"으로 표시하고, 그 영역에서 가리키는 또다른 영역 또한 "사용 중"으로 표시한다. 이와 같이 모든 메모리 영역을 표시하고 나면, 표시되지 않은 영역이 접근 불가능한 메모리 영역이 된다. 접근 불가능한 메모리 영역들을 쓸기 단계에서 모두 해제한다.

읽기 싫다. 내가 다시 풀어쓴다.

  1. 모든 변수가 가리키는 영역에 1비트로 표시한다. (그림에서 별)
  2. 해당 영역에서 가리키는 영역에 또 1비트 표시한다.
  3. 그리고 다음 영역에서 가리키는 영역에 또 1비트 표시한다.
  4. 끝까지 반복해서 나간다.

해당 방법은 메모리 전체 영역을 보아야 해서 별로다. 표시 단계에서 메모리 내용이 바뀌면 큰 일이 생겨서 시스템이 잠시 정지된다.


🌈삼색 표시 기법

위의 "표시하고 쓸어 담기"를 보완한거다.

  1. 삼색(흰색, 회색, 검은색)으로 분류한다.
    흰색: 더이상 접근 불가능한 객체
    회색: 접근 가능한 객체이지만, 이 객체에서 가리키는 객체는 검사x
    검은색 : 이 영역에서 가리키는 객체들이 흰색 객체를 가리키지 않음을 의미한다.

  2. 알고리즘이 시작할 때는 변수가 가리키는 객체들이 회색으로 표시된다. 나머지는 흰색이다.

  3. 회색으로 표시된 객체 가운데 하나를 선택해서 검은색으로 표시하고, 이 객체가 가리키는 모든 객체를 회색으로 표시한다.

  4. 회색 객체가 하나도 남지 않을 때까지 위 과정을 반복한다.

  5. 남은 흰색 객체는 접근 불가능한 객체이므로, 모두 해제한다.

이해안된다. 그림을 참고하자!


🌈객체 이동 기법

객체 이동 기법은, 해제할 객체 표시가 완료된 후 해제되지 않은 객체를 그대로 두는 것이 아니라, 다른 영역으로 복사하는 기법을 가리킨다.

이것은 아주 쉽다!

쓰고 있는 것을 다른곳으로 옮겨준다는 것이다!


📋마치며

오늘은 GC 공부를 했다. 공부한 직후에는 항상 170살까지 기억날 것 같은데..

2달이면 까먹는다 ㅋㅋ
나중에 다시와서 꼭 보자!


🧷Reference

profile
관심많은 영호입니다. 궁금한 거 있으시면 다음 익명 카톡으로 말씀해주시면 가능한 도와드리겠습니다! https://open.kakao.com/o/sE6T84kf

0개의 댓글