Inhaltsverzeichnis
1 Warum veraltete Funktionalität?
Abkündigung des 32-Bit-x86-Ports von Windows
Windows 32-Bit-Unterstützung
Virtuelle vs. Kernel-Threads
Veraltet, aber noch nicht entfernt
Dynamisches Laden von Agenten deaktivieren
So laden Sie einen Agenten
动态加载的问题
立即禁用动态加载
2 结论
Heim Technologie-Peripheriegeräte KI 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!

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

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
Nach dem Login kopieren

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.
Nach dem Login kopieren

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) {// ...}}}
Nach dem Login kopieren

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
Nach dem Login kopieren

未来的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.
Nach dem Login kopieren

异常消息包括启用动态代理加载所需的步骤:参数-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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Quadratwurzel in Java Quadratwurzel in Java Aug 30, 2024 pm 04:26 PM

Leitfaden zur Quadratwurzel in Java. Hier diskutieren wir anhand eines Beispiels und seiner Code-Implementierung, wie Quadratwurzel in Java funktioniert.

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Armstrong-Zahl in Java Armstrong-Zahl in Java Aug 30, 2024 pm 04:26 PM

Leitfaden zur Armstrong-Zahl in Java. Hier besprechen wir eine Einführung in die Armstrong-Zahl in Java zusammen mit einem Teil des Codes.

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

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

See all articles