• GC
    • Garbage Collector JVM에서 주로 Heap 영역에 있는 데이터중 참조하는  객체를 제외한 객체를 삭제하는 역할을 한다. (Stack영역과 Method 영역도 GC 대상이 된다.)

  • 영역은 우선 5개의 영역 (eden, survior1, survior2, old, Permanent -> Metaspace)
  • GC 효율적으로 데이터를 처리하기 위해 나뉘어져 있다.

  • GC 크게 Minor GC Major GC , Full GC 방식이 있다.
    • Minor GC
      1. New(young) 영역에서 일어나는 GC
        1.
        최초에 객체가 생성되면 Eden 영역에 생성된다.
        2. Eden
        영역에 객체가 가득차게 되면 첫번쨰 GC 일어난다.
        3. survial1
        Eden영역의 메모리를 그대로 복사한다. 그리고 survivor1영역을 ㅔ외한다른영역의 객체를 제거한다.
        4. Eden
        영역도 가득차고 survivor1 영역도 가득차게 되면, Eden영역에 생성된 객체와 survivor1영역에 생성된 객체중 참조되고 있는 객체를 검사한다.
        5. 참조 되고있지
        않은 객체는 내버려두고 참조되고 있는 객체만 survivor2 영역에 복사한다.
        6. survivor2영을
        제외한 다른 영역의 객체들을 제거한다.
        7.
        위의 과정중 일정회상 참조되고 있는 객체들을 survivor2에서 old 영역으로 이동시킨다.
        (age
        값으로 판단) , 위과정을 반복, survivor2 영역까지 꽉차기 계속해서 old 비움

    • Major GC(Full GC)
      • Old 영역서 일어나는 GC
        1. Old
        영역에 있는 모든 객체들을 검사하면서 참조되고 있는지 확인한다.
        2.
        참조되지 않은 객체들을 모아 한번에 제거한다.
      • Minor GC보다 시간이 많이 걸리고 실행중 GC 제외한 모든 쓰레드가 중지한다.
      • Heap 메모리 영역의 중간중간 구멍(제거되고 빈메모리 공간) 생기는데 이부분을 업에기 위해 제구성한다. (디스크 조각모음같음) 따라서 메모리를 옮기고 다른 쓰레드가
      • 메모리를 사용해버리면 안되기 떄문에 모든쓰레드가 정지하는것이다.
  • Full GC:  Heap 전체를 clear 하는 작업 (Young/Old 공간 모두)

  • GC 종류
    • Serial GC
      • -XX:+UseSerialGC 옵션을 줘서 사용할 수 있는 Serial GC 는 Java SE 5, 6 에서 사용되는 디폴트 가비지 컬렉터이다.
      • MinorGC, MajorGC 모두 순차적으로 시행된다.
      • Mark-Compact collection method 를 사용한다.

 

  • Mark-Compact collection method 란, 새로운 메모리 할당을 빠르게 하기 위해서 기존의 메모리에 있던 오브젝트들을 힙의 시작위치로 옮겨 놓는 방법이다. 창고에서 필요없는 물건들을 버린 후, 창고에 물건을 차곡차곡 쌓기위해 창고안을 정리하는 것이라 생각할 수 있다. 아래 그림을 참고하면 이해가 쉽다.

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

 

  • Parallel GC
    • -XX:+UseParallelGC 옵션으로 사용 가능한 Parallel 가비지 컬렉터는 young generation 에 대한 가비지 컬렉션 수행시 멀티스레드를 사용한다. 멀티스레딩을 할 수 있는 ParallelGC 를 사용하도록 옵션을 주었더라도, 호스트 머신이 싱글 CPU 라면 디폴트 가비지 컬렉터(Serial GC)가 사용된다. 하지만, 호스트의 CPU 가 두개 이상이라면 young generation 의 가비지 컬렉션 시간을 줄일 수 있다.

  • Concurrent Mark Sweep (CMS) Collector
    • Concurrent Low Pause Collector 라고도 불리는 CMS 컬렉터는 -XX:+UseConcMarkSweepGC 옵션으로 사용할 수 있다. 대부분의 가비지 컬렉션 작업을 애플리케이션 스레드와 동시에 수행함으로써 가비지 컬렉션으로 인한 stop-the-world 시간을 최소화하는 GC이다.

  • CMS 컬렉터는 young generation 에 대한 가비지 컬렉션시 Parallel GC 와 같은 알고리즘을 사용하는데, -XX:ParallelCMSThreads=<N> 옵션으로 스레드 개수를 설정할 수 있다.
    • 일반적으로 CMS 컬렉터는 살아있는 오브젝트들에 대한 compact 작업을 수행하지 않으므로, 메모리의 파편화(Fragmentation) 가 문제가 된다면 더 큰 힙사이즈를 할당해야 한다.

  • G1 Garbage Collector
    • Garbage First 라는 의미의 G1 가비지 컬렉터는 Java 7 부터 사용가능하며, 장기적으로 CMS 컬렉터를 대체하기 위해 만들어졌다. -XX:+UseG1GC 옵션으로 사용가능하다. G1 가비지 컬렉터는 이전까지 이야기한 것들과는 다른 방식으로 동작한다. G1 GC 에 대한 자세한 내용은 [Oracle] Getting Started with the G1 Garbage Collector 를 참고하기 바란다.

'JAVA' 카테고리의 다른 글

캡슐화란?  (0) 2020.08.11
빌드 도구, Maven 이란?  (0) 2020.08.08
JVM 이란?  (0) 2020.08.07
Jit 컴파일러란? 최적화 튜닝에 대해서  (0) 2020.08.07
Java 어노테이션 (annotation) 이란?  (0) 2020.08.07

+ Recent posts