Table des matières
1 Pourquoi déprécier une fonctionnalité ?
Dépréciation du port x86 32 bits de Windows
Prise en charge de Windows 32 bits
Virtual vs Kernel Threads
Obsolète, mais pas encore supprimé
Désactiver le chargement dynamique des agents
Comment charger un agent
动态加载的问题
立即禁用动态加载
2 结论
Maison Périphériques technologiques IA Arrêtez de déconner, ces fonctionnalités seront obsolètes et supprimées dans Java 21 !

Arrêtez de déconner, ces fonctionnalités seront obsolètes et supprimées dans Java 21 !

Jan 07, 2024 am 09:14 AM
java 代码

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.

1 Pourquoi déprécier une fonctionnalité ?

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 :

  • Il a été remplacé par une meilleure alternative.
  • Il existe des défauts de conception et peut même être dangereux à utiliser. Mais en raison de la compatibilité ascendante, il ne peut pas être supprimé immédiatement, voire pas du tout.
  • Il est considéré comme redondant et doit être supprimé pour simplifier le système et son utilisation.
  • Les futures mises à jour rendront impossible/peu pratique la prise en charge des anciennes fonctionnalités/codes.

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.

Dépréciation du port x86 32 bits de Windows

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.

Prise en charge de Windows 32 bits

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
Copier après la connexion

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.
Copier après la connexion

Virtual vs Kernel Threads

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.

Obsolète, mais pas encore supprimé

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.

Désactiver le chargement dynamique des agents

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.

Comment charger un agent

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) {// ...}}}
Copier après la connexion

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
Copier après la connexion

未来的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.
Copier après la connexion

异常消息包括启用动态代理加载所需的步骤:参数-XX:+EnableDynamicAgentLoading。因此,如果您有意识地决定允许动态代理,那么您仍然可以。

立即禁用动态加载

到目前为止,仅发出警告。但是,您可以完全禁止动态加载 Java 代理。您可以通过使用将(加号)与(破折号/减号)-XX:-EnableDynamicAgentLoading交换的参数来执行此操作,以强化您的应用程序或为即将到来的更改做好准备。+-

2 结论

本文中提到的两个功能的弃用对我来说是有道理的。

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles