자바의 메모리 관리 방법! 가비지 컬렉션 (Garbage Collection) [ 자바 기초 강의 ]
위의 유튜브를 참고했습니다.
가비지 컬렉션?
- 자바의 메모리 관리 기법으로 애플리케이션이 동적으로 할당했던 메모리 영역중 더이상 사용하지 않는 영역을 정리하는 기능
- GC는 heap 메모리에서 활동하며 JVM에서 GC의 스케줄링을 담당하며 개발자가 직접 관여하지 않아도 사용하지 않는 메모리 제거해주는 역할
stop the world
- GC를 수행하기 위해 JVM이 멈추는 현상
- GC 작동하는 동안 GC 관련 Thread를 제외한 모든 thread는 멈춤
- 일반적으로 ‘튜닝'이라는 것은 이 시간을 최소화하는 것을 의미
GC의 종류
serial , parallel, cms, g1, z GC등이 있다.
GC의 원리
GC가 가능했던건 2가지 가설 덕분이라고 합니다.
- 대부분 객체는 금방 접근 불가능(unreachable)한 상태가 된다.이 객체들은 괄호가 끝나는 시점에 더이상 사용되지 않습니다.
- 특수한 경우에는 오래 사용될 수 있지만, 대부분의 경우는 unreachable한 상태가 되어 GC의 대상이 됩니다.
- 대부분의 객체는 중괄호({}) 안에서 생성됩니다.
- 오래된 객체에서 젊은 객체로의 참조는 아주 적게 발생한다.이 과정에서 앞에서 생성된 객체는 그 다음의 로직에서 사용된 이후 대부분 사용되지 않게 됩니다.
- 그러한 특성으로 인해 더이상 참조되지 않는 객체에 대해 GC를 할 수 있게 됩니다.
- 일반적으로 순차적인 로직에 의해 객체를 생성하여 활용하게 됩니다.
Heap area

- 맨 처음 객체가 생성이 되면 Eden 영역에 생성이 됩니다.
- 그리고 GC의 일종인 Minor GC가 발생하면 미사용 객체의 제거와 함께 아직 사용되는 것으로 판단되는 객체들을 Survivor1 또는 Survivor2 영역으로 이동시킵니다.단, 여기서 Survivor 영역을 거치지 않고 바로 Old Genration으로 이동하는 경우가 있는데, 객체의 크기가 Survivor 영역의 크기보다 클 경우입니다.
- 여기서 Survivor1과 Survivor2 영역은 둘 중 한 곳에만 객체가 존재하며, 다른 한 곳은 비어져 있어야 합니다.보통 From, to 로 구분을 하는데, 객체가 존재하는 Survivor영역(From)이 가득 차면 다른 Survivor영역(To)으로 보내게되고, 기존의 Survivor영역(From)을 비우는 작업을 진행합니다.
- 위 과정(1~3)을 반복하면서 Survivor 영역에서 계속 살아남는 객체들에게 일정 score가 누적이 되는데, 기준치 이상이 되면 Old Generation 영역으로 이동하게 됩니다.
- Old Generation 영역에서 살아남았던 객체들이 일정 수준 쌓이게 되면 미사용된다고 식별된 객체들을 제거해주는 Full GC(major GC)가 발생하게 됩니다.이 과정에서 STW(Stop-The-World)가 발생하게 됩니다.
GC는 사실 종류가 다양하여 각 GC마다 동작방식이 상이하기 때문에 본인이 개발하고 있는 어플리케이션의 특성을 잘 파악하여 그에 어울리는 GC를 선정하는 것이 중요하다고 합니다.
하지만 default로 설정된 GC가 가장 효율적인 경우가 많으며, GC를 튜닝하는 것은 최종적인 수단으로 두고 Code Level에서 해결하는 것을 많은 전문가 분들이 권고하고 있습니다.
다음에는 GC 종류들에 대해 간단하게 적어볼까 합니다.
Reference
'언어 > 자바' 카테고리의 다른 글
| 예외처리(exception) (0) | 2021.09.16 |
|---|---|
| 열거형(enum) (0) | 2021.09.16 |
| 자바 - 제네릭(Generic) (0) | 2021.09.13 |
| 직렬화 (Serialization) 와 역직렬화(Deserialization) (0) | 2021.09.13 |
| thread에 대해서! (0) | 2021.09.11 |