avatar
Steady

[Java] 간단한 자바 성능 튜닝

Java
2 months ago
·
6 min read

1874

어디에 쓰이나?


서버 내에서 동영상과 이미지 파일들을 처리하다보니 메모리를 많이 사용해서 그런지 응답시간이 눈에 띄게 느려진 것을 느끼게 되었다. 서버의 메모리는 충분했지만 내가 잘못 사용하고 있는건 아닌가 싶어 자바 애플리케이션 튜닝에 대해 알아보게 되었다.

자바 튜닝에 쓰이는 주요 조정 항목


1. 힙 메모리

: 힙 메모리는 자바 애플리케이션이 실행되는 동안 동적으로 생성되는 객체를 저장하는 영역으로 코드를 수행시 필요한 따라 메모리를 할당해 이용하게된다.

  • 힙 메모리 증가의 장점

    • 많은 객체를 한 번에 생성하고 유지할 수 있다.

    • 힙 메모리가 가득 차면 GC(가비지 컬렉터)가 실행되는데, 힙 크기를 적절히 설정하면 잦은 GC 호출로 인한 응답 지연을 줄일 수 있다.

    • 메모리 부족으로 인한 OutOfMemoryError 발생 가능성을 낮춘다.

  • 힙 메모리 설정하여 Java 파일 실행

//초기 힙메모리(Xms, 4GB), 최대 힙메모리(Xmx, 8GB)로 설정함
java -Xms4g -Xmx8g -jar application.jar        

: 설정하지 않을 경우 Xms(256MB 또는 512MB), Xmx(1GB) 정도로 설정되기 때문에

RAM에 여유가 있다면 자바 파일을 실행할때 적당히 설정해주는것이 좋다.

Tip: 초기 메모리와 최대 메모리를 동일하게 설정하면, 메모리 확장 과정에서 발생할 수 있는 불필요한 메모리 낭비를 방지할 수 있다.

2. 가비지 컬렉터(GC)

: 가비지 컬렉터(GC)는 힙 메모리를 차지하고 있는 불필요한 객체를 자동으로 식별에 메모리를 회수하는 역할을 하며, 개발자가 메모리를 직접 관리하지 않아도 되어서 메모리 누수를 예방해준다.

청소부(GC)가 쓰레기를 치우는 동안 길가(서버)가 통제되니 일 잘하는 청소부로 잘 고르는 것이 좋다.

  • GC 알고리즘 종류와 특징

    • Serial GC (단일 가비지컬렉터)

      • 단일 스레드를 사용하여 GC를 수행한다.

      • 적은 메모리와 CPU 코어를 가진 애플리케이션에 적합하다.

      • GC 수행 시 지연 시간이 긴 편이다.

    • Parallel GC (병렬 가비지컬렉터)

      • 여러 스레드를 사용해 GC를 병렬로 수행한다.

      • 멀티코어 환경에서 성능이 좋지만, STW(Stop-The-World) 시간이 상대적으로 길 수 있다.

    • G1 GC (Garbage First GC) : Java 9 이상에서 기본으로 사용됨

      • Young과 Old 영역을 조각내어 관리하고, 각 조각을 효율적으로 청소한다.

      • 큰 힙을 사용하는 애플리케이션에 적합하며, 응답 지연을 최소화하도록 설계되었다.

    • ZGC (Z Garbage Collector)

      • 매우 짧은 지연 시간을 목표로 설계된 GC.

      • 큰 용량의 메모리를 처리하는 데 장점을 가졌다.

      • 자바 JDK 11 이상에서 사용 가능하며, Generational ZGC가 추가되어 개선되었다.

    • Shenandoah GC

      • 비슷한 수준의 저지연 시간을 제공하며, ZGC와 유사함.

      • 메모리 해제를 비동기적으로 수행해 메모리 사용률이 높더라도 효율적으로 회수한다.

      • 자바 JDK 12 이상에서 사용 가능하며, JDK 14에서 안정적으로 구현되었다.

  • 가비지 컬렉터 설정하여 Java 파일 실행

// GC를 Generational ZGC로 설정함.
java -XX:+UseZGC -XX:+ZGenerational -jar application.jar  

: 설정하지 않으면 Parrallel GC를 사용하고 Java 9 이후에는 기본값으로 G1 GC를 사용하게 된다.

G1 GC도 일반적인 서버에서는 충분하지만 GC 로그를 모니터링해 지연 시간이 늘어나는 구간이 많다면 변경해 주는 것이 좋다.

돌아보며


사실 오늘 서버 튜닝에 대해 찾아보다 보니 지금 작성한 글은 너무 간단한 내용이구나 싶어 적을까 말까 고민하긴했다.

하지만 이런 별거 아닌것 같은 내용도 몰랐던 나를 반성하며 다음에는 다른 방법의 튜닝들도 더 자세히 다루어 볼까 한다.







여기서는 꾸준해보자