Text Blocks (Preview)
기존에는 여러 줄 문자열을 작성할 때 \n 같은 이스케이프 문자를 사용해야 했지만, 이제 """를 사용하여 더 간결하게 작성할 수 있습니다. 이 기능은 특히 HTML, JSON과 같은 여러 줄 문자열을 다룰 때 유용합니다.
/**
* Java 13
*
* textBlocks
*/
public class Java13 {
public static void main(String[] args) {
textBlock();
}
private static void textBlock() {
String textBlock = """
first text
second text
final text
""";
System.out.println(textBlock);
}
}
Dynamic CDS Archives
Java 12에서 적용된 CDS가 13에선 동적 클래스들도 적용할 수 있게 변경되었습니다.
기존의 CDS는 JVM 실행 시 정적(고정)으로 아카이브 파일을 생성해야 했고, 이 아카이브 파일은 JVM 시작 시 참조되었습니다. 하지만 애플리케이션에서 동적으로 로드된 클래스들은 정적 CDS 아카이브에 포함되지 못했기 때문에 그 부분에서 제약이 있었습니다.
사용 방법
- 동적 아카이브 생성: Java 13에서는 -XX:ArchiveClassesAtExit 옵션을 사용하여 JVM 종료 시 아카이브를 생성할 수 있습니다.
java -XX:ArchiveClassesAtExit=dynamic-cds.jsa -cp myapp.jar MyApplication
- 이 명령은 MyApplication이 종료될 때 로드된 클래스를 기반으로 dynamic-cds.jsa라는 이름의 CDS 아카이브를 생성합니다.
적용 가능한 JVM 환경
동적 CDS 아카이브는 주로 서버 애플리케이션이나 클라우드 기반 서비스에서 유용합니다. 여러 인스턴스가 동일한 클래스를 사용하면서도 각기 다른 시점에서 클래스를 로드하는 경우, 동적 CDS 아카이브를 사용하면 메모리 절감과 성능 향상 효과가 큽니다.
CDS 아카이브는 보통 파일 시스템의 특정 위치에 저장되며, 여러 JVM 인스턴스가 공유 파일로서 이 아카이브를 사용할 수 있습니다. 이 공유 아카이브 파일은 메모리 매핑(Memory Mapping) 방식으로 읽혀져, 메모리 사용을 최적화하고 JVM의 시작 시간을 단축시킵니다.
메모리 매핑 기법과 기존방식의 차이는?
메모리 매핑 기법(Memory Mapping)과 기존 방식의 차이는 파일을 읽고 메모리에 로드하는 방법에 있습니다. 메모리 매핑은 파일 I/O를 메모리 관리와 결합한 효율적인 기법으로, 운영 체제의 가상 메모리를 사용하여 파일을 메모리에 로드하고 필요한 데이터를 사용할 때만 메모리에 매핑합니다.
1. 기존 방식(파일 I/O 방식):
- 읽기/쓰기 방식: 파일을 읽을 때는 보통 파일의 내용을 한 번에 전부 메모리에 로드해야 합니다.
- 파일의 크기가 크면 전체 데이터를 메모리에 올려야 하므로 메모리 부담이 큽니다.
- 이 방식은 파일을 직접 읽고 쓸 때 시스템 콜이 발생하여 속도가 느려질 수 있습니다.
2. 메모리 매핑 방식:
- 부분 로딩: 메모리 매핑은 파일을 한꺼번에 메모리에 로드하지 않고, 파일을 가상 메모리와 연결한 후, 프로그램이 필요한 부분만 메모리에 올립니다. 즉, 실제로 필요한 데이터만 사용할 때 메모리에 매핑하여 불러옵니다.
- 속도: 메모리 매핑은 운영 체제의 가상 메모리 매핑 기법을 이용해, 파일의 일부만 메모리에 올려두고, 나머지는 필요할 때마다 동적으로 메모리에 로드됩니다. 이 방식은 디스크와 메모리 간의 I/O 작업을 최소화할 수 있어 성능이 크게 향상됩니다.
- 파일 공유: 여러 프로세스가 동일한 파일을 읽고 있을 경우, 메모리 매핑을 통해 공유된 메모리에 접근하게 되어, 같은 파일을 여러 번 로드할 필요가 없습니다.
메모리 매핑의 장점:
- 효율성: 큰 파일을 처리할 때 메모리 매핑을 사용하면, 필요한 부분만 메모리에 로드하므로 메모리 사용량을 줄일 수 있습니다.
- 속도 향상: 파일 I/O와 메모리 매핑을 결합하면 파일을 더 빠르게 읽을 수 있습니다. 디스크로부터 데이터를 읽어오는 대신, 가상 메모리에서 필요한 데이터를 가져오기 때문에 파일 로딩 속도가 빨라집니다.
- 프로세스 간 메모리 공유: 동일한 파일을 여러 JVM 인스턴스가 사용할 때, 메모리 매핑을 통해 여러 프로세스가 같은 메모리 공간을 공유할 수 있습니다. 이는 시스템 메모리 사용량을 절감하는 데 도움이 됩니다.
요약:
- 기존 방식: 파일을 한 번에 메모리에 모두 로드하고 처리해야 하기 때문에 메모리와 I/O 자원을 많이 소모합니다.
- 메모리 매핑 방식: 운영 체제의 가상 메모리를 이용해 파일을 메모리 공간에 매핑하고, 필요할 때만 데이터를 메모리에 로드하여 더 적은 메모리를 사용하고 빠르게 처리할 수 있습니다.
이 방식은 특히 JVM의 CDS 아카이브에서 유용하게 사용됩니다. 여러 JVM 인스턴스가 동시에 아카이브를 사용할 때 메모리 매핑 기법을 통해 같은 메모리 영역을 공유하고, 필요할 때만 메모리 리소스를 사용하게 됩니다.
ZGC 개선
GC에 대한 기본적인 설명 https://cano721.tistory.com/200#ZGC
ZGC는 11부터 생겨서 업데이트되고 있는 GC입니다.
12에서 G1GC의 개선이 이루어졌듯이 동일한 개선이 이루어졌습니다.
동작 방식:
- ZGC는 사용하지 않는 힙 메모리 영역을 추적하여, 일정 시간이 지나면 이를 메모리 페이지 단위로 운영 체제에 반환합니다.
- 반환된 메모리는 운영 체제가 다른 프로세스에서 사용할 수 있게 되어, 전체 시스템 메모리 사용량이 줄어듭니다.
- 이 과정은 ZGC의 가비지 수집 과정에서 이루어지며, 애플리케이션의 성능에 미치는 영향을 최소화하도록 설계되었습니다.
기대 효과:
- 메모리 사용 최적화: 애플리케이션이 더 이상 사용하지 않는 메모리를 운영 체제에 반환함으로써, 메모리 낭비를 줄일 수 있습니다.
- 장기 실행 애플리케이션: 특히 서버나 장기 실행 애플리케이션에서, 일시적으로 메모리를 많이 사용했다가 다시 필요하지 않은 경우가 자주 발생할 수 있습니다. 이때 ZGC는 사용하지 않는 메모리를 운영 체제에 반환하여 다른 애플리케이션이나 프로세스가 사용할 수 있도록 합니다.
- 시스템 자원 효율화: 메모리 반환을 통해, 동일한 시스템에서 여러 애플리케이션이 더 적은 리소스로 효율적으로 실행될 수 있습니다.
ZGC와 메모리 반환 과정의 특징:
- 비동기 방식: 메모리 반환은 ZGC의 가비지 수집과 독립적으로 수행될 수 있으며, 애플리케이션의 작업을 중단하지 않습니다.
- 자동화: 개발자가 별도로 메모리 반환을 요청할 필요 없이, ZGC가 자동으로 해제된 메모리를 감지하고 운영 체제에 반환합니다.
요약:
JEP 351은 ZGC에서 사용하지 않는 메모리를 운영 체제에 신속하게 반환할 수 있는 기능을 추가하여, 메모리 효율성을 크게 개선했습니다. 이를 통해 장기 실행 애플리케이션이나 메모리 집약적 애플리케이션에서 메모리 관리 성능을 최적화할 수 있습니다.
'Language > Java' 카테고리의 다른 글
[Java] Java 버전별 특징 : Java 15 (sealed class, hidden classes) (1) | 2024.10.08 |
---|---|
[Java] Java 버전별 특징 : Java 14 (Record, instanceof 개선, NPE 개선) (0) | 2024.10.06 |
[Java] Java 버전별 특징 : Java 12 (Switch Expressions with yield, G1GC 개선, 더 빠른 시작시간 및 메모리 최적화) (0) | 2024.10.05 |
[Java] Garbage Collection(GC) 가비지 컬렉션 (0) | 2022.04.03 |
[Java] 자바 스트림(stream) 사용법 3 - 최종 연산 (0) | 2022.03.16 |
댓글