1. 개요
이 글에서는 Java 10 릴리스와 함께 제공되는 성능 향상에 대해 설명한다. 이러한 개선 사항은 JDK 10에서 실행되는 모든 응용 프로그램에 적용되므로, 이를 활용하기 위해 코드를 별도로 변경할 필요는 없다.
2. G1 가비지 컬렉터를 이용한 병렬 Full GC(Garbage Collection)
G1 가비지 컬렉터는 JDK 9부터 디폴트 GC이다. 그러나 G1을 이용한 Full GC는 싱글쓰레드 mark-sweep-compact 알고리즘을 사용했다. Java 10에서부터 병렬 mark-sweep-compact 알고리즘을 사용하도록 변경되었으며, 이는 Full GC에서의 정지시간(stop-the-world time)을 효과적으로 줄여주었다.
3. 애플리케이션 클래스 데이터 공유
JDK 5부터 도입된 클래스 데이터 공유 기능을 통해, 일련의 클래스들은 공유되는 아카이브 파일 안에 사전 처리되어 런타임에 메모리 매핑될 수 있다. 이는 스타트업 시간을 줄일 수 있으며, 여러 JVM이 같은 아카이브 파일을 공유할 경우 동적 메모리 공간을 줄일 수 잇다.
CDS(Class Data Sharing)은 오직 부트스트랩 클래스 로더에만 허용되다보니, 이 기능은 시스템 클래스에만 제한되었다. AppCDS(Application Class Data Sharing)은 기본 제공 시스템 클래스로더(즉, 앱 클래스 로더), 기본 제공 플랫폼 클래스 로더, 커스텀 클래스 로더가 아카이브 파일을 로드하는 것을 가능하게 했다. 따라서 애플리케이션 클래스에 이 기능을 사용할 수 있다.
다음 단계에 따라 이 기능을 사용할 수 있다.
3.1 아카이빙할 클래스 목록 가져오기
다음의 명령어는 HelloWorld 애플리케이션에 의해 로드되는 클래스들을 hello.lst 파일 안에 덤프한다.
$ java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst \
-cp hello.jar HelloWorld
3.2 AppCDS 아카이브 파일 생성
다음의 명령어는 hello.lst를 통해 hello.jsa를 만든다.
$ java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst \
-XX:SharedArchiveFile=hello.jsa -cp hello.jar
3.3 AppCDS 아카이브 파일 사용
다음의 명령어는 hello.jsa와 함께 HelloWorld 애플리케이션을 실행한다.
$ java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa \
-cp hello.jar HelloWorld
AppCDS는 오라클의 JDK 8 및 JDK 9용 상용 기능이었으나, 지금은 오픈 소스이며 공개적으로 사용할 수 있다.
4. 실험적인 자바 기반의 JIT(Just In Time) 컴파일러
Graal은 HotSpot JVM과 통합된 Java로 작성된 동적 컴파일러로, 고성능 및 확장성에 중점을 두고 있다. 이것은 또한 JDK 9에 도입된 실험적인 AOT(Ahead Of Time) 컴파일러의 기초이기도 하다.
JDK 10은 Graal 컴파일러를 리눅스/x64 플랫폼에서 실험적인 JIT 컴파일러로 사용할 수 있게 한다. Graal을 다음 명령어를 통해 JIT 컴파일러로 사용 가능하다.
-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
이것은 실험적인 기능이며, 현존하는 JIT 컴파일러보다 항상 더 나은 성능을 보장하지는 않는다는 것을 주의해야한다.
* 추가적인 공부가 필요해보이는 항목들 (2021/09/27)
- G1 가비지 컬렉터란 무엇인가? 가비지 컬렉팅 프로세스에 대한 이해. mark-sweep-compact 알고리즘? Full GC
- 시스템 클래스 로더와 플랫폼 클래스 로더의 차이는?
- 현존하는 JIT 컴파일러는 어떻게 사용하는 걸까? 이미 JDK에 적용이 되어있는 건가?
※ 참조
'Java의 새로운 기능' 카테고리의 다른 글
Java 11의 새로운 기능 (0) | 2024.06.04 |
---|---|
Java 10의 새로운 기능 - 기타 (0) | 2021.10.07 |
Java 10의 새로운 기능 - 지역변수 타입 추론 (0) | 2021.09.23 |
Java 9의 새로운 기능 - 기타 (0) | 2021.09.22 |
Java 9의 새로운 기능 - 모듈(2) (0) | 2021.09.21 |