[자바] JVM GC

Jifrozen·2022년 10월 16일
0

기초 다지기

목록 보기
14/29

카카오,,,티스토리 서버 오류로 들어가지지 않는다. 거의 참고할 수 있는 참고자료가 반이 줄었다


https://velog.io/@jifrozen/JAVA-JVM-%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD
이전 jvm 메모리 영역을 보면
코드를 싱행함에 따라 jvm 메모리 영역 stack과 heap에 데이터가 쌓이게 된다.
stack의 경우 pop()을 통해 코드가 끝나면 전부 없어지지만
heap의 경우 계속 값이 남아있게 된다.
이런 heap의 값을 GC를 통해 해제시켜준다.

JVM GC

자바의 Garbage Collection(GC)는 사용하지 않는 객체를 메모리에서 제거하는 것이 목적 이다. 다른 프로그래밍 언어인 C언어 같은경우 메모리 할당과 제거를 수동으로 해줘야하지만, 자바는 자동으로 GC가 처리해준다.

GC는 프로그램 실행 중에 메모리 안에 있는 모든 객체를 검사하여 참조하지 않는 객체를 삭제하는 프로세스이다.

`

JVM 메모리 - Heap

대충 GC가 Heap 메모리 영역을 관리해준다는 걸 알았다. 그럼 어떻게 Heap영역이 관리되는지 heap 영역의 구조를 살펴보자.

힙은 Object 타입의 데이터를 담아둠 String, List, new 객체

수거대상

Reachable /Unreachable

유효한 참조를 reachable , 참조되지 않으면 unreachable

GC 는 unreachable 한 객체들을 garbage 라고 인식하게 됩니다

GC 알고리즘

Mark And Sweep Algorithm

참조되는 객체들에 대해 마크를 하게 된다. -> make phase
마크되지 않은 객체들을 추적하여 삭제한다. -> sweep phase
그럼 그림과 같이 메모리를 해제하는것을 알 수 있다.
하지만 그림에도 보이듯이 메모리가 fragmentation, 단편화 되는 단점을 가짐
-> 해결하기 위해 mark and compact algorithm

mark and compact algorithm


Mark And Sweep Algorithm 처럼 참조되는 객체들에 대해서 마크를 하고, 참조되지 않으면 삭제를 합니다. 이후에 메모리를 정리한다. 이를 통해 단편화 해결

GC 과정

heap 구조

  • young - 비교적 젊은 reference가 살아있는 곳
    - eden - young영역중에서도 특히 방금 막 생성된 녀석들이 있는 곳
    - survivor - 영역이 두개 존재하는데 eden에서 생존된 녀석들이 당분간 생존해 있는 곳

  • old - 특정 횟수 이상을 살아남은 reference가 살아있는 곳

  • permanent - Method Area의 메타정보가 기록된 곳

  1. 처음에는 eden에 할당된다.
  2. eden에 꽉 차면 Minor GC 발생
  3. Mark sweep 발생 mark한 후 makr없는 객체들은 unreachable이기 때문에 삭제한다.
    살아남은 객체들은 Survivor 0 으로 이동한다. 나이 1증가
  4. minor GC가 발생하면


Survivor 0 과 eden mark 한 후 다시 위 과정을 반복한다. 살아남은 객체들은 Survivor 1 로 할당된다.

  1. 만약 한정 나이가 차면 old Generation으로 간다.
  2. old generation이 꽉 차면 Major GC 가 발생한다.

이러한 과정은 한가지 가설에 의해 성립됐다.

Weak Generational Hypothesis

가설은 대부분의 객체는 빠르게 unreachable 한 상태로 전환이 된다고 보고 있다. 또한, 저번 시간에 보았던 Heap 의 메모리 영역 기준으로 오래된 영역에서 최신 영역으로의 참조 방향은 적게 존재한다고 가정한다.

실제 조사해본봐로 대부분의 객체가 빠르게 소멸하는 것을 알 수가 있다.

Stop-the-world

GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다
: GC를 실행하는 쓰레드 외의 모든 쓰레드가 작업을 중단한다.
-> 당연 짧을 수록 좋음

GC의 종류

  1. Serial
  • 싱글스레드 애플리케이션을 위한 GC -> GC 퍼리하는 스레드가 1개
  • Mark-Compact사용
  • 다른 GC에 비해 stop-the-world 길다 -> 실행 간에는 무조건 STW가 발생하기 때문에 멀티 스레드 환경에서는 사용하지 않는 것이 좋다.
  1. Parallel
  • java 8 default GC
  • 이름 그대로 병렬처리함 -> swt 발생이 없는게 아님
    멀티 스레드로 young generation 처리하고 싱글 스레드로 old genereration 처리함 -> 이후 Parellel Old GC 등장 old genereration도 병렬
  1. CMS(Concurrent Mark Sweep)
  • stw 시간을 줄이기 위해 고안됨
  • compact 과정이 없음
  • Tri-color Marking Algorithm을 사용함 -> 회색 검은색 흰색을 사용해GC Root(회색->검은색)에서 참조하는 객체 찾음(흰색->회색 변함) -> 이거 반복해서 최종적으로 흰색 객체 지움(아무도 참조하지 않아서) - 간단하게 내가 이해한것이라 맞는지,,,쩝
    -> mark ans sweep에 비해 복잡하지만 stw 짧음
  1. G1
  • java 9+이 default GC

  • heap을 일정한 크기의 region으로 나눔

  • 전체 heap이 아닌 region 단위로 탐색

  • mark-sweep and compact 알고리즘으로 CMS의 메모리 단편화 이슈를 해결하였다. 그래도 모든 GC와 같이 STW가 존재한다.
    -compact 알고리즘의 의해 살아남은 객체들을 새로운 Region으로 대피시키는 데 이 과정에서 pause가 발생

어우 파고들면 끝이없다,,,GC 튜닝도 있는데 찾아본봐로 성능의 끝이 GC 튜닝이라고 한다. 뭔가 종류를 바꿔끼는건가 아직 잘 모르겠다 성장하면 다시 찾아보겠다.

출처
https://www.youtube.com/watch?v=Fe3TVCEJhzo&t=141s
https://perfectacle.github.io/2019/05/11/jvm-gc-advanced/
https://velog.io/@recordsbeat/Garbage-Collector-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B8%B0#serial
https://tecoble.techcourse.co.kr/post/2021-08-30-jvm-gc/
https://donghyeon.dev/java/2020/03/31/%EC%9E%90%EB%B0%94%EC%9D%98-JVM-%EA%B5%AC%EC%A1%B0%EC%99%80-Garbage-Collection/

0개의 댓글