https://velog.io/@jsj3282/17.-도대체-GC는-언제-발생할까
mark and sweep

저장공간을 쓱 훑으면서 현재 사용중인 공간들은 마크하고
마크 안된것들 반환
rechable, unreachable

reference counting 참조 카운팅
요소마다의 참조 횟수를 세어서
참조가 0인 요소는 반환
예전 자바는 프로그램 멈추고 GC 돌고 그래서 몇초씩 멈추고 그랬음
요즘 자바는 프로그램 작동에 지장 없도록 멀티쓰레드로 작동
그럼에도… 한계
지워야 할 것들을 100퍼센트 잡아내진 못한다
즉 그럼에도 memory leak은 결국 어디선가 일어난다…
그래서 애초에 Memory leak이 일어나지 않도록 코드를 짜는 습관을 만들어야 한다
어떤 memory leak 방지 방식이
여기서는 효과적이지만
저기서는 성능만 저하시키는 방식일 수도…
각자가 사용하는 언어나 플랫폼, 기기마다 가장 최적화된 메모리 관리 방식을 알아둘 필요가 있다.
가장 보편적인 팁
순환참조 하지 말 것
변수들이 서로를 참조한다면 레퍼런스 카운팅이 0이 되지 않는다.
무한루프
public class Chicken {
@Autowired
Egg egg;
public void layEgg(){
egg.becomeChicken();
}
}
public class Egg {
@Autowired
Chicken chicken;
public void becomeChicken() {
chicken.layEgg();
}
}
public CommandLineRunner run(Chicken chicken, Egg egg) throws Exception {
return (String[] args) -> {
chicken.layEgg(); // 실행
};
}
// GC에 잡히지 않는 문제도 있지만
// 애초에 이런 방식이면 Stack이 점점 쌓이다가 StackOverflow하여 프로그램 터짐
메모리 누수를 잡으려면
디버깅 툴 활용
구글링
heap dump를 떠서 분석툴을 이용한 분석