尽管JAVA 是我使用过的向后兼容程度最高的语言和环境之一,但始终存在功能弃用甚至删除的可能性 。Java 21 将弃用两个功能,这就是我们今天要讨论的内容 。
1 为什么要弃用功能?弃用代码或功能意味着不鼓励使用它 , 并且可能在未来的版本中不再存在 。为什么不鼓励它可能有很多原因 。
弃用的最常见原因是:
- 它已被更好的替代方案所取代 。
- 存在设计缺陷 , 甚至使用起来可能存在危险 。但由于向后兼容性,它不能立即删除,或者根本不能删除 。
- 它被认为是多余的,应该删除以简化系统及其使用方式 。
- 未来的更新将使得支持旧功能/代码变得不可能/不切实际 。
弃用 windows 32 位 x86 端口JEP449旨在弃用 Windows 的 32 位 x86 支持,最终目标是在将来完全删除它 。
这种弃用及其未来删除背后的原因主要是技术性的 。
Windows 32 位支持【别再乱用了,Java 21 将弃用、删除这些功能!】为任何系统提供软件总是需要决定您实际想要支持哪些平台 。针对不再受支持的平台或版本是可能的,但通常意味着增加支持工作、向后移植、自行修复内容等 。
以Windows平台为例,最后一个32位版本于2020年发布,官方支持于2025年10月结束 。
如果您知道 64 位 Windows 如何处理 32 位应用程序,您可能想知道为什么不能通过 Windows集成的 WOW64 模拟层来运行 JVM ?嗯,通常可以以这种方式运行应用程序,但性能会急剧下降 。
这就是OpenJDK 团队决定继续弃用的原因,因为它只影响 Java 的未来版本 。旧系统仍然可以使用删除之前的所有 Java 版本 。
Java 21 中的一项直接更改会影响 JDK 的构建过程,因为默认情况下禁用配置构建的可能性 。尝试运行bash ./configure会出现错误:
...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由于该功能只是被弃用 , 而不是被删除,因此 OpenJDK 团队添加了新的配置选项(如错误所示),--enable-deprecated-ports=yes以仍然允许配置 。但是 , 会发出警告以强调弃用和未来可能的删除 。$ 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.虚拟 VS 内核线程Java 21 充满了令人敬畏的新功能 , 虚拟线程 (JEP 444)的添加就是其中之一 。它引入了轻量级(虚拟)线程 , 这可能会通过减少编写、维护和观察此类应用程序所需的工作量,从而显着改变我们处理 Java 中高吞吐量并发应用程序的方式 。它们的开销比传统平台(内核)线程少得多然而,在 Windows 32 位 x86 上,由于技术限制 , 此功能必须回退到内核线程 。底层平台的这种缺失功能通常是未来弃用和删除的有力指标 。
尽管如此,您仍然可以编写和使用新的线程代码,但在实际操作中却缺少预期的好处 。
已弃用,但尚未删除正如您所看到的,弃用是有道理的,因为 Windows 32 位 x86 无论如何都无法运行 。此外 , 针对特定平台进行构建仍然是可能的,只是目前不鼓励这样做 。因此,如果您仍然需要支持遗留系统并知道您在做什么以及后果是什么,您仍然可以使用它 。
禁止动态加载代理代理使用Instrumentation API通过更改 JVM 中已加载的字节码来修改现有应用程序 。这使您能够更改应用程序的行为 , 而无需实际更改其源代码 。它通常用于分析器和监视工具(例如Datadog和YourKit)、面向方面的编程等等 。
如何加载代理有两种方法可以加载代理,一种是通过添加参数或调用来静态加载,另一种是通过运行如下代码从另一个应用程序动态加载:-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) {// ...}}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 冬天减脂快还是夏天减脂快?别再搞错了,黄金减脂期可就这么几天
- 祺贵人被乱棍打死时,谁注意到她的脚了?这才是甄嬛的厉害之处
- 别再搞错了!肉桂与桂皮的区别详解
- 知三当三、私生活混乱!别再装了,陈建斌只是她的“接盘侠”
- 再这样拍下去,东南亚的黑帮,怕是不够用了
- “四川火锅”和“重庆火锅”区别大!别再以为是同一种了
- ETC不想用了怎么注销?这3个注销ETC的方法,你会选哪个?
- 收手吧温子仁!别再侮辱中国观众智商了,《海王2》上映辣评一片
- 天下不乱上一句是什么,如此安好前面一句是什么
- 64岁毕福剑罕见现身,住北京13万一平豪宅,画室杂乱老年斑明显
