도대체 GC는 언제 발생할까?
-
GC란?
GC는 Garbage Collection의 약자이다. 하는 역할은 더 이상 참조되지 않는 객체(쓰레기 객체)
를 수집하는 역할 이다. C에서는 개발자가 직접 메모리 관리를 해주어야 하지만 자바에서는
GC가 있기 때문에 개발자가 메모리관리가 필요한 로직을 만들필요가 없다. 즉, 메모리 관리에
관해서 신경쓸 필요가 없다.
-
GC의 원리
GC는 기본적으로 3가지 역할을 수행한다.
1. 메모리 할당
2. 사용 중인 메모리 인식
3. 사용하지 않는 메모리 인식
사용하지 않는 메모리 인식을 하지 않으면 할당한 메모리 영역이 꽉 차서 WAS에 행이 걸린다.
결국 더 많은 메모리를 할당하려는 현상이 발생하게 되고 만약 WAS의 최대 메모리 크기를 지
정해서 전부 사용한 다음, GC를 해도 더 이상 사용 가능한 메모리 영역이 없는데 계속 메모리
리를 할당하려고 하면 OutOfMemoryError가 발생하여 wAS가 다운될 수도 있다.
JVM은 일반적으로 스택, 힙, 메소드 영역으로 나눠 질 수 있다. 그 중 GC는 힙에서 실행됩니
다. 힙의 영역 중 GC가 영향을 미치는 부분은 young역역과 메모리 영역인 old이다. young은
다시 eden과 survivor로 나눠진다.
eden에 데이터가 일정량 쌓이게 되면 eden영역의 객체는 다른 곳으로 이동하거나 삭제가 일
어난다. 이동될 때 survivor로 이동을 하게 된다. 이때 survivor는 2개의 영역중 하난는 빈공간
이어야한다. 할당된 survivor가 다 차게되면 GC가 되어 eden과 할당된 survivor에 있는 객체가
비어있는 survivor에 이동하게 됩니다. 이후 더 큰객체가 들어오거나 young 영역이 모두 차게
되면 old영역으로 이동하게 됩니다.
-
GC의 종류
GC는 크게 두가지로 나뉜다. 마이너 GC와 메이저 GC의 두가지 GC가 발생할 수 있다.
1. 마이너 GC: young 영역에서 발생하는 GC
2. 메이저 GC: old 영역이나 Perm 영역에서 발생하는 GC
-
4가지 GC방식
시리얼 콜렉터, 병렬 콜렉터, 병렬 컴팩팅 콜렉터, CMS 콜렉터로 나눌 수 있다.
시리얼 콜렉터는 young영역과 old영역이 연속적으로 처리되며 CPU를 사용한다. Sun에서는
이 처리를 수행할 때를 Stop - the - world라고 표현한다.
병령 콜렉터는 Throughput collector로도 알려진 방식이다. 다른 CPU가 대기 상태로 남아
있는 것을 최소화하는 것이 목적이다. 병렬로 처리하여 많은 CPU를 사용하기 때문에 GC의
부하를 줄이고 애플리케이션의 처리량을 증가시킬 수 있다.
병렬 컴팩팅 콜렉터는 JDK 5.0 업데이트 6부터 사용가능하다. young 영역에 대한 GC는 병렬
콜렉터와 동일하지만, old 영역의 GC는 다른 알고리즘을 사용한다. 병령 콜렉터와 동일하게 이
방식도 여러 CPU를 사용하는 서버에 적합하다.
CMS 콜렉터는 힙 메모리 영역의 크기가 클 때 적합하다. 2개 이상의 프로세스를 사용하는 서
버에 적당하고 대표적인 대상이 웹 서버이다.
-
강제로 GC시키기
System.gc()메소드 나 Runtime.getRuntime().gc()메소드를 사용하면 된다. 하지만 추천하지는
않는다. 사용했을 때의 성능저하가 원인이다.
-
정리
GC는 JVM에서 CPU와 메모리의 크기에 따라서 자동적으로 지정하게 되어 있다.
'도서' 카테고리의 다른 글
[eBook] 용기의 심리학자, 아들러의 미움받을 용기 (0) | 2020.10.29 |
---|---|
자바 성능을 결정짓는 코딩 습관과 튜닝이야지 [Story 01] (0) | 2012.04.04 |