Amazon Linux2에서 JDK8을 지원하지 않을뿐더러 앞으로도 JDK8은 더 이상 지원되지 않으며 사용자는 JDK11로 전환을 권고하고 있다. Amazon Linux1도 deprecated 되므로 Amazon Linux2로 변경을 하면서 자연스럽게 JDK11로 업그레이드를 해야 했다.
Amazon Linux2 & JDK11로 변경하면서 다행히 아무런 문제 없이 전환을 완료되었다. 아마 JDK8에서 사용되었던 API 및 패키지에 대한 변경 건은 없어 보였다.
이번 전환 작업을 하면서 문뜩 든 생각이 JDK11에 대한 특징을 잘 알지 못한 것이었다. 그래서 이 참에 특징에 대해서 스터디 후 기록해야겠다.
중요한 특징부터 살펴보면
ZGC (Z Garbage Collectors)
이번 JDK11에서 GC에 대한 개선과 변화를 가져왔다. 특징으로는
- GC의 일시 중지 시간은 10ms 미만이다.
- Heap의 크기가 증가하더라도 정지 시간이 증가하지 않는다.
- 작은 크기 ~ 매우 큰 크기(8MB ~ 16TB) 범위의 Heap을 처리한다.
- G1에 비한 애플리케이션 처리량이 15% 이상 감소하지 않는다.
즉, ZGC는 G1보다 짧은 레이턴시를 가지면서 G1에 비해 뒤처지지 않는 처리율을 가지는 게 가장 큰 특징이다.
JVM으로 구동되는 애플리케이션의 경우 GC가 동작할 때 STW(Stop-The-World)로 인해 성능에 큰 영향 미쳐왔다.
그래서 GC의 정지 시간을 짧을수록 애플리케이션의 성능 향상 기여하기 마련이다.
그래서 이번 ZGC의 경우 Load Barrier와 Colored Pointer를 함께 사용하여 Thread 동작 중에도 ZGC가 객체 재배치 같은 작업을 수행할 수 있다.
ZGC 메모리는 ZPages라 불리는 영역으로 나누게 된다. ZPages는 동적 사이즈로 2MB의 배수가 다이나믹하게 생성 및 삭제될 수 있다.
(Smaill : 2MB, Medium : 32MB, Large : N * 2MB)
ZGC Heap
http://cr.openjdk.java.net/~pliden/slides/ZGC-FOSDEM-2018.pdf 를 보면 테스트 결과를 볼 수 있는데
- G1에 비해 일시 정지시간이 압도적으로 짧았다.
- G1에 비해 처리율도 좋았다.
Local-Variable Syntax for Lambda Parameters
JDK11부터 var를 람다 표현식에 쓰는 경우 전달되는 파라미터들의 타입을 추론할 수 있는 기능이 추가됐다.
(var s1, var s2) -> s1 + s2
지역 변수와 람다 매개변수 모두에서 var 사용이 균일해진다.
Http Client의 변화
JDK9에서 추가되었고 JDK10에서 업데이트되었던 java.net.http 패키지가 표준화가 되었다. 특징으로는
- Non-Blocking Request And Response를 지원한다. (with CompletableFeature)
- Backpressure 지원 (java.util.concurrent.flow 패키지를 통해 Rx flow를 구현체에 적용)
- Http/2 지원
- Factory Method 형태로 지원
- Websocket 지원
가장 큰 특징은 Http/2를 지원하고 비동기 프로그래밍이 가능해졌다는 것이고 기본값으로 Http/2로 설정되나 Http/2를 지원하지 않으면 자동으로 Http/1.1로 전환된다.
https://openjdk.org/groups/net/httpclient/ 예제를 참고해보자.
'Java' 카테고리의 다른 글
[JAVA] RSA 비대칭키 양방향 암호화 구현 (0) | 2022.12.02 |
---|---|
[Java] 0.1 + 0.2 = 0.3이 아니다! (0) | 2022.11.11 |
[Java] 클래스로더(Class loader) (0) | 2022.11.10 |
[Java] Reflection으로 객체 비교 (0) | 2022.11.08 |
[Java] String, StringBuffer, StringBuilder 특징 (0) | 2022.11.07 |
댓글