Bien que Java soit l'un des langages et environnements les plus rétrocompatibles que j'ai jamais utilisés, il est toujours possible que des fonctionnalités soient obsolètes ou même supprimées. Java 21 rendra obsolète deux fonctionnalités, et c'est ce dont nous allons parler aujourd'hui.
La dépréciation d'un code ou d'une fonctionnalité signifie que son utilisation est déconseillée et pourrait ne plus exister dans une version future. Il peut y avoir de nombreuses raisons pour lesquelles cela n’est pas encouragé.
Les raisons de dépréciation les plus courantes sont :
Quelle que soit la cause profonde, la fonctionnalité obsolète fait toujours partie du système et donc toujours disponible, du moins pour le moment.
JEP449 vise à rendre obsolète la prise en charge x86 32 bits pour Windows, dans le but ultime de la supprimer complètement à l'avenir.
Les raisons de cette dépréciation et de sa future suppression sont principalement techniques.
Fournir un logiciel pour n'importe quel système nécessite toujours de décider quelles plates-formes vous souhaitez réellement prendre en charge. Cibler des plates-formes ou des versions qui ne sont plus prises en charge est possible, mais cela signifie généralement augmenter les efforts de support, effectuer un rétroportage, réparer les choses vous-même, etc.
En prenant la plateforme Windows comme exemple, la dernière version 32 bits est sortie en 2020 et le support officiel a pris fin en octobre 2025.
Si vous savez comment Windows 64 bits gère les applications 32 bits, vous vous demandez peut-être pourquoi vous ne pouvez pas exécuter la JVM via la couche d'émulation WOW64 intégrée de Windows ? Eh bien, il est généralement possible d'exécuter des applications de cette façon, mais les performances chuteront considérablement.
C'est pourquoi l'équipe OpenJDK a décidé de poursuivre la dépréciation, car elle n'affecte que les futures versions de Java. Les systèmes plus anciens pourront toujours utiliser toutes les versions de Java avant leur suppression.
L'un des changements immédiats de Java 21 affecte le processus de construction du JDK, car la possibilité de configurer la construction est désactivée par défaut. Essayer d'exécuter bash ./configure donne l'erreur :
...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
Puisque la fonctionnalité est simplement obsolète et non supprimée, l'équipe OpenJDK a ajouté une nouvelle option de configuration (comme l'indique l'erreur), --enable-deprecated-ports=yes pour toujours autoriser la configuration. Cependant, un avertissement sera émis pour souligner la dépréciation et une éventuelle suppression future.
$ 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 regorge de nouvelles fonctionnalités impressionnantes et l'ajout de Virtual Threads (JEP 444) en fait partie. Il introduit des threads légers (virtuels), qui peuvent changer considérablement la façon dont nous gérons les applications simultanées à haut débit en Java en réduisant l'effort requis pour écrire, maintenir et observer ces applications. Ils ont beaucoup moins de surcharge que les threads de plate-forme (noyau) traditionnels
Cependant, sous Windows 32 bits x86, cette fonctionnalité doit revenir aux threads du noyau en raison de limitations techniques. Cette fonctionnalité manquante de la plate-forme sous-jacente est souvent un indicateur fort d’une dépréciation et d’une suppression futures.
Vous pouvez néanmoins écrire et utiliser du nouveau code de threading, mais en pratique, il ne présente pas les avantages escomptés.
Comme vous pouvez le constater, la dépréciation est logique puisque Windows 32 bits x86 ne fonctionnera pas de toute façon. De plus, la création pour des plates-formes spécifiques est toujours possible, mais elle est actuellement déconseillée. Donc, si vous avez toujours besoin de prendre en charge les systèmes existants et de savoir ce que vous faites et quelles en sont les conséquences, vous pouvez toujours l'utiliser.
L'agent utilise l'API Instrumentation pour modifier les applications existantes en changeant le bytecode chargé dans la JVM. Cela vous permet de modifier le comportement de votre application sans réellement modifier son code source. Il est couramment utilisé dans les profileurs et les outils de surveillance (tels que Datadog et YourKit), la programmation orientée aspect, etc.
Il existe deux façons de charger un agent, l'une se charge statiquement en ajoutant des paramètres ou en appelant, l'autre se charge dynamiquement depuis une autre application en exécutant du code tel que : -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) {// ...}}}
La première option n'est pas un gros problème. Il s'agit d'une utilisation claire et intentionnelle de l'agent JVM. Cependant, cette dernière est indirecte et ne peut pas être contrôlée par la JVM connectée.
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交换的参数来执行此操作,以强化您的应用程序或为即将到来的更改做好准备。+-
本文中提到的两个功能的弃用对我来说是有道理的。
Windows 10 32 位 x86 支持是一项技术债务,阻碍了创新,例如利用虚拟线程的全部功能。
动态加载代理严重损害了 Java 平台的完整性,并且存在潜在的安全风险。如果打击者“足够接近”可以连接到另一个 JVM,那么您可能会遇到更大的问题。
尽管如此,我们始终必须意识到将来可能会发生变化或删除的内容,因为我们很可能无法决定它何时发生。Java 通常对弃用和删除时间框架相当慷慨,某些功能可能会弃用数十年,但看不到删除的迹象。所以很自然地,我们是否应该使用已弃用的 API 的问题就出现了。
在我看来,如果可能的话,我们应该尽量避免使用已弃用的 API。随着时间的推移,它正在成为技术债务,最终必须偿还。没有什么比因为不相关的原因而需要升级代码更有压力的了,而且您多年来依赖的一些已弃用的功能最终被删除,使得升级方式比需要的更加复杂。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!