반응형
2020.12.19 - [프로그래밍 노트/JAVA] - [JAVA] JVM 가상머신 메모리 구조
가비지 컬렉터(GC)
애플리케이션이 생성한 객체의 생존 여부를 판단하여, 더 이상 참조되지 않거나 null인 객체의 메모리를 해제시키며 메모리를 반납한다. (Heap의 재사용)
Minor GC
New/Young 영역에서 일어나는 Garbage Collection
새로 생성된 객체(Instance)는 Eden 영역에 위치한다. Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다. 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 일정시간 참조되고 있다는 뜻이므로 Old영역으로 이동시킨다.
- Eden 영역에 객체가 가득차게 되면 GC 발생
- Survivor0 영역에 값 복사, Survivor0 영역을 제외한 나머지 영역 객체 삭제
- Eden 영역과 Survivor0 영역의 메모리가 기준치 이상일경우, Eden 영역에 생성된 객체와 Survivor0 영역에 있는 객체 중 참조되고 있는 객체가 있는지 검사
- 참조되고 있는 객체들을 Survivor1영역에 복사, Survivor1 영역을 제외한 영역의 객첻르을 삭제
- 일정시간이상 참조되고 있는 객체들을 Old영역으로 이동
=> 반복 수행
Major GC
Old영역에 있는 모든 객체들을 검사하여 참조되지 않은 객체들을 한꺼번에 삭제한다. Major GC은 시간이 오래 걸리며, 실행 중 프로세스가 정지된다. (stop-the-world)
Major GC가 발생하면 GC를 수행하는 스레드를 제외한 나머지 스레드는 모든 작업을 멈추고, GC 작업이 완료된 이후에 다시 시작된다.
GC 대상은 어떻게 결정될까?
참조되고 있지 않은 객체를 가비지(Garbage)라고 하며 객체가 가비지인지 아닌지 판단하기 위해 reachability라는 개념을 사용한다. 힙 영역에 할당된 객체가 참조가 있으면 rechability, 없으면 unreachability로 판단한다.
객체들은 총 4가지 경우를 참조하게 된다.
- 힙 내의 다른 객체에 의한 참조
- Java 스택, 즉 Java 메소드 실행 시에 사용하는 지역변수와 파라미터들에 의한 참조(Root set)
- 네이티브 스택(JNI, Java Native Interface)에 의해 생성된 객체에 대한 참조(Root set)
- 메서드 영역의 정적 변수에 의한 참조(Root set)
반응형
'프로그래밍 노트 > JAVA' 카테고리의 다른 글
[JAVA]스레드 풀을 사용해야 하는 이유. (장/단점) (0) | 2021.08.30 |
---|---|
[Java] LocalDateTime, ZonedDateTime (0) | 2021.07.24 |
[Java] LocalDate, LocalDateTime 날짜 차이 계산하기 (0) | 2020.12.22 |
[JAVA] JVM 가상머신 메모리 구조 (0) | 2020.12.19 |
[JAVA] Stream 요소를 그룹핑해서 수집하기(Collectors.groupingBy) (0) | 2020.01.09 |