GC simple summary

cooper·2023년 11월 28일
0
post-thumbnail

JVM & GC

Java 패러다임

(1) Platform Independence - Java applications are compiled into bytecode which is stored in class files and loaded in a JVM. Since applications run in a JVM, they can be run on many different operating systems and devices.

(2) Object-Oriented - Java is an object-oriented language that take many of the features of C and C++ and improves upon them.

(3) Automatic Garbage Collection - Java automatically allocates and deallocates memory so programs are not burdened with that task.

  • Java는 메모리를 자동으로 할당하고 할당 해제하므로 프로그램이 해당 작업에 부담을 느끼지 않는다.
    (= 개발자가 메모리 할당/해제할 필요가 없어 생산성을 증가한다.)

JVM

  • 자바 프로그램을 실행시키는 프로그램
  • 장점 : 플랫폼 독립성을 보장
    1. 기존 프로그램 실행 방식
      • 소스 코드를 컴파일러(compiler)를 통해 어셈블리어로 변환하고, 변환된 어셈블리어를 다시 어셈블러(assembler)를 통해 기계가 해석할 수 있는 기계어로 변환
    2. Java 실행 방식
      • 자바의 컴파일러를 통해 바이트 코드(Byte Code)라는 특수한 형태의 중간 코드를 생성해 class 확장자를 부여하고, JVM(Java Virtual Machine)이라는 프로그램을 통해 기계어로 번역되어 실행한다.
    3. JVM 의 장점
      • 하나의 소스코드를 통해 class 파일을 생성해서 배포하고, 어느 환경에서나 그 환경에 맞는 JVM만 설치되어 있다면 프로그램을 실행
  • 종류 : Hotspot JVM, GraalVM
    • Hotspot JVM : Java 1.3부터는 Hotspot VM이 추가되었고, Hotspot VM에는 2개의 JIT 컴파일러(c1, c2)가 포함되어 있다.
    • GraalVM : JIT 컴파일러들 중에서 기존의 c++로 작성된 C2 컴파일러인 Graal 컴파일러를 Java 기반으로 새롭게 작성된 VM

Key Hotspot Components

성능 튜닝을 위한 JVM component

  1. 힙(heap)은 오브젝트 데이터가 저장되는 곳입니다.
  2. 대부분의 튜닝 옵션은 힙의 크기를 조정하고 상황에 가장 적합한 가비지 컬렉터를 선택하는 것과 관련이 있다.
  3. JIT 컴파일러도 성능에 큰 영향을 미치지만 최신 버전의 JVM에서는 튜닝이 거의 필요하지 않다.

Describing Garbage Collection

  1. 힙 메모리를 살펴보고 사용 중인 객체와 사용하지 않는 객체를 식별하여 사용하지 않는 객체를 삭제하는 프로세스
  2. 대표적인 알고리즘 : mark-and-sweep algorithm (old GC)
    1. 과정 : marking - normal deletion - deletion with compacting

Step 1: Marking

  • 가비지 컬렉터가 사용 중인 메모리 조각과 사용되지 않는 메모리를 식별하는 단계
  • RootSet 식별 기준으로 한다.
    • 힙 내의 다른 객체에 의한 참조
    • Java 스택, 즉 Java 메서드 실행 시에 사용하는 지역 변수와 파라미터들에 의한 참조
    • 네이티브 스택, 즉 JNI(Java Native Interface)에 의해 생성된 객체에 대한 참조
    • 메서드 영역의 정적 변수에 의한 참조

Step 2: Normal Deletion

  • 참조되지 않은 객체를 제거하여 참조된 객체와 포인터를 여유 공간에 남김

Step 2a: Deletion with Compacting

  • 성능을 더욱 향상시키기 위해 참조되지 않는 객체를 삭제하는 것 외에도 나머지 참조 객체를 압축할 수도 있다.

JVM Generations (in Heap Area)

stop the world : 작업이 완료될 때까지 모든 애플리케이션 스레드가 중지됩니다.
(minor, major GC 모두 해당)

  1. Young Generation : 새로운 객체가 할당되는 공간 (minor GC 공간)
  2. Old Generation : 오래 생존한 객체가 할당저장되는 공간(major GC 공간)
    • major GC 는 생존한 모든 객체를 포함하기 때문에 훨씬 느리다.
    • (old object → new object 를 참조하거 같이 제거해야 할 수도 있기 때문이다.) ⇒ card table
    • card table : Old 영역에 있는 객체가 Young 영역의 객체를 참조할 때마다 정보가 표시
  3. Permanent generation : 클래스 및 메서드를 설명하는 데 필요한 메타데이터가 포함되어 있습니다.

Old 영역에 대한 GC

  • Serial GC
  • Parallel GC
  • Parallel Old GC(Parallel Compacting GC)
  • Concurrent Mark & Sweep GC(이하 CMS)
  • G1(Garbage First) GC

Serial GC (-XX:+UseSerialGC)

  • old 영역 사용 알고리즘 : mark-and-sweep algorithm
  • 적은 메모리와 CPU 코어 개수가 적을 때 적합한 방식
  • 운영에서 절대 사용 금지

Parallel GC (-XX:+UseParallelGC)

  • Serial GC와 기본적인 알고리즘은 동일
  • GC를 처리하는 쓰레드가 여러 개
  • Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 유리

Parallel Old GC(-XX:+UseParallelOldGC)

  • Old 영역의 GC 가 Mark-Summary-Compaction 알고리즘 사용
  • sweep 대신 summary 과정으로 대체한다.

G1 GC

  • GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다. 그러다가, 해당 영역이 꽉 차면 다른 영역에서 객체를 할당하고 GC를 실행한다. (Young, Old 영역과는 아예 다르다.)
  • 가장 큰 장점은 성능이다.

Reference

profile
막연함을 명료함으로 만드는 공간 😃

0개의 댓글