출처: https://www.youtube.com/watch?v=UJDXXmuMldM&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=117
가비지 컬렉션(GC)이란?
- 참조되지 않는 객체들이 차지하고 있는 메모리를 해제하는 것
- C, C++에서는 직접 해제해야 했음
- free();를 작성하는데 리소스 사용
- Java에서는 JVM에서 자동으로 작업

JVM(Java Virtual Machine)
- JVM: 자바 파일이 어느 환경에서든지 잘 구동될 수 있도록 함
- Java 파일 실행 시 필요한 클래스를 로딩해서 Class Loader에 올림
- Execution Engine이 메모리에 로딩된 코드를 해석
- Garbage Collector가 이 과정에서 자동으로 실행
- JVM 메모리 - Runtime Data Area
- Heap 영역 : 생성되는 모든 참조자료형 객체를 저장
- Stack 영역 : 참조만 저장

- Heap 영역
- GC가 관리
- Young Generation: 새로 생성된 객체가 저장됨
- Eden Space: 객체가 처음 생성되는 곳
- Survivor Space (S0, S1): Eden에서 살아남은 객체가 이동
- Old Generation: 오래 살아남은 객체가 저장됨


GC 작동 방식
- 청소 방식
- Mark: 살아있는 객체를 찾아 마킹
- Sweep: 참조하고 있지 않은 쓰레기 객체를 Heap에서 제거
- Compact: 살아있는 객체들을 한 곳으로 모음
- GC 작동 방식 (1 ~ 4 반복)
- 메모리에 객체가 생성되면 Eden 영역에 위치
- Eden 영역이 다 차면 GC를 실행 (청소)
- 살아남은 객체는 한 Survivor 영역으로 이동
- 살아남은 객체의 age가 1 증가
- 반복 후 age가 기준(jdk의 경우 31) 커지면 Old Generation으로 이동
- 1~4(Young Gen에서 일어나는 GC) -> Young GC
- Old GC: Old Generation이 가득 차면 더 이상 참조되지 않은 오래된 객체를 삭제
- 약한 세대 가설: 오래 살아남은 객체는 더 오래 살아남을 가능성이 높다.
- Young Gen과 Old Gen으로 나눠 관리해 효율적인 GC가 가능
GC가 자주 발생하는 경우
- 단점: STW(Stop The World)
- GC가 작동되는 동안 모든 애플리케이션 스레드가 중단
- 응답 시간 증가
- 덜 발생하게 하려면?
- 불필요한 객체를 만들어내는 상황 줄이기
- 잦은 문자열 결합에는 String 대신 StringBuilder 사용
- String을 더할 때마다 새로운 객체를 생겨남

2. Integer, Long 같은 래퍼 클래스보다는 기본 타입 사용
- 불필요한 Long 인스턴스가 엄청나게 만들어진다.

자체 Q&A
- static 변수들은 GC 대상일까?
- static 변수들도 Heap 영역에서 관리하기 때문에(JDK 8부터) GC 관리 대상이다.
- GC를 어느정도로 알아야할가?
- 튜닝 방식 등 - 기본으로 G1 GC
- 기본 작동 방식 위주로 알아두기
GC에 대해 기본적으로 알게 되니까 아래 내용도 이해할 수 있게 되었다.
-> 모니터링 시도 중

'프로그래밍 언어 > Java' 카테고리의 다른 글
[테코톡] Record (0) | 2025.04.07 |
---|---|
열거 타입(Enum) (0) | 2023.10.20 |
정규표현식 (0) | 2023.10.17 |
포함관계와 추상화 구현 순서 (0) | 2023.10.16 |
추상 클래스와 인터페이스 비교 (0) | 2023.10.16 |