Java 애플리케이션 성능 최적화

JavaBeginner
지금 연습하기

소개

JVM 매개변수는 Java 바이트코드를 실행하는 Java 가상 머신(JVM)을 구성하는 데 사용됩니다. JVM 매개변수를 적절히 설정하면 Java 애플리케이션의 성능을 향상시킬 수 있습니다. 이 실습에서는 Java 애플리케이션의 성능을 최적화하기 위해 자주 사용되는 몇 가지 JVM 매개변수를 설정하는 방법을 배웁니다.

힙 메모리 설정

힙 메모리는 Java 객체가 할당되는 런타임 데이터 영역입니다. -Xmx-Xms 매개변수를 사용하여 힙 메모리 크기를 설정할 수 있습니다.

  • -Xmx<heap size>[unit]: 최대 힙 크기를 설정합니다.
  • -Xms<heap size>[unit]: 초기 힙 크기를 설정합니다.

예를 들어, 최소 힙 크기를 512MB로, 최대 힙 크기를 1GB로 설정하려면 다음 명령어를 사용할 수 있습니다.

java -Xms512m -Xmx1g MyApp

가비지 컬렉터 선택

가비지 컬렉션은 Java 애플리케이션에서 더 이상 사용되지 않는 객체가 차지하는 메모리를 해제하는 과정입니다. 가비지 컬렉터의 선택은 애플리케이션 성능에 상당한 영향을 미칠 수 있습니다. JVM은 각각 고유한 장단점을 가진 여러 가비지 컬렉터를 제공합니다.

  • -XX:+UseSerialGC: 단일 스레드를 사용하여 가비지 컬렉션을 수행하는 직렬(Serial) 가비지 컬렉터를 활성화합니다.
  • -XX:+UseParallelGC: 여러 스레드를 사용하여 가비지 컬렉션을 수행하는 병렬(Parallel) 가비지 컬렉터를 활성화합니다.
  • -XX:+UseParNewGC: 여러 스레드를 사용하여 동시 가비지 컬렉션을 수행하는 CMS(Concurrent-Mark-Sweep) 가비지 컬렉터를 활성화합니다.
  • -XX:+UseG1GC: 일관된 일시 중지 시간과 높은 처리량을 제공하도록 설계된 G1(Garbage-first) 가비지 컬렉터를 활성화합니다.

예를 들어, 병렬 가비지 컬렉터를 활성화하려면 다음 명령어를 사용할 수 있습니다.

java -XX:+UseParallelGC MyApp

가비지 컬렉션 활동 로깅

가비지 컬렉션 로깅을 사용하면 가비지 컬렉터의 성능을 모니터링하고 애플리케이션 요구 사항에 따라 가비지 컬렉터 매개변수를 조정할 수 있습니다. 다음 매개변수를 사용하여 가비지 컬렉션 로깅을 활성화할 수 있습니다.

  • -Xlog:gc*: 최신 Java 릴리스에서 가비지 컬렉션 로깅을 활성화합니다.
  • file=gc.log: 로그 출력을 gc.log라는 파일에 기록합니다.
  • filecount=10: 최대 10개의 순환 로그 파일을 유지합니다.
  • filesize=10M: 로그 파일이 10MB에 도달하면 파일을 교체합니다.

예를 들어, 가비지 컬렉션 로깅을 활성화하고 로그를 gc.log에 저장하려면 다음 명령어를 사용할 수 있습니다.

java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=10,filesize=10M MyApp

메모리 부족 오류 처리

JVM의 메모리가 부족하면 Out Of Memory Error가 발생합니다. 이 오류를 처리하기 위해 다음 JVM 매개변수를 사용할 수 있습니다.

  • -XX:+HeapDumpOnOutOfMemoryError: Out Of Memory Error가 발생하면 JVM이 힙 덤프를 디스크에 기록합니다.
  • -XX:HeapDumpPath=<path to heap dump file>: 힙 덤프 파일의 경로를 지정합니다.
  • -XX:OnOutOfMemoryError=<command>: Out Of Memory Error가 발생하면 JVM이 지정된 명령어를 실행합니다.
  • -XX:+UseGCOverheadLimit: JVM이 가비지 컬렉션에 소요되는 시간 제한을 설정하는 데 사용하는 옵션입니다.

예를 들어, Out Of Memory Error 발생 시 /path/to/heapdump.hprof 파일에 힙 덤프를 기록하도록 JVM을 구성하려면 다음 명령어를 사용할 수 있습니다.

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump.hprof MyApp

64비트 JVM 사용

-d 매개변수를 사용하여 32비트 또는 64비트 JVM을 선택할 수 있습니다. 예를 들어, 64비트 JVM을 사용하려면 다음 명령어를 사용할 수 있습니다.

java -d64 MyApp

JVM 매개변수를 사용하여 Java 애플리케이션 컴파일 및 실행

HelloWorld.java 프로그램을 사용하여 이전 단계에서 배운 JVM 매개변수로 Java 애플리케이션을 컴파일하고 실행해 보겠습니다.

cd ~/project
touch HelloWorld.java

다음 코드를 입력합니다.

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

파일을 저장하고 종료합니다. 이제 -Xmx 매개변수를 사용하여 코드를 컴파일하고 실행해 보겠습니다.

javac HelloWorld.java
java -Xmx512m HelloWorld

이 명령어는 최대 힙 크기를 512MB로 설정합니다. 다음과 같은 출력을 확인할 수 있습니다.

Hello, World!

가비지 컬렉터와 함께 Java 애플리케이션 컴파일 및 실행

이제 병렬 가비지 컬렉터를 사용하여 Java 애플리케이션을 컴파일하고 실행해 보겠습니다.

java -XX:+UseParallelGC HelloWorld

다음과 같은 출력을 확인할 수 있습니다.

Hello, World!

가비지 컬렉션 로깅과 함께 Java 애플리케이션 컴파일 및 실행

이제 가비지 컬렉션 로깅을 활성화한 상태로 Java 애플리케이션을 컴파일하고 실행해 보겠습니다.

java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=10,filesize=10M HelloWorld

이 명령어는 프로그램이 실행되는 동안 가비지 컬렉션 로그를 현재 디렉토리의 gc.log에 기록합니다.

자주 사용되는 다른 매개변수와 함께 Java 애플리케이션 컴파일 및 실행

이제 -XX:+UseStringDeduplication-XX:MaxHeapFreeRatio 매개변수를 사용하여 Java 애플리케이션을 컴파일하고 실행해 보겠습니다.

java -XX:+UseStringDeduplication -XX:MaxHeapFreeRatio=70 HelloWorld

이 명령어는 문자열 중복 제거(String Deduplication)를 활성화하고 가비지 컬렉션 후 여유 힙 공간의 최대 비율을 70%로 설정합니다.

요약

이번 실습에서는 Java 애플리케이션의 성능을 최적화하기 위해 다양한 JVM 매개변수를 설정하는 방법을 배웠습니다. 힙 메모리 크기 설정, 가비지 컬렉터 선택, 가비지 컬렉션 로깅 활성화, 메모리 부족 오류 처리, 64비트 JVM 사용 및 기타 자주 사용되는 매개변수 설정 방법을 익혔습니다. 또한 JVM 매개변수를 사용하여 Java 애플리케이션을 컴파일하고 실행하는 방법도 배웠습니다.