여기어때 기술블로그에서 해당 포스팅을 보고 자바의 버전별 세부 업데이트 사항에 대해 알아야 Java에 대해 보다 더 잘 이해할 수 있을 것이라 생각을 하게 되었다.
현재 대부분의 회사에서는 JDK 8 또는 11버전을 사용하고 있을 것이다.(물론 예상ㅎ) 찾아보다보니 왜 JDK 8에서 11 버전 이상으로 올려야만 하는지에 대해 구체적인 이유를 확인할 수 있었다. 이제 이유를 확인하러 가보자.
가장 먼저 왜 대부분의 회사에서 JDK 8을 사용하고 있는지에 대해 생각해봐야 한다. Oracle이 제공하는 아래 로드맵을 보자.
2022년이 아닌 과거 시점에서 봤을 경우 LTS가 가장 긴 OpenJDK8 버전을 이용하는 것이 운영적인 측면에서 가장 안정적인 선택이었다.
또한 국내에서 개발된 프로젝트는 대다수 Java 8로 개발되어 운영하고 있는 상황이기에 제품들과의 호환성을 유지하고 안정적으로 운영하기 위해서 JDK 8을 사용하고 있는 경우도 많을 것이다.
회사에서 사용할 OpenJDK는 장기적인 측면으로 보았을 경우 LTS가 최대한 오래 보장되는 버전을 선택하는 것이 가장 바람직하기에 현재 선택할 수 있는 대안은 다음과 같다.
이 글은 왜 JDK 11 버전 이상으로 업그레이드를 해야 하는가에 대한 내용을 다루기 때문에 JDK 11 버전으로 업그레이드 할 경우 업데이트 되는 내용 및 고려사항에 대해 중점적으로 다루어 보겠다.
성능비교는 LinkedIn의 전환 결과를 참고하였다.
성능 테스트 결과, Java 11로 전환하면서 성능이 저하된 사례는 없었다.
최상의 경우에는 약 200%의 성능향상을 보였으며 성능 향상은 대부분 GC의 변경에서 발생하였다.
JDK 버전 업그레이드 전과 후를 비교했을 경우 처리량, 지연 시간 등 월등히 개선되는 것을 확인할 수 있다.
어떠한 개선 사항이 있었길래 다음과 같은 성능 개선이 되었는지 JDK별 Release 정보 확인을 통해 확인해보자.
JDK 8에서 JDK 11까지는 버전별로 정말 많은 업데이트 사항이 존재하기 때문에 High-Level의 변경 사항 중 확인해볼 내용들을 일부 정리하였다. Release 노트를 전체적으로 확인하고 싶은 분들은 다음 링크를 참고하자.
ClassCastException
이 발생할 수 있다.ClassLoader.getPlatformClassLoader()
를 통해 부모 클래스 로데를 가져와야할 필요가 있을 수 있다.Java 11에는 버전 업그레이드를 도와주는 두 가지 플러그인을 제공하고 있다.
제공 플러그인
각각의 플러그인을 어떻게 사용하고 어떤 내용을 알려주는지 확인해보자.
jdeps --jdk-internals --multi-release 11 --class-path log4j-core-2.13.0.jar my-application.jar
Util.class -> JDK removed internal API
Util.class -> jdk.base
Util.class -> jdk.unsupported
com.company.Util -> sun.misc.BASE64Encoder JDK internal API (JDK removed internal API)
com.company.Util -> sun.misc.Unsafe JDK internal API (jdk.unsupported)
com.company.Util -> sun.nio.ch.Util JDK internal API (java.base)
Warning: JDK internal APIs are unsupported and private to JDK implementation that are
subject to be removed or changed incompatibly and could break your application.
Please modify your code to eliminate dependence on any JDK internal APIs.
For the most recent update on JDK internal API replacements, please check:
https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
JDK Internal API Suggested Replacement
---------------- ---------------------
sun.misc.BASE64Encoder Use java.util.Base64 @since 1.8
sun.misc.Unsafe See http://openjdk.java.net/jeps/260
jdeprscan을 통해 JDK 11 버전에서 더 이상 사용하지 않는 API 목록을 확인할 수 있다.
명령어 목록
--release 11
: JDK 11 버전에서 더 이상 사용되지 않는 API 목록.jdeprscan --release 11 --list
: Java 8 버전 이후 deprecated된 API 목록 확인jdeprscan --release 11 --list --for-removal
: 제거된 API 목록 확인예시
jdeprscan --release 11 --class-path log4j-api-2.13.0.jar my-application.jar
error: cannot find class sun/misc/BASE64Encoder
class com/company/Util uses deprecated method java/lang/Double::<init>(D)V
어플리케이션 성능 개선 측면에서 JDK 버전 업그레이드는 필수적이라고 생각되는 자료였다.
다만, 버전 업그레이드간 발생할 수 있는 오류가 생각보다 많아 해당 부분을 추가로 참고해 버전 업그레이드를 진행하면 좋을 것 같다.