더 이상 장난하지 마세요. 이러한 기능은 Java 21에서 더 이상 사용되지 않고 제거됩니다!
Java는 제가 사용해 본 언어 및 환경 중 가장 이전 버전과 호환되는 언어 중 하나이지만, 기능이 더 이상 사용되지 않거나 심지어 제거될 가능성도 항상 있습니다. Java 21에서는 두 가지 기능이 더 이상 사용되지 않으며 오늘 우리가 이에 대해 이야기하겠습니다.
1 기능을 더 이상 사용하지 않는 이유는 무엇입니까?
더 이상 사용되지 않는 코드나 기능은 해당 코드나 기능의 사용이 권장되지 않으며 향후 버전에서는 더 이상 존재하지 않을 수 있음을 의미합니다. 권장되지 않는 데에는 여러 가지 이유가 있을 수 있습니다.
지원 중단의 가장 일반적인 이유는 다음과 같습니다.
- 더 나은 대안으로 대체되었습니다.
- 설계상의 결함이 있어 사용하기에 위험할 수도 있습니다. 그러나 이전 버전과의 호환성으로 인해 즉시 또는 전혀 제거할 수 없습니다.
- 중복된 것으로 간주되므로 시스템과 사용 방법을 단순화하기 위해 제거해야 합니다.
- 향후 업데이트로 인해 이전 기능/코드를 지원하는 것이 불가능하거나 비현실적으로 될 것입니다.
근본 원인에 관계없이 더 이상 사용되지 않는 기능은 여전히 시스템의 일부이므로 적어도 지금은 계속 사용할 수 있습니다.
Windows 32비트 x86 포트 지원 중단
JEP449는 Windows에 대한 32비트 x86 지원을 중단하는 것을 목표로 하며 궁극적인 목표는 향후 완전히 제거하는 것입니다.
이 지원 중단과 향후 제거의 이유는 주로 기술적인 것입니다.
Windows 32비트 지원
모든 시스템에 소프트웨어를 제공하려면 항상 실제로 지원할 플랫폼을 결정해야 합니다. 더 이상 지원되지 않는 플랫폼이나 버전을 타겟팅하는 것은 가능하지만 일반적으로 지원 노력 추가, 백포트, 문제 직접 해결 등을 의미합니다.
Windows 플랫폼을 예로 들면, 마지막 32비트 버전은 2020년에 출시되었고, 공식 지원은 2025년 10월에 종료되었습니다.
64비트 Windows가 32비트 응용 프로그램을 처리하는 방법을 알고 있다면 Windows의 통합 WOW64 에뮬레이션 계층을 통해 JVM을 실행할 수 없는 이유가 궁금할 것입니다. 일반적으로 이런 방식으로 응용 프로그램을 실행하는 것은 가능하지만 성능이 크게 저하됩니다.
이것이 바로 OpenJDK 팀이 향후 버전의 Java에만 영향을 미치기 때문에 지원 중단을 계속하기로 결정한 이유입니다. 이전 시스템은 제거되기 전에도 모든 Java 버전을 계속 사용할 수 있습니다.
Java 21의 즉각적인 변경 사항 중 하나는 JDK의 빌드 프로세스에 영향을 미칩니다. 빌드 구성 기능이 기본적으로 비활성화되어 있기 때문입니다. bash ./configure를 실행하려고 하면 다음 오류가 발생합니다.
...checking compilation type... nativeconfigure: error: The Windows 32-bit x86 port is deprecated and may be removed in a future release. \Use --enable-deprecated-ports=yes to suppress this error.configure exiting with result code 1
이 기능은 단순히 제거되지 않고 더 이상 사용되지 않으므로 OpenJDK 팀은 새 구성 옵션(오류에 표시됨) --enable-deprecated-port=yes를 추가했습니다. 여전히 구성을 허용합니다. 그러나 지원 중단 및 향후 제거 가능성을 강조하기 위해 경고가 발행됩니다.
$ bash ./configure --enable-deprecated-ports=yes...checking compilation type... nativeconfigure: WARNING: The Windows 32-bit x86 port is deprecated and may be removed in a future release....Build performance summary:* Cores to use: 32* Memory limit: 96601 MBThe following warnings were produced. Repeated here for convenience:WARNING: The Windows 32-bit x86 port is deprecated and may be removed in a future release.
가상 스레드 대 커널 스레드
Java 21은 멋진 새 기능으로 가득 차 있으며 가상 스레드(JEP 444)의 추가도 그중 하나입니다. 경량(가상) 스레드를 도입하여 이러한 애플리케이션을 작성, 유지 관리 및 관찰하는 데 필요한 노력을 줄여 Java에서 처리량이 높은 동시 애플리케이션을 처리하는 방식을 크게 변경할 수 있습니다. 기존 플랫폼(커널) 스레드보다 오버헤드가 훨씬 적습니다.
그러나 Windows 32비트 x86에서 이 기능은 기술적 제한으로 인해 커널 스레드로 대체되어야 합니다. 기본 플랫폼의 누락된 기능은 향후 지원 중단 및 제거를 나타내는 강력한 지표가 되는 경우가 많습니다.
그래도 새로운 스레딩 코드를 작성하고 사용할 수 있지만 실제로는 예상되는 이점이 부족합니다.
지원 중단되었지만 아직 제거되지 않았습니다
보시다시피 Windows 32비트 x86은 어쨌든 실행되지 않으므로 지원 중단은 의미가 있습니다. 또한 특정 플랫폼용으로 구축하는 것은 여전히 가능하지만 현재는 권장되지 않습니다. 따라서 여전히 레거시 시스템을 지원해야 하고 현재 수행 중인 작업과 결과가 무엇인지 알아야 하는 경우에도 계속 사용할 수 있습니다.
에이전트의 동적 로드 비활성화
에이전트는 Instrumentation API를 사용하여 JVM에 로드된 바이트 코드를 변경하여 기존 애플리케이션을 수정합니다. 이를 통해 실제로 소스 코드를 변경하지 않고도 애플리케이션의 동작을 변경할 수 있습니다. 이는 일반적으로 프로파일러 및 모니터링 도구(예: Datadog 및 YourKit), 측면 지향 프로그래밍 등에 사용됩니다.
에이전트를 로드하는 방법
에이전트를 로드하는 방법에는 두 가지가 있습니다. 하나는 매개변수를 추가하거나 호출하여 정적으로 로드하는 것이고, 다른 하나는 -javaagent:agent-to-와 같은 코드를 실행하여 다른 애플리케이션에서 동적으로 로드하는 것입니다. load.jar-agentlib:optionsjava
import java.lang.management.ManagementFactory;import com.sun.tools.attach.VirtualMachine;public class DynamicAgentLoader {public static void main(String... args) {int pidOfOtherJVM = ...;File agentJar = ...;try {VirtualMachine vm = VirtualMachine.attach(pidOfOtherJVM);vm.loadAgent(agentJar.toAbsolutePath);// ... do your workvm.detach();} catch (Exception e) {// ...}}}
첫 번째 옵션은 큰 문제가 되지 않습니다. 이는 JVM 프록시를 명확하고 의도적으로 사용하는 것입니다. 그러나 후자는 간접적이며 연결된 JVM에 의해 제어되지 않을 수 있습니다.
动态加载的问题
Java 平台默认致力于实现完整性,为我们构建应用程序提供强大而坚实的基础。代理的设计考虑到了最好的意图,为您提供(良性)工具的力量。然而,为了确保这种完整性,通过(动态)代理进行检测是一个大问题,因为它们超出了您的直接控制范围,并且可能会对您的应用程序造成严重破坏。这就是为什么您作为应用程序的所有者必须对允许和加载哪些代理做出有意识且明确的决定。
插播一条,如果你近期准备面试跳槽,建议在ddkk.com在线刷题,涵盖 1万+ 道 Java 面试题,几乎覆盖了所有主流技术面试题,还有市面上最全的技术栈500套,精品系列教程,免费提供。
在Java 21 中,您仍然可以加载动态代理,但 JVM 会生成多个警告,通知您潜在的问题以及如何隐藏这些警告:
WARNING: A {Java,JVM TI} agent has been loaded dynamically (file:/path/to/agent.jar)WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warningWARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more informationWARNING: Dynamic loading of agents will be disallowed by default in a future release
未来的Java 版本将默认禁止加载动态代理,并且任何使用Attach API都会引发异常:
com.sun.tools.attach.AgentLoadException: Failed to load agent library: \Dynamic agent loading is not enabled. Use -XX:+EnableDynamicAgentLoading \to launch target VM.
异常消息包括启用动态代理加载所需的步骤:参数-XX:+EnableDynamicAgentLoading。因此,如果您有意识地决定允许动态代理,那么您仍然可以。
立即禁用动态加载
到目前为止,仅发出警告。但是,您可以完全禁止动态加载 Java 代理。您可以通过使用将(加号)与(破折号/减号)-XX:-EnableDynamicAgentLoading交换的参数来执行此操作,以强化您的应用程序或为即将到来的更改做好准备。+-
2 结论
本文中提到的两个功能的弃用对我来说是有道理的。
Windows 10 32 位 x86 支持是一项技术债务,阻碍了创新,例如利用虚拟线程的全部功能。
动态加载代理严重损害了 Java 平台的完整性,并且存在潜在的安全风险。如果打击者“足够接近”可以连接到另一个 JVM,那么您可能会遇到更大的问题。
尽管如此,我们始终必须意识到将来可能会发生变化或删除的内容,因为我们很可能无法决定它何时发生。Java 通常对弃用和删除时间框架相当慷慨,某些功能可能会弃用数十年,但看不到删除的迹象。所以很自然地,我们是否应该使用已弃用的 API 的问题就出现了。
在我看来,如果可能的话,我们应该尽量避免使用已弃用的 API。随着时间的推移,它正在成为技术债务,最终必须偿还。没有什么比因为不相关的原因而需要升级代码更有压力的了,而且您多年来依赖的一些已弃用的功能最终被删除,使得升级方式比需要的更加复杂。
위 내용은 더 이상 장난하지 마세요. 이러한 기능은 Java 21에서 더 이상 사용되지 않고 제거됩니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4
