본문 바로가기
Language/Java

[Java] Java 버전별 특징 : Java 12 (Switch Expressions with yield, G1GC 개선, 더 빠른 시작시간 및 메모리 최적화)

by 계범 2024. 10. 5.

Switch Expressions (Preview)

/**
 * Java 12 - Switch Expressions (Preview -> 13에서 반영)
 * yield 처리
 *
 * yield: switch 표현식에서만 사용되며, 특정 case 블록에서 값을 반환하지만 실행 흐름을 종료하지 않고,
 * switch 표현식의 결과로 값을 반환하는 역할을 합니다.
 */
public class Java12 {
    public static void main(String[] args) {
        originSwitch();
        Java12Switch();
    }

    private static void originSwitch() {
        int day = 2;
        String dayString = "";

        switch (day){
            case 1:
                dayString = "Monday";
                break;
            case 2:
                dayString = "Tuesday";
                break;
            case 3:
                dayString = "Wednesday";
                break;
            default:
                dayString = "Invalid day";
                break;
        }

        System.out.println(dayString);
    }
    private static void Java12Switch() {
        int day = 2;

        String dayString = switch (day) {
            case 1 -> "Monday";
            case 2 -> "Tuesday";
            case 3 -> "Wednesday";
            default -> "Invalid day";
        };

        System.out.println(dayString);
    }

}

 

G1GC 개선

GC에 대해 기본적인 정리 글. https://cano721.tistory.com/200

 

[Java] Garbage Collection(GC) 가비지 컬렉션

Garbage Collection이란 Java Application은 JVM위에서 구동되고, JVM이 Java Application에서 사용되는 메모리들을 관리한다. 이 JVM의 기능 중 하나로 더 이상 사용하지 않는 메모리를 청소하여 메모리 공간을

cano721.tistory.com

 

JEP 346: G1 가비지 수집기에서 사용하지 않는 메모리의 신속한 반환

https://openjdk.org/jeps/346

 

JEP 346에서 G1 GC가 사용하지 않는 메모리를 즉시 반환할 수 있게 만들었습니다. 이를 통해 시스템 메모리의 효율적인 사용이 가능해졌고, 메모리가 부족한 환경에서 더욱 효과적입니다.

  • 언제 메모리를 반환하는가: G1 GC가 유휴상태나 부하가 적은 상태에, 즉 시스템 자원을 덜 사용하는 시간대에 메모리를 반환합니다. 이것은 애플리케이션의 성능에 영향을 주지 않으면서도 메모리 효율을 개선하는 방법입니다.

JEP 344: G1 가비지 수집기의 혼합 수집 중단 기능

https://openjdk.org/jeps/344

 

G1 GC에서는 **혼합 수집(mixed collection)**이라는 작업이 있습니다. 이 작업은 Young 영역(최근에 생성된 객체들이 위치한 메모리 영역)과 Old 영역(오랫동안 사용된 객체들이 저장된 영역)을 함께 수집하는 과정입니다.

 

문제점: 혼합 수집은 경우에 따라 시간이 오래 걸리거나 많은 시스템 자원을 소모할 수 있습니다. 만약 이 과정이 예상보다 길어지면 애플리케이션의 성능에 영향을 미칠 수 있습니다.

 

JEP 344의 개선:Java 12에서는 혼합 수집을 중단할 수 있는 기능이 추가되었습니다. 만약 G1 GC가 혼합 수집 작업을 수행하는 도중 시간이 너무 오래 걸리거나, 시스템 자원을 과도하게 사용하고 있다고 판단되면, GC 작업을 중단하고 다음 GC 주기로 넘깁니다.

  • 장점: 애플리케이션 성능에 미치는 영향을 최소화할 수 있고, 긴 GC 중단 시간을 방지할 수 있습니다.

 

더욱 빠른 시작 시간 및 메모리 최적화

JEP 341: Default CDS Archives (기본 클래스 데이터 공유 기능)

 

CDS(Class Data Sharing)클래스 데이터 공유 기능입니다. 이 기능은 Java 애플리케이션의 시작 속도를 개선하고, 메모리 사용을 줄이는 역할을 합니다.

 

