Walaupun Java ialah salah satu bahasa dan persekitaran yang paling serasi ke belakang yang pernah saya gunakan, sentiasa ada kemungkinan fungsi ditamatkan atau dialih keluar. Java 21 akan menghentikan dua ciri, dan itulah yang akan kita bincangkan hari ini.
Menamatkan kod atau fungsi bermakna penggunaannya tidak digalakkan dan mungkin tidak lagi wujud dalam versi akan datang. Mungkin ada banyak sebab mengapa ia tidak digalakkan.
Sebab paling biasa untuk penamatan adalah:
Tanpa mengira punca, fungsi yang tidak digunakan masih merupakan sebahagian daripada sistem dan oleh itu masih tersedia, sekurang-kurangnya buat masa ini.
JEP449 bertujuan untuk menghentikan sokongan 32-bit x86 untuk Windows, dengan matlamat utama untuk mengalih keluarnya sepenuhnya pada masa hadapan.
Sebab di sebalik penamatan ini dan penyingkiran masa depan adalah terutamanya teknikal.
Menyediakan perisian untuk mana-mana sistem sentiasa memerlukan penentuan platform yang anda mahu sokong. Menyasarkan platform atau versi yang tidak lagi disokong adalah mungkin, tetapi biasanya bermakna meningkatkan usaha sokongan, backporting, membetulkan perkara sendiri, dsb.
Mengambil platform Windows sebagai contoh, versi 32-bit terakhir dikeluarkan pada 2020, dan sokongan rasmi berakhir pada Oktober 2025.
Jika anda tahu cara Windows 64-bit mengendalikan aplikasi 32-bit, anda mungkin tertanya-tanya mengapa anda tidak boleh menjalankan JVM melalui lapisan emulasi WOW64 bersepadu Windows? Nah, biasanya mungkin untuk menjalankan aplikasi dengan cara ini, tetapi prestasi akan menurun secara mendadak.
Inilah sebabnya pasukan OpenJDK memutuskan untuk meneruskan penamatan, kerana ia hanya mempengaruhi versi Java masa hadapan. Sistem lama masih boleh menggunakan semua versi Java sebelum dialih keluar.
Salah satu perubahan segera dalam Java 21 mempengaruhi proses binaan JDK, kerana kemungkinan untuk mengkonfigurasi binaan dilumpuhkan secara lalai. Cuba untuk menjalankan bash ./configure memberikan ralat:
...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
Memandangkan ciri itu ditamatkan begitu sahaja, bukan dialih keluar, pasukan OpenJDK menambah pilihan konfigurasi baharu (seperti yang ditunjukkan oleh ralat), --enable-deprecated- ports=yes untuk masih membenarkan konfigurasi. Walau bagaimanapun, amaran akan dikeluarkan untuk menyerlahkan penamatan dan kemungkinan penyingkiran akan datang.
$ 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 penuh dengan ciri baharu yang hebat dan penambahan Thread Maya (JEP 444) adalah salah satu daripadanya. Ia memperkenalkan utas ringan (maya), yang mungkin mengubah dengan ketara cara kami mengendalikan aplikasi serentak berkemampuan tinggi di Jawa dengan mengurangkan usaha yang diperlukan untuk menulis, menyelenggara dan memerhati aplikasi tersebut. Mereka mempunyai overhed yang jauh lebih sedikit daripada utas platform (kernel) tradisional
Walau bagaimanapun, pada Windows 32-bit x86, fungsi ini mesti kembali kepada utas kernel kerana batasan teknikal. Kehilangan kefungsian platform asas ini selalunya merupakan penunjuk kuat penamatan dan penyingkiran masa hadapan.
Namun, anda boleh menulis dan menggunakan kod benang baharu, tetapi dalam praktiknya ia tidak mempunyai faedah yang diharapkan.
Seperti yang anda lihat, penamatan itu masuk akal kerana Windows 32-bit x86 tidak akan dijalankan juga. Selain itu, pembinaan untuk platform tertentu masih boleh dilakukan, hanya pada masa ini tidak digalakkan. Jadi, jika anda masih perlu menyokong sistem warisan dan mengetahui perkara yang anda lakukan dan akibatnya, anda masih boleh menggunakannya.
Agen menggunakan API Instrumentasi untuk mengubah suai aplikasi sedia ada dengan menukar kod bait yang dimuatkan dalam JVM. Ini membolehkan anda menukar tingkah laku aplikasi anda tanpa benar-benar mengubah kod sumbernya. Ia biasanya digunakan dalam pemprofil dan alat pemantauan (seperti Datadog dan YourKit), pengaturcaraan berorientasikan aspek dan banyak lagi.
Terdapat dua cara untuk memuatkan ejen, satu memuatkan secara statik dengan menambah parameter atau memanggil, satu lagi memuatkan secara dinamik dari aplikasi lain dengan menjalankan kod seperti: -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) {// ...}}}
Pilihan pertama bukanlah masalah besar. Ini adalah penggunaan ejen JVM yang jelas dan disengajakan. Walau bagaimanapun, yang terakhir adalah tidak langsung dan mungkin tidak dikawal oleh JVM yang disambungkan.
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。随着时间的推移,它正在成为技术债务,最终必须偿还。没有什么比因为不相关的原因而需要升级代码更有压力的了,而且您多年来依赖的一些已弃用的功能最终被删除,使得升级方式比需要的更加复杂。
Atas ialah kandungan terperinci Berhenti bermain-main, ciri ini akan ditamatkan dan dialih keluar dalam Java 21!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!