-
[Java] GC 종류별 메모리 상황에 따른 테스트Computer Science/Java 2024. 2. 8. 17:40
특정 job 에 대해서 메모리를 설정해야하는데 이때 한번 GC를 종류별로 돌려보며 테스트를 해보았습니다.
다만 해당 job이 매우 짧게 끝나기도 하고 메모리를 적게 사용하며 CPU 사용율 등을 자세하게 확인하지 않았기에 가볍게 봐주시면 감사하겠습니다.
테스트 환경은 Java17에 OpenJDK 이며 모니터링으로는 VisualVM + VisualGC 와 jstat을 사용하였습니다.
비교한 GC는 SerialGC, ParallelGC, G1GC, ZGC로 Java17에서 지원하는 GC들 입니다. ShenandoahGC는 테스트하지 않았습니다.
목차
- 15MB [-Xms15m -Xmx15m]
- 50MB [-Xms50m -Xmx50m]
- 100MB [-Xms100m -Xmx100m]
- 결론
15MB [ -Xms15m -Xmx15m ]
Oracle에서도 100m 이하일때 SerialGC를 추천하는 이유가 확실히 보였습니다. 전체 GC시간이 가장 적은것이 SerialGC 였습니다.
극단적으로 메모리를 낮추어봤을 때 예상외로 G1GC의 성능이 ParallelGC보다 좋았습니다.
ZGC는 OutOfMemory 발생으로 실행조차 되지 않았습니다.
SerialGC
ParallelGC
G1GC
ZGC
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
50MB [ -Xms50m -Xmx50m ]
Job이 필요로 하는 메모리가 적어서 그런지 여기서부터는 이제 큰 차이를 보이지 않았습니다.
다만 ZGC가 사용가능해진 시점으로 ZGC는 확실히 다른 GC들에 비해 GC 시간이 현저히 적었고 SerialGC는 많았습니다.
평균적으로 사용하는 메모리는 SerialGC와 ParallelGC에 비해 ZGC와 G1GC가 확실히 많이 사용하는 것을 확인할 수 있었습니다.
SerialGC
ParallelGC
G1GC
ZGC
100MB [ -Xms100m -Xmx100m ]
50m와 크게 다를게 없어보입니다.
ZGC는 여전히 가장 빠른 GC 시간을 보여주며 SerialGC는 여전히 느린 것을 확인할 수 있었습니다.
SerialGC와 ParallelGC의 평균 메모리가 G1GC와 ZGC에 비해 덜 사용하는 것도 확인할 수 있었습니다.
SerialGC
ParallelGC
G1GC
ZGC
결론
빡빡하게 테스트 환경을 조성하지 않았고, 적은 메모리 만으로도 비교해 보았음에도 각 GC의 특징이 대략적으로나마 보이는 것이 신기하였습니다.
ZGC는 메모리를 확실히 많이 차지하는 한편 압도적인 GC 시간을 보여주었고, SerialGC와 ParallelGC는 상대적으로 적은 메모리 사용률을 보여주며 메모리에 여유가 생기자 ParallelGC가 SerialGC보다 더 나은 성능을 보여주는 것도 확인하였습니다.
더 세밀하게 들어가면 GC 튜닝 등 과정이 들어가겠지만, 이정도 Job에서는 너무 오버엔지니어링 같고 필요성이 느껴지면 그때 학습하여 적용하는 것이 좋겠다는 생각하에 여기서 마무리하려고 합니다.
다만 어떠한 작업을 하고 나서는 반드시 GC에 대해 고민정도는 해야겠다는 생각이 확고하게 드는 테스트였습니다.
'Computer Science > Java' 카테고리의 다른 글
[Java] 버전별 GC 목록 ( OpenJDK ) (0) 2024.02.07 [JAVA] JVM 동작 방식 (1) 2024.02.06 Mac 터미널 java version 임시 변경 (0) 2022.11.10 SOLID (0) 2022.10.05 open-jdk-17 설치. (0) 2022.07.27