GC (Garbage Collector)?
저번 포스팅에서 말했던 (https://junior-develop112.tistory.com/39) JVM의 구성요소 중 하나이며
자바에서는 힙 영역의 사용하지 않는 객체들을 개발자가 해제해줄 수 없기 때문에, GC를 이용하여 자동으로 메모리를 관리 해 줘야 한다.
힙 영역 에서는 위와 같이 나뉘어 있는데 , 각 영역에서 사용하지 않는 객체들은 메모리에서 GC가 발생하여 제거가 된다.
사용하지 않는 객체?
사용하지 않는 객체란 더 이상 참조가 되지 않는 객체를 의미한다. 아래 예제를 보자
int a = 5;
a = 40;
System.out.println(a);
예제 처럼, a 를 5로 초기화 해준 후 , 다시 a를 40으로 초기화를 해 주었을때
a 의 값은 40을 참조하고있으며 더이상 5를 참조하고 있지 않게 된다.
이러한 객체가 사용하지 않는 객체이다.
GC에서 사용하지 않는 객체의 구분 방법?
만약 현재 사용중인 객체를 메모리에서 제거 해버리게 된다면, 프로그램이 오류를 발생시킬 수 있다.
그렇기 때문에, GC를 사용시 메모리의 객체가 사용중인지, 아닌지를 구분해야만 한다.
객체가 처음 생성되게 된다면, 젊은 영역의 일부인 Eden 영역에 위치하게 된다.
그 후, Minor GC가 발생하게 되면, 사용하지 않는 객체는 메모리에서 제거가 되게 됩니다.
Eden 영역에서 살아남은 객체는 Survivor 영역으로 이동하게 되는데, Survivor 영역의 1과 2를 Minor CG가 발생할 때 마다 객체가 이동하게 됩니다.
이 과정을 통해 사용하지 않는 객체는 메모리에서 제거되게 되며, 최종적으로 살아남은 객체들은 Old Generation 영역으로 옮겨지게 됩니다.
그 후 Old Generation 영역에 있다가 미사용 되는 객체들은 Full GC를 통해 메모리에서 제거가 되게 됩니다.
Young Generation 영역에서 오래동안 살아남은 객체는 Old Generation 영역으로 옮겨지는데, 오래되었다는 기준은 무엇일까?
오래되었다고 하는 기준은 Young Generation 영역에서 Minor GC 가 발생하는 동안 얼마나 오래 살아남았는지로 판단한다. 각 객체는 Minor GC에서 살아남은 횟수를 기록하는 age bit 를 가지고 있으며, Minor GC가 발생할 때마다 age bit 값은 1씩 증가 하게되며, age bit 값이 MaxTenuringThreshold 라는 설정값을 초과하게 되는 경우 Old Generation 영역을 객체가 이동 되는 것이다. 또는 Age bit가 MaxTenuringThreshold 초과하기 전이라도 Survivor 영역의 메모리가 부족할 경우에는 미리 Old Generation 으로 객체가 옮겨질 수도 있다.
JVM 옵션 : -XX:MaxTenuringThreshold
출저: https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html
'Java > Java language' 카테고리의 다른 글
[JAVA]14. String / StringBuilder /StringBuffer ? 차이점 (0) | 2022.04.10 |
---|---|
[JAVA]12. 자바의 실행과정과 JVM (0) | 2022.03.27 |
[JAVA]11. 객체지향 프로그래밍(OOP)의 SOLID 5대원칙? (0) | 2022.03.11 |
[JAVA]10. 컬렉션 구조 (Set과 Map) (0) | 2021.08.14 |
[JAVA]9. 컬렉션 구조 -1 (List ) + Stack (0) | 2021.08.14 |
댓글