기본 개념:

  • Java 애플리케이션은 실행 시 많은 클래스 파일을 읽어와야 합니다. 이 과정에서 파일을 로드하고 분석하는 데 시간이 걸리기 때문에 시작 속도가 느려질 수 있습니다.
  • CDS는 이러한 클래스 파일들을 미리 공유 아카이브에 저장하여, 자주 사용되는 클래스를 빠르게 로드할 수 있도록 합니다. 이를 통해 애플리케이션의 시작 속도가 빨라지고, 메모리 사용량도 줄어듭니다.

JEP 341의 개선: Java 12부터는 CDS 기능이 모든 애플리케이션에 기본적으로 활성화되었습니다. 즉, 개발자가 따로 설정할 필요 없이, Java 애플리케이션이 자동으로 이 기능을 사용하게 됩니다.

  • 효과: 자주 사용되는 JDK 클래스 파일들이 미리 로드되어 애플리케이션의 시작 시간을 줄이고, 메모리 사용을 줄입니다.

실용성: 이 기능은 대규모 애플리케이션에서 특히 유용하며, 메모리 효율성을 높여 서버 환경에서의 성능을 최적화하는 데 기여합니다.

 

실제로 어떻게 동작?

더보기
더보기
더보기
더보기

JEP 341에서 설명하는 클래스 데이터 공유(CDS, Class Data Sharing) 기능은 Java 애플리케이션의 시작 시간을 줄이고 메모리 사용을 최적화하는 기능입니다. 이 기능은 자주 사용되는 클래스 데이터를 미리 **공유 아카이브(Shared Archive)**에 저장하여, 애플리케이션이 실행될 때 빠르게 로드할 수 있도록 해줍니다.

 

공유 아카이브가 어디에 저장되는가?

 

공유 아카이브는 디스크 상에 저장된 사전 생성된 파일로, 클래스 메타데이터를 포함하고 있습니다. 보통 JDK 설치 과정에서 이 아카이브가 생성되며, 주요 JDK 클래스들(java.lang, java.util 등)의 메타데이터가 포함됩니다.

  • 기본 저장 위치: 기본적으로 공유 아카이브는 JDK 설치 디렉터리에 저장됩니다. 운영 체제에 따라 다르지만, 일반적으로 JDK의 lib 폴더 내에 위치하며, lib/modules나 lib/server 등의 경로에 있을 수 있습니다.

사전 로딩이 어떻게 이루어지는가?

 

Java 애플리케이션이 시작되면:

  1. JVM은 먼저 공유 아카이브에서 필요한 클래스 메타데이터를 찾습니다.
  2. 해당 클래스가 아카이브에 있으면, JVM은 클래스 로딩파싱 과정을 건너뛰고, 미리 준비된 메타데이터를 메모리에 직접 맵핑합니다.
  3. 이를 통해 애플리케이션 시작 과정에서 발생하는 시간과 리소스를 줄일 수 있습니다.

성능 향상의 이유

 

  • 클래스 로딩 시간 단축: 클래스 메타데이터가 이미 준비되어 있기 때문에, JVM이 클래스 파일을 디스크에서 반복적으로 로드하고 파싱할 필요가 없어 애플리케이션의 시작 시간이 단축됩니다.
  • 메모리 사용량 감소: 공유 아카이브는 메모리 맵핑 방식을 사용하여, 동일한 시스템에서 여러 JVM 프로세스가 같은 메모리 영역을 공유하게 됩니다. 이는 메모리 사용량을 줄이고 시스템 자원을 더 효율적으로 사용하게 합니다.

JEP 341의 개선점 (Java 12)

 

Java 12부터는 CDS 기능이 기본적으로 활성화됩니다. 즉, 개발자가 별도로 설정하지 않아도, 모든 Java 애플리케이션이 이 기능을 자동으로 사용하게 되며, 이는 애플리케이션 성능을 즉시 향상시킵니다.

요약하자면, 공유 아카이브는 디스크 상에 미리 생성된 파일로서, 자주 사용하는 Java 클래스의 메타데이터를 저장해두고, 애플리케이션이 시작될 때 이를 빠르게 로드하여 성능을 향상시킵니다.

 

댓글