-
Managed Language 자바, 자바는 어떻게 힙에서 제거할 객체를 알아낼까?TECH/Java 2022. 11. 29. 11:23
Managed Language Java
- vm은 객체가 더 이상 필요 없을 때 메모리를 회수한다.
프로그래머가 직접 메모리를 해제해야 하는 다른 언어와 가장 큰 차이점이다. - 자바에서 메모리 leak이 발생하는 것은 불가능하다.
자바에서 new 키워드를 사용할 경우 os에서 메모리를 가져오는 것이 아니라 virtual machine을 통해서 가져오게 된다. virtual machine은 c로 작성된 프로그램이고, 이 프로그램이 os에서 가져온 메모리를 관리한다. 따라서 vm에 문제가 없다면, os 레벨의 메모리 leak은 발생할 수 없다. 메모리 leak이 발생했다면 그것은 vm의 문제이고 자바 프로그래머의 책임이 아니다. - GC는 메모리를 free up하는 과정이다.
GC는 Lisp에서 개발되었고, 자바는 gc의 개념을 더 널리 퍼지게 했다. gc는 프로그래머가 힙에 할당된 객체에 대해 요청을 하고 더 이상 필요로 하지 않을 때에는 free를 할 필요가 없는 개념이다. 대신, 자동 프로세스가 힙을 분석하고 불필요한 객체를 삭제한다.
자바는 어떤 객체가 힙에서 제거 될지 어떻게 알까?
자바는 굉장히 단순한 규칙을 통해 더 이상 필요 없는 개체를 알아낸다.
- 스택 or 메타 영역(스태틱 객체의 경우)에서 접근할 수 없는 레퍼런스는 가비지 컬렉션의 대상이 된다.
- 힙에서 unreachable한 객체는 가비지 컬렉션의 대상이 된다.
레퍼런스 되지 않는 객체가 가비지 컬렉션의 대상이 된다는 말은 정확하지 않다. 예를 들어 다음과 같은 케이스가 있다.
String foo와 String bar는 heap 내의 list에서 참조하고 있다. 하지만 list는 stack(혹은 메타 영역)에서 참조되고 있지 않기 때문에 가비지 컬렉션의 대상이 된다.
참고
Udemy - Java Application Performance Tuning and Memory Management'TECH > Java' 카테고리의 다른 글
Singleton Pattern이란? (0) 2022.12.16 Java String Pool이란? (0) 2022.11.17 Mono.zipWith 혹은 Mono.zipWhen이 호출되지 않을 때 (0) 2022.10.23 JVM 메모리 - heap, stack (0) 2022.08.07 Slack api 호출시 account_inactive 에러가 발생하는 경우 (0) 2022.02.05 - vm은 객체가 더 이상 필요 없을 때 메모리를 회수한다.