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
JEP 346: G1 가비지 수집기에서 사용하지 않는 메모리의 신속한 반환
JEP 346에서 G1 GC가 사용하지 않는 메모리를 즉시 반환할 수 있게 만들었습니다. 이를 통해 시스템 메모리의 효율적인 사용이 가능해졌고, 메모리가 부족한 환경에서 더욱 효과적입니다.
- 언제 메모리를 반환하는가: G1 GC가 유휴상태나 부하가 적은 상태에, 즉 시스템 자원을 덜 사용하는 시간대에 메모리를 반환합니다. 이것은 애플리케이션의 성능에 영향을 주지 않으면서도 메모리 효율을 개선하는 방법입니다.
JEP 344: G1 가비지 수집기의 혼합 수집 중단 기능
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 애플리케이션이 시작되면:
- JVM은 먼저 공유 아카이브에서 필요한 클래스 메타데이터를 찾습니다.
- 해당 클래스가 아카이브에 있으면, JVM은 클래스 로딩과 파싱 과정을 건너뛰고, 미리 준비된 메타데이터를 메모리에 직접 맵핑합니다.
- 이를 통해 애플리케이션 시작 과정에서 발생하는 시간과 리소스를 줄일 수 있습니다.
성능 향상의 이유
- 클래스 로딩 시간 단축: 클래스 메타데이터가 이미 준비되어 있기 때문에, JVM이 클래스 파일을 디스크에서 반복적으로 로드하고 파싱할 필요가 없어 애플리케이션의 시작 시간이 단축됩니다.
- 메모리 사용량 감소: 공유 아카이브는 메모리 맵핑 방식을 사용하여, 동일한 시스템에서 여러 JVM 프로세스가 같은 메모리 영역을 공유하게 됩니다. 이는 메모리 사용량을 줄이고 시스템 자원을 더 효율적으로 사용하게 합니다.
JEP 341의 개선점 (Java 12)
Java 12부터는 CDS 기능이 기본적으로 활성화됩니다. 즉, 개발자가 별도로 설정하지 않아도, 모든 Java 애플리케이션이 이 기능을 자동으로 사용하게 되며, 이는 애플리케이션 성능을 즉시 향상시킵니다.
요약하자면, 공유 아카이브는 디스크 상에 미리 생성된 파일로서, 자주 사용하는 Java 클래스의 메타데이터를 저장해두고, 애플리케이션이 시작될 때 이를 빠르게 로드하여 성능을 향상시킵니다.
'Language > Java' 카테고리의 다른 글
[Java] Java 버전별 특징 : Java 14 (Record, instanceof 개선, NPE 개선) (0) | 2024.10.06 |
---|---|
[Java] Java 버전별 특징 : Java 13 (Text Blocks, Dynamic CDS Archives, ZGC 개선) (0) | 2024.10.06 |
[Java] Garbage Collection(GC) 가비지 컬렉션 (0) | 2022.04.03 |
[Java] 자바 스트림(stream) 사용법 3 - 최종 연산 (0) | 2022.03.16 |
[Java] 자바 스트림(stream) 사용법 2 - 스트림의 중간연산, Optional (0) | 2022.03.16 |
댓글