Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- NotBlank
- 플라이웨이트
- NotEmpty
- springboot
- Spring Boot
- SQL 삽입 공격
- 트랜잭션
- JPA
- @ControllerAdvice
- Service Locator 패턴
- Web
- Effetive Java
- Service Locator
- 이펙티브 자바
- FCM
- multi module
- Firebase
- 디자인 패턴
- Connection Pool
- Item04
- Effective Java
- db
- @MockBean
- @Valid
- java
- @SpyBean
- deleteById
- 데이터베이스
- restTemplate
- Proxy Patter
Archives
- Today
- Total
NoTimeForDawdling
가비지 컬렉션(Garbage Collection) 본문
들어가기
- C나 C++에서는 OS레벨에서 메모리에 직접 접근하기 때문에 메모리를 명시적으로 해제해줘야 합니다.
- 그렇지 않으면 memory leak(누수현상)이 발생하게 되며, 현재 실행 중인 프로그램에서 memory leak이 발생하면 다른 프로그램에도 영향을 끼칠 수 있습니다.
- Java는 OS의 메모리 영역에 직접적으로 접근하지 않고, JVM이라는 가상 머신을 이용해서 간접적으로 접근합니다.
- JVM은 오브젝트가 필요해지지 않는 시점에서 알아서 메모리를 확보합니다.
- Java는 가상머신을 사용하여 운영체제로부터 독립적입니다. 그렇기 때문에 OS레벨에서의 memory leak는 불가능하게 된다는 장점이 있습니다.
- Java가 메모리 누수현상을 방지하는 또 다른 방법이 Garbage Collector 입니다.
GC란?
- 주소를 잃어버려서 사용할 수 없는 메모리를 말합니다.
- 즉, 정리되지 않은 메모리를 뜻합니다.
- GC는 프로그래머가 힙을 사용할 수 있는 만큼 자유롭게 사용하고, 더 이상 사용되지 않은 오브젝트들은 가비지 컬렉션을 담당하는 프로세스가 자동으로 메모리에서 제거하도록 하는 것입니다.
- C++과 같은 언어에서는 사용하지 않은 객체의 메모리는 직접 해제해줘야 하지만 자바는 GC가 알아서 해주기 때문에 굉장히 편리한 장점이 있습니다.
언제 실행되나?
- JVM은 OS에게 메모리를 부여받고 프로그램들을 실행시킵니다. 그러다 메모리가 부족해지면 OS에게 추가로 메모리를 더 요청하게 됩니다.
- 여기서 메모리를 더 달라고 요청할 때 GC가 실행됩니다.
GC의 대상은?
- GC는 가비지 객체를 판별하기 위해 reachability라는 개념을 사용합니다.
- 어떤 객체에 유효한 참조가 있으면 reachable
- 참조가 없으면 unreachable, 이 객체를 GC의 대상으로 간주
- 여기서 말하는 reachable은 Stack에서 Heap 영역의 객체에 대해 참조할 수 있는가를 얘기합니다.
JVM의 메모리 영역에 대해 알고 있다면 좀 더 이해하기 쉬울 것 같습니다.
GC과정 (Mark and Sweep)
- Mark: JVM의 GC가 Stack영역의 모든 변수를 스캔하면서 각각 어떤 오브젝트를 Reference(참조)하고 있는지 찾는 과정
- marking 작업을 위해 모든 스레드가 중단됩니다. 이를 stop the world라고 부르기도 합니다.
- Sweep: mark 되어있지 않은 모든 오브젝트들을 Heap에서 제거하는 과정
만약 Heap에 garbage만 가득하다면 Mark 하는 과정 없이 제거 과정이 즉각 이뤄집니다.
'Java' 카테고리의 다른 글
Enum 클래스 파헤치기 (0) | 2021.02.23 |
---|---|
[Java] 불변 리스트(Immutable ArrayList) (0) | 2021.02.15 |
Arrays.asList() (0) | 2021.02.15 |
Wrapper class Cache 파헤치기 (0) | 2021.02.13 |
Java Virtual Machine(JVM) (0) | 2021.02.13 |