- @참고: https://www.holaxprogramming.com/2013/07/20/java-jvm-gc/
Garbage Collection 이란
Garbage Collector 가 Heap 영역의 메모리에서 reference 되지 않는 인스턴스에 대해 할당된 메모리를 해제하는 행위이다.
Heap 영역의 구분
이때 효율성을 위해 "젊은 객체" 와 "오래된 객체" 를 나누는데
Heap에서는 이를
Young Generations: Eden | Servivor 0 | Servivor 1 의 영역으로 구성되고
Old Generation
과 같이 구분한다.
Young Generations 에서는 Minor GC, Old Generation에서는 Major GC 가 발생하는데,
Major GC는 Minor GC에 비해 10배 정도 더 걸리므로, 수명이 짧은 객체는 Young Generation에서 빨리 제거해주어 Old Generation 에 최대한 객체가 쌓이지 않도록 하는것이 효율성을 위한 방향이다.
Sun JVM의 경우의 Garbage Collection 과정을 살펴보면
Minor GC의 경우에
1. 최초의 객체는 Young Generations의 Eden 에서 생성되고
2. Eden 이 꽉 찰경우 Minor GC가 발생하여
참조가 없는 객체를 제거 후 살아남은 객체를 비어있는 공간(To Space), 여기서는 Servivor0 라 하면 Servivor0 로 이동한다.
Servivor1(From Space) 에 존재하는 객체에 대하여 살아남은 객체도 Servivor0(To Space)으로 이동하고, 그중 나이가 많은 객체는 Old Generation으로 이동한다.
즉, Eden이 비워지며, 나이가 있는 객체는 Servivor0 또는 Old Generation 으로 이동되어 Servivor1도 비워진다.
Major GC의 경우에
Old Generation 이 가득 차게 되는 경우 Stop The World 를 한다.
GC를 실행하기 위한 Thread를 제외하고 이외의 모든 Thread는 멈춘 후 GC 완료 후 다시 Thread를 실행시킨다.
이는 성능에 악영향을 주므로
JVM의 Memory 구성이 중요한데
Young Generation 은 전체 Heap의 1/2보다 약간 적게, Survivor Space는 Young Generation의 1/8 정도의 크기가 적당하다.
JVM Default 의 경우는 Young Generation 이 적게 잡혀있으므로 젊은 객체가 Old Generation으로 넘어갈 확률이 커진다. 따라서 조정을 위한 별도의 Option은 아래와 같다.
$ java -Xms=256m -Xmx=1536m -XX:NewSize=32m -XX:MaxNewSize=512m -XX:NewRatio=2 -XX:SurvivorRatio=8 MyApp
- -Xms, -Xmx: Heap 사이즈 최소, 최댓값
- -XX:NewSize: Young Generation 영역의 초기 사이즈
- -XX:MaxNewSize: Young Generation 영역의 최대 사이즈
- -XX:NewRation: 위와 같을 경우 Old Generation은 Young Generation 의 2배 크기를 갖는다.
- -XX:ServivorRation: 위와 같을 경우 Young Generation은 Survivor Space 의 8배 크기를 갖는다.
적합한 GC 옵션은
각 WAS 에서 생성하는 객체의 크기, 생존 주기, 스레드 개수 등에 따라 달라 질 수 있으므로 지속적인 모니터링을 통해 해당 서비스에 가장 적합한 값을 찾을 수 있다.
아래는 Heap 모니터링을 하기 위한 참조 링크이다.