
과거 자바의 `GC`에 관해 알아보았을 때 `Mark And Sweep`만 알고 공부했었는데,
추후 `Mark Anc Compact`를 알게 되어 둘의 차이점에 관해 간단하게 정리하려고 한다.

Mark And Sweep
- Mark 단계:
- 살아있는 객체들은 마킹하고, 살아있지 않은 객체들에 관해서는 마킹을 수행하지 않는다.
- Sweep 단계:
- Mark되지 않은 쓰레기 객체들(참조되지 않은 객체)을 찾아 제거
- 위 과정은 메모리에서 객체를 청소하는 단계
- 이때, 메모리의 단편화가 발생할 수 있음
- 왜냐? 삭제만 할 뿐 JVM의 메모리에 이곳저곳 남아있기 때문
Mark And Compact
- `Mark And Compact`는 `Mark And Sweep`의 확장된 버전으로, Sweep 단계 후 객체들을 압축하여 메모리 단편화를 방지한다.
- Mark 단계:
- `Mark And Sweep` 단계와 비슷하게 살아있는 객체들을 마킹한다.
- Compact 단계:
- Marking된 살아있는 객체들을 압축하여 메모리 공간에 연속적으로 배치한다.
- 이렇게 하므로, 메모리 단편화를 줄일 수 있다.
- 하지만, Compact 단계가 추가되므로, 압축 작업이 추가되어 성능에 영향을 줄 수 있다.
- 결과적으로는 메모리 효율성은 더욱 향상
- Marking된 살아있는 객체들을 압축하여 메모리 공간에 연속적으로 배치한다.
`Mark And Sweep` 방식과 `Mark And Compact`은 주로 `Young Generation`에 사용되며,
`Old Generation`에서는 유사한 방식이 사용된다고 한다.
참고
`GC`를 최적화 한다는 것은 `Stop the World` 상황을 최대한 짧게 최적화 한다는 것을 의미.
이때, `Virtual Thread`를 너무 남발하면(Virtual Thread는 힙 영역에 저장)
`Stop the World` 상황이 너무 발생해서 `STW`이 자주 일어나게 된다.
그래서 유의해야 하긴 하지만, `Virtual Thread`는 대부분의 경우에서 긍정적이라고 생각되어 알고만 있으면 좋을 것 같다.
'Language > Java' 카테고리의 다른 글
| [Java] 코드 캐시(Code Cache) (0) | 2025.06.01 |
|---|---|
| [Java] Java를 복습해보자 (1) | 2025.01.05 |
| [Java] 자바 구성 (0) | 2024.03.31 |