Java 24 환경에서 guava / sun.misc.Unsafe 경고 메시지
Java 플랫폼은 지속적인 진화를 거치며 성능 및 보안성을 높이기 위해 내부 API를 지속적으로 수정하거나 폐기하고 있다.
Java 24에서 도입된 JEP 498 ("Warn upon Use of Memory-Access Methods in sun.misc.Unsafe") 은 이러한 변경 사항의 대표적인 예로, 내부적으로 널리 사용되었던 sun.misc.Unsafe
클래스의 메모리 접근 메서드 사용에 대한 경고를 제공한다.
경고 메시지의 기술적 배경
Java의 sun.misc.Unsafe
클래스는 JVM 메모리에 직접 접근하거나 저수준 동기화 및 원자적 연산을 수행하는 기능을 제공하여, 높은 성능을 요구하는 다양한 프레임워크 및 라이브러리에서 널리 사용되었다. 그러나 이러한 기능의 무분별한 사용은 보안 및 안정성 측면에서 잠재적 위협이 될 수 있으므로, Oracle은 JEP 260 및 최근의 JEP 498을 통해 해당 클래스의 사용을 점진적으로 폐기하고자 하고 있다. Java 24부터는 이 클래스의 특정 메서드 호출이 있을 때 아래와 같은 경고 메시지를 출력한다.
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper (file:/deploy/WEB-INF/lib/guava-33.4.0-jre.jar)
WARNING: Please consider reporting this to the maintainers of class com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
이는 Guava 33.4.5 버전 이전 까지 여전히 Java 9 이후 환경에서도 Unsafe API를 사용하여 객체의 필드 접근 위치를 가져오는 방식을 채택했기 때문이다.
해결 방안 및 버전 업그레이드의 필요성
해당 문제는 근본적으로 Guava 라이브러리 내부의 메모리 접근 방식에 기인한다. 다행히 Google은 Java 9 이상의 환경을 고려하여 Guava 33.4.5 버전부터 이 문제를 해소하였다. 구체적으로 Guava 개발팀은 내부적으로 사용하던 Unsafe 기반 접근 방식을 제거하고, Java 표준 API를 활용하는 방향으로 리팩토링을 수행했다.
Guava의 의존성을 다음과 같이 최신 버전으로 업데이트하면, 해당 경고 메시지를 효과적으로 제거할 수 있다.
2025.03.20 일 기준 Android 부분은 미완료.
<!-- Maven 기반 프로젝트의 예시 -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.4.5-jre</version>
</dependency>
Guava 33.4.5에서의 주요 변경점
Guava 33.4.5 버전의 변경 내역 중 핵심적인 부분은 다음과 같다:
- Java 9 이상의 환경에서
sun.misc.Unsafe
클래스 기반 메모리 접근 방식을 표준 Java API로 대체하였다. - JVM의 향후 버전 업그레이드에서 발생할 수 있는 호환성 문제를 선제적으로 방지하였다.
변경 내역 출처: Guava 33.4.5 공식 Release Note
실제 적용 예시
- 적용전
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper (file:/deploy/webapps/ROOT/WEB-INF/lib/guava-33.4.0-jre.jar)
WARNING: Please consider reporting this to the maintainers of class com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
20-Mar-2025 22:04:13.321 정보 [main] org.apache.catalina.startup.HostConfig.deployDescriptor 배치 descriptor [/tomcat9/conf/Catalina/localhost/ROOT.xml]의 배치가 [7,639] 밀리초 내에 완료되었습니다.
20-Mar-2025 22:04:13.324 정보 [main] org.apache.coyote.AbstractProtocol.start 프로토콜 핸들러 ["http-nio-127.0.0.1-8080"]을(를) 시작합니다.
20-Mar-2025 22:04:13.328 정보 [main] org.apache.catalina.startup.Catalina.start 서버가 [7682] 밀리초 내에 시작되었습니다.
- 적용후
20-Mar-2025 22:34:27.156 정보 [main] org.apache.catalina.startup.HostConfig.deployDescriptor 배치 descriptor [/tomcat9/conf/Catalina/localhost/ROOT.xml]의 배치가 [5,634] 밀리초 내에 완료되었습니다.
20-Mar-2025 22:34:27.160 정보 [main] org.apache.coyote.AbstractProtocol.start 프로토콜 핸들러 ["http-nio-127.0.0.1-8080"]을(를) 시작합니다.
20-Mar-2025 22:34:27.164 정보 [main] org.apache.catalina.startup.Catalina.start 서버가 [5683] 밀리초 내에 시작되었습니다.
결론
Java 24 환경에서 Guava 라이브러리 사용 중 sun.misc.Unsafe
경고 메시지를 접할 경우, Guava를 33.4.5 이상의 버전으로 업그레이드하는 것이 권장됩니다.
Edited by ChatGPT
'Computer_IT > JAVA' 카테고리의 다른 글
Java 24의 JEP 450: Compact Object Headers로 메모리 효율성 높이기 (0) | 2025.03.27 |
---|---|
[Tomcat] Windows에서 콘솔 화면 한글 깨짐 조치 (0) | 2020.10.15 |
[MAVEN] unmappable character for encoding EUC_KR (0) | 2018.08.23 |
[spring] logback 로그 2번 찍힘 (0) | 2018.08.09 |
Java Bitmap pixel to image(png) setRGB example (0) | 2015.06.17 |