영감을 (inspire) 주고픈 개발 블로그

서버 개발자가 알아야 하는 JVM 개념과 설정들 본문

개발/디테일

서버 개발자가 알아야 하는 JVM 개념과 설정들

inspire12 2025. 2. 27. 01:07

1. 메모리 관리 설정

  • 힙 메모리 설정 (-Xms, -Xmx):
    • -Xms는 초기 힙 크기를, -Xmx는 최대 힙 크기를 지정합니다.
    • 애플리케이션의 메모리 요구량과 GC 빈도에 따라 적절하게 조정하여 OutOfMemoryError를 예방합니다.
  • Young Generation 관련 옵션:
    • -Xmn: Young Generation(신세대) 영역의 크기를 명시적으로 설정합니다.
    • -XX:NewRatio: Old Generation과 Young Generation의 비율을 조정해 힙 구조를 최적화합니다.
    • -XX:SurvivorRatio: Eden과 Survivor 영역의 비율을 설정하여 Minor GC 효율을 높입니다.
  • 컨테이너 환경 지원:
    • -XX:+UseContainerSupport (Java 8u191 이상) 또는 최신 JDK에서는 -XX:MaxRAMPercentage/-XX:MinRAMPercentage 옵션을 활용하여, 컨테이너의 메모리 제한을 인식하고 이에 맞게 힙 크기를 자동 조정할 수 있습니다.

2. 가비지 컬렉션(GC) 설정

  • GC 알고리즘 선택:
    • -XX:+UseG1GC: 서버 환경에서 많이 사용되는 G1 GC는 낮은 일시 중지 시간과 높은 처리량을 목표로 합니다.
    • -XX:+UseZGC 또는 -XX:+UseShenandoahGC: 대용량 힙과 극한의 낮은 지연 시간이 필요한 경우 선택합니다.
  • GC 튜닝 옵션:
    • -XX:MaxGCPauseMillis: GC 일시 중지 시간을 목표로 설정하여 응답성을 제어합니다.
    • -XX:+DisableExplicitGC: 명시적인 System.gc() 호출을 무시해 불필요한 GC를 방지합니다.
    • -XX:+HeapDumpOnOutOfMemoryError: OOM 발생 시 힙 덤프를 생성해 문제 진단에 활용할 수 있습니다.
    • -Xlog:gc: GC 로그를 활성화하여 GC 활동을 모니터링하고 튜닝에 참고합니다.
    • -XX:ParallelGCThreads-XX:ConcGCThreads: 병렬 및 동시 GC 스레드 수를 조정해 GC 성능을 최적화합니다.

3. JIT 컴파일러 및 최적화 설정

  • Tiered Compilation 활성화:
    • -XX:+TieredCompilation 옵션은 인터프리터와 JIT 컴파일러의 장점을 결합하여, 자주 실행되는 코드를 네이티브 코드로 컴파일해 성능을 개선합니다.
  • 컴파일 임계치 설정:
    • -XX:CompileThreshold: 특정 메서드가 JIT 컴파일되기 전에 호출되어야 하는 횟수를 지정합니다.

4. 네트워크 및 DNS 관련 설정

  • DNS 캐싱 TTL:
    • networkaddress.cache.ttl 시스템 속성을 설정하면 JVM이 DNS 조회 결과를 일정 시간(예: 5초) 동안 캐싱하도록 할 수 있습니다.
    • 이는 AWS와 같이 IP 주소가 자주 변경되는 환경에서 최신 IP 정보를 반영하는 데 유용합니다.

5. 스레드 관련 설정

  • 스레드 스택 크기:
    • -XX:ThreadStackSize: 각 스레드에 할당되는 스택 크기를 조정해 메모리 사용량을 최적화할 수 있습니다.
    • 예를 들어, -XX:ThreadStackSize=512k 로 설정하여 과도한 스택 메모리 사용을 방지할 수 있습니다.

 

6. 디버깅 및 모니터링 옵션

  • 디버깅/에러 로그:
    • -XX:ErrorFile: 치명적인 오류 발생 시 에러 로그 파일의 위치를 지정합니다.
  • GC 로그 및 힙 덤프 옵션:
    • -Xlog:gc: GC 활동 로그를 자세하게 출력해 GC 튜닝과 문제 진단에 도움을 줍니다.
    • -XX:+HeapDumpOnOutOfMemoryError: OOM 발생 시 힙 덤프를 생성하여 원인 분석에 활용합니다.

 

7. 기타 고려 사항

  • 명시적 GC 호출 제어:
    • -XX:+DisableExplicitGC: 애플리케이션 내에서 System.gc() 호출이 성능 저하를 유발할 수 있으므로 이를 비활성화합니다.
  • 문자열 중복 제거:
    • -XX:+UseStringDeduplication: G1 GC 사용 시, 동일한 문자열 인스턴스의 중복을 제거해 메모리 사용 효율을 높입니다.
  • JVM 시작 옵션을 환경별로 구분:
    • 운영 환경, 테스트 환경, 컨테이너 환경 등 각 상황에 맞춰 위 옵션들을 조합하여 최적의 JVM 환경을 구성하는 것이 중요합니다.
반응형