gpt4 book ai didi

java - 短期运行的 Java CLI 应用程序的性能

转载 作者:行者123 更新时间:2023-12-01 23:22:22 25 4
gpt4 key购买 nike

我正在构建一个 java CLI 实用程序,用于处理文件中的一些数据。

除了从文件中读取外,所有操作都在内存中完成。内存中处理部分花费的时间出奇地长,因此我尝试对其进行分析,但无法查明任何执行特别糟糕的特定功能。

我担心 JIT 无法在单次运行期间优化程序,所以我用所有程序逻辑(包括读取输入文件)对函数连续执行之间的运行时变化进行了基准测试,果然,内存处理部分的运行时间在几次执行后下降,并且在第 5 次运行时已经缩小了近 10 倍。

我尝试在每次执行之前打乱输入数据,但它对此没有任何可见的影响。我不确定是否某些缓存可能导致此改进或程序运行期间完成的 JIT 优化,但由于通常程序一次运行一次,它总是显示最差的性能。

是否有可能在第一次运行时以某种方式获得良好的性能?是否有通用的方法来优化短期运行的 Java 应用程序的性能?

最佳答案

您可能无法通过更改应用程序1、2 来优化启动时间和性能。尤其是对于小型应用程序3。而且我当然不认为有“通用”的方法可以做到这一点;即适用于所有情况的优化。

但是,有一些 JVM 特性应该提高短期 JVM 的性能。

类数据共享 (CDS) 是一种允许将 JIT 编译的类缓存在文件系统中(作为 CDS 存档)的功能,然后在以后的应用程序运行中重复使用。此功能从 Java 5 开始可用(尽管在早期的 Java 版本中有限制)。

使用 -Xshare JVM 选项控制 CDS 功能。

  • -Xshare:dump 在运行期间生成 CDS 存档
  • -Xshare:off -Xshare:on-Xshare:auto 控制是否使用现有的 CDS 存档。

另一种缩短 HotSpot JVM 启动时间的方法是(曾经)使用提前 (AOT) 编译。基本上,您使用 jaotc 命令将应用程序编译为 native 代码二进制文件,然后运行它生成的可执行文件而不是 java 命令。 jaotc 命令是实验性的,在 Java 9 中引入。

jaotc 似乎未包含在 Oracle 发布的 Java 16 构建中,并计划在 Java 17 中删除。(参见 JEP 410: Remove the Experimental AOT and JIT Compiler)。

当前获得 Java AOT 编译的推荐方法是使用 GraalVM AOT Java compiler .


1 - 您可以转换为客户端-服务器应用程序,其中服务器始终“运行”。但是,这还有其他问题,并且不能消除客户端的启动时间问题……假设它是用 Java 编码的。
2 - 根据 @apangin ,还有一些其他应用程序调整可能会使您的代码更加 JIT 友好,尽管这将取决于您的代码当前正在做什么。
3 - 可以想象,大型(长时间运行的)单片应用程序的启动时间可以通过重构来改进,这样应用程序的子系统可以仅在需要时加载和初始化。但是,这听起来并不适合您的用例。

关于java - 短期运行的 Java CLI 应用程序的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67858282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com