카카오,,,티스토리 서버 오류로 들어가지지 않는다. 거의 참고할 수 있는 참고자료가 반이 줄었다
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를 통해 해제시켜준다.
자바의 Garbage Collection(GC)는 사용하지 않는 객체를 메모리에서 제거하는 것이 목적 이다. 다른 프로그래밍 언어인 C언어 같은경우 메모리 할당과 제거를 수동으로 해줘야하지만, 자바는 자동으로 GC가 처리해준다.
GC는 프로그램 실행 중에 메모리 안에 있는 모든 객체를 검사하여 참조하지 않는 객체를 삭제하는 프로세스이다.
`
대충 GC가 Heap 메모리 영역을 관리해준다는 걸 알았다. 그럼 어떻게 Heap영역이 관리되는지 heap 영역의 구조를 살펴보자.
힙은 Object 타입의 데이터를 담아둠 String, List, new 객체
유효한 참조를 reachable , 참조되지 않으면 unreachable
GC 는 unreachable 한 객체들을 garbage 라고 인식하게 됩니다
참조되는 객체들에 대해 마크를 하게 된다. -> make phase
마크되지 않은 객체들을 추적하여 삭제한다. -> sweep phase
그럼 그림과 같이 메모리를 해제하는것을 알 수 있다.
하지만 그림에도 보이듯이 메모리가 fragmentation, 단편화 되는 단점을 가짐
-> 해결하기 위해 mark and compact algorithm
Mark And Sweep Algorithm 처럼 참조되는 객체들에 대해서 마크를 하고, 참조되지 않으면 삭제를 합니다. 이후에 메모리를 정리한다. 이를 통해 단편화 해결
young - 비교적 젊은 reference가 살아있는 곳
- eden - young영역중에서도 특히 방금 막 생성된 녀석들이 있는 곳
- survivor - 영역이 두개 존재하는데 eden에서 생존된 녀석들이 당분간 생존해 있는 곳
old - 특정 횟수 이상을 살아남은 reference가 살아있는 곳
permanent - Method Area의 메타정보가 기록된 곳
Survivor 0 과 eden mark 한 후 다시 위 과정을 반복한다. 살아남은 객체들은 Survivor 1 로 할당된다.
이러한 과정은 한가지 가설에 의해 성립됐다.
가설은 대부분의 객체는 빠르게 unreachable 한 상태로 전환이 된다고 보고 있다. 또한, 저번 시간에 보았던 Heap 의 메모리 영역 기준으로 오래된 영역에서 최신 영역으로의 참조 방향은 적게 존재한다고 가정한다.
실제 조사해본봐로 대부분의 객체가 빠르게 소멸하는 것을 알 수가 있다.
GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다
: GC를 실행하는 쓰레드 외의 모든 쓰레드가 작업을 중단한다.
-> 당연 짧을 수록 좋음
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/