Heim  >  Artikel  >  Technologie-Peripheriegeräte  >  Hören Sie auf, herumzualbern, diese Funktionen werden in Java 21 veraltet sein und entfernt!

Hören Sie auf, herumzualbern, diese Funktionen werden in Java 21 veraltet sein und entfernt!

PHPz
PHPznach vorne
2024-01-07 09:14:11674Durchsuche

Obwohl Java eine der abwärtskompatibelsten Sprachen und Umgebungen ist, die ich je verwendet habe, besteht immer die Möglichkeit, dass Funktionen veraltet oder sogar entfernt werden. Mit Java 21 werden zwei Funktionen veraltet sein, und darüber werden wir heute sprechen.

1 Warum veraltete Funktionalität?

Das Verwerfen von Code oder Funktionen bedeutet, dass von deren Verwendung abgeraten wird und diese in einer zukünftigen Version möglicherweise nicht mehr vorhanden sind. Es kann viele Gründe geben, warum es nicht gefördert wird.

Die häufigsten Gründe für eine Abwertung sind:

  • Es wurde durch eine bessere Alternative ersetzt.
  • Es gibt Konstruktionsfehler und die Verwendung kann sogar gefährlich sein. Aufgrund der Abwärtskompatibilität kann es jedoch nicht sofort oder überhaupt nicht entfernt werden.
  • Es gilt als überflüssig und sollte entfernt werden, um das System und seine Verwendung zu vereinfachen.
  • Zukünftige Updates werden es unmöglich/unpraktisch machen, alte Funktionen/Code zu unterstützen.

Unabhängig von der Grundursache ist die veraltete Funktionalität immer noch Teil des Systems und daher zumindest vorerst noch verfügbar.

Abkündigung des 32-Bit-x86-Ports von Windows

JEP449 zielt darauf ab, die 32-Bit-x86-Unterstützung für Windows abzuschaffen, mit dem ultimativen Ziel, sie in Zukunft vollständig zu entfernen.

Die Gründe für diese Abwertung und ihre zukünftige Entfernung sind hauptsächlich technischer Natur.

Windows 32-Bit-Unterstützung

Die Bereitstellung von Software für jedes System erfordert immer die Entscheidung, welche Plattformen Sie tatsächlich unterstützen möchten. Die gezielte Ausrichtung auf Plattformen oder Versionen, die nicht mehr unterstützt werden, ist möglich, bedeutet aber in der Regel, den Supportaufwand zu erhöhen, Backporting durchzuführen, Probleme selbst zu beheben usw.

Am Beispiel der Windows-Plattform wurde die letzte 32-Bit-Version im Jahr 2020 veröffentlicht und der offizielle Support endete im Oktober 2025.

Wenn Sie wissen, wie 64-Bit-Windows mit 32-Bit-Anwendungen umgeht, fragen Sie sich vielleicht, warum Sie die JVM nicht über die integrierte WOW64-Emulationsschicht von Windows ausführen können? Nun, es ist normalerweise möglich, Anwendungen auf diese Weise auszuführen, aber die Leistung wird dadurch dramatisch sinken.

Aus diesem Grund hat das OpenJDK-Team beschlossen, die Ablehnung fortzusetzen, da sie nur zukünftige Versionen von Java betrifft. Ältere Systeme können vor der Entfernung weiterhin alle Java-Versionen verwenden.

Eine der unmittelbaren Änderungen in Java 21 betrifft den Build-Prozess des JDK, da die Möglichkeit, den Build zu konfigurieren, standardmäßig deaktiviert ist. Der Versuch, bash ./configure auszuführen, gibt den Fehler aus:

...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

Da die Funktion einfach veraltet und nicht entfernt ist, hat das OpenJDK-Team eine neue Konfigurationsoption hinzugefügt (wie der Fehler anzeigt), --enable-deprecated-ports=yes um die Konfiguration weiterhin zu ermöglichen. Es wird jedoch eine Warnung ausgegeben, um auf die veraltete Version und eine mögliche zukünftige Entfernung hinzuweisen.

$ 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.

Virtuelle vs. Kernel-Threads

Java 21 steckt voller toller neuer Funktionen und die Hinzufügung von virtuellen Threads (JEP 444) ist eine davon. Es führt leichte (virtuelle) Threads ein, die die Art und Weise, wie wir gleichzeitige Anwendungen mit hohem Durchsatz in Java handhaben, erheblich verändern können, indem sie den Aufwand zum Schreiben, Verwalten und Beobachten solcher Anwendungen verringern. Sie haben viel weniger Overhead als herkömmliche Plattform-(Kernel-)Threads

Unter Windows 32-Bit x86 muss diese Funktionalität jedoch aufgrund technischer Einschränkungen auf Kernel-Threads zurückgreifen. Diese fehlende Funktionalität der zugrunde liegenden Plattform ist oft ein starker Indikator für eine zukünftige Abwertung und Entfernung.

Dennoch können Sie neuen Threading-Code schreiben und verwenden, aber in der Praxis fehlen ihm die erwarteten Vorteile.

Veraltet, aber noch nicht entfernt

Wie Sie sehen können, ist die Ablehnung sinnvoll, da Windows 32-Bit x86 ohnehin nicht läuft. Darüber hinaus ist das Erstellen für bestimmte Plattformen immer noch möglich, es wird jedoch derzeit davon abgeraten. Wenn Sie also weiterhin Legacy-Systeme unterstützen müssen und wissen, was Sie tun und welche Konsequenzen dies hat, können Sie es weiterhin verwenden.

Dynamisches Laden von Agenten deaktivieren

Agent verwendet die Instrumentierungs-API, um vorhandene Anwendungen zu ändern, indem er den geladenen Bytecode in der JVM ändert. Dadurch können Sie das Verhalten Ihrer Anwendung ändern, ohne den Quellcode tatsächlich zu ändern. Es wird häufig in Profilern und Überwachungstools (wie Datadog und YourKit), aspektorientierter Programmierung und mehr verwendet.

So laden Sie einen Agenten

Es gibt zwei Möglichkeiten, einen Agenten zu laden: Eine lädt statisch durch Hinzufügen von Parametern oder Aufrufen, die andere lädt dynamisch aus einer anderen Anwendung, indem Code wie: -javaagent:agent- ausgeführt wird. 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) {// ...}}}

Die erste Option ist kein großes Problem. Dies ist eine klare und absichtliche Verwendung des JVM-Agenten. Letzteres ist jedoch indirekt und kann möglicherweise nicht von der angeschlossenen JVM gesteuert werden.

动态加载的问题

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。随着时间的推移,它正在成为技术债务,最终必须偿还。没有什么比因为不相关的原因而需要升级代码更有压力的了,而且您多年来依赖的一些已弃用的功能最终被删除,使得升级方式比需要的更加复杂。

Das obige ist der detaillierte Inhalt vonHören Sie auf, herumzualbern, diese Funktionen werden in Java 21 veraltet sein und entfernt!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen