JVM 과 GC

now_iz·2021년 8월 24일
0

성능 튜닝

목록 보기
1/1
post-thumbnail

JVM Runtime Data Area

Heap 영역

  • 인스턴스, 배열 등을 저장
  • JDK 8 부터는 Perm 영역이 사라졌다.

Young 영역 - 마이너 GC

  • 처음 객체가 생성되면, Eden 영역에 객체가 지정된다. Eden 영역이 꽉차면, GC 를 통해서 삭제되거나 살아남은 경우에는 Survivor 영역으로 옮겨진다. Survivor 영역은 2개로 나뉘어 있는데, 둘 중 하나는 반드시 비어 있어야 한다. 이런 작업을 반복하다가 Old 영역으로 이동하게 된다. (단, Young 영역에서 바로 Old 영역으로 이동하는 경우도 있는데, 객체의 크기가 아주 커서 Survivor 영역 보다 큰 경우다.)
    이렇게 Young 영역에서 발생하는 GC를 마이너 GC 라고 한다.

Old 영역 - 메이저 GC

  • Old 영역이나 Perm 영역에서 발생하는 GC 를 메이저 GC 라고 한다.


GC

  • 하나의 객체는 메모리(힙)를 점유하는데, 필요하지 않을 때 메모리(힙)에서 객체를 해제한다.
  • GC 는 메모리를 할당하고, 사용 중이거나 사용 중이지 않은 메모리를 인식하는 역할을 한다.

    OutOfMemoryError

    더 이상 사용 가능한 메모리 영역이 없는데, 계속 메모리를 할당하려고 할 때 OutOfMemoryError 이 발생하여 JVM 이 다운될 수 있다.

방식

  • Serial Collector
    • Young 영역과 Old 영역을 연속적으로 처리하며, 하나의 CPU 를 사용한다.
    • 대기 시간이 많아도 크게 문제가 되지 않는 클라이언트 장비에서 주로 사용한다.
    • stop-the world
    • mark-sweep-compact : Old 영역으로 이동된 객체들 중 살아 있는 객체와 쓰레기 객체를 식별한다. 쓰레기 객체를 삭제하고, 살아 있는 객체를 한 곳으로 모은다.

      Mark-Sweep-Compact

  • Parallel Collector (= Throughput Collector)
    • 다른 CPU 가 대기 상태로 남아있는 것을 최소화한다.
    • Young 영역에서는 (Serial Collector 와 달리) 병렬적으로 처리한다.
    • 많은 CPU 를 사용하기 때문에, CG 의 부하를 줄이고, 애플리케이션 처리량을 늘릴 수 있다.
    • Old 영역에서는 mark-sweep-compact 를 사용한다.
  • Parallel Compacting Collector
    • 여러 CPU 를 사용하는 서버에 적합하다.
  • G1 Collector
    • 바둑판 모양의 구역으로 메모리를 나누고, 각각 Eden, Survivor, Old 역할을 지정한다.

성능

  • full GC 가 실행 중일 때에는 JVM 에서 처리되지 않는다. 따라서, GC 를 많이 할수록 응답 시간에 영향을 끼치게 된다.
  • 자바는 메모리를 GC 를 통해서 관리하기 때문에, 메모리 처리 로직을 굳이 만들 필요가 없다.
    • 사실, 절대로 GC 를 쓰지 않는 것을 권장한다. System.gc() 등의 메소드로
profile
👀

0개의 댓글