当前位置: 首页 > 知识库问答 >
问题:

短期运行JavaCLI应用程序的性能

邓翼
2023-03-14

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

除了从文件中读取,所有的操作都是在内存中完成的。内存中的处理部分花费了令人惊讶的长时间,所以我尝试对它进行分析,但无法找出任何性能特别差的特定函数。

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

我尝试在每次执行之前对输入数据进行洗牌,但这并没有任何明显的效果。我不确定是某些缓存导致了这种改进,还是在程序运行期间进行了JIT优化,但由于程序通常一次运行一次,所以它总是表现出最差的性能。

有没有可能在首轮比赛中取得好成绩?有没有一种通用的方法来优化短期运行的java应用程序的性能?

共有2个答案

邹祺然
2023-03-14

您可以将小型处理作为服务运行:当您需要运行它时,“只是”对该服务进行网络调用(如果它是HTTP,则更容易,因为在Java中可以轻松做到这一点)。这样,处理本身将保持在同一个JVM中,并且最终会在JIT启动时变得更快。

当然,因为它可能需要大量开发,所以只有在处理本身:

  • 经常被调用
  • 具有易于传递给服务的参数(通常序列化为字符串)
  • 具有不需要太多数据即可传递给服务的参数(例如,几个 MB 二进制内容)
唐珂
2023-03-14

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

但是,有几个JVM特性可以提高短期JVM的性能。

类数据共享(CDS)是一种特性,它允许JIT编译的类被缓存在文件系统中(作为CDS档案),然后在应用程序的后续运行中重用。这个特性从Java 5开始就有了(尽管在早期的Java版本中有一些限制)。

使用-XshareJVM选项控制CDS功能。

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

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

似乎jaotc未包含在Oracle发布的Java 16构建中,并计划在Java 17中删除。(请参阅JEP 410:删除实验AOT和JIT编译器)。

目前推荐的获取 Java AOT 编译的方法是使用 GraalVM AOT Java 编译器。

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

 类似资料:
  • 我有一个简单的Spring-Boot应用程序,它只使用AMQP依赖项(仅-例如,没有web依赖项,所以JAR中没有包含应用服务器)。 我只想让应用程序运行并监听队列,并在收到消息时将一些信息记录到DB中--然而,由于没有应用程序服务器,它一启动就会再次关闭(因为什么都没有做)。在监听消息的同时,是否有一种最好的方法来保持应用程序的运行? 代码中没有什么令人惊讶的地方,只是标准的应用程序配置,然后还

  • 例如。 这应该运行一个简单的hello world应用程序,摘自oracle文档。然而,当我‘运行’这个代码,没有窗口打开。取而代之的是打开一个名为“Java”的应用程序。看起来'java'只是一个位于'jdk1.8.0_25.jdk/contents/home/bin'中的'UNIX可执行文件‘。应用程序'java'绝对不显示任何东西,并且在没有强制退出的情况下无法关闭。 我在MacBook上运

  • 主要内容:Eclipse 运行应用程序Eclipse 运行应用程序 运行 Java 程序的最快方法是使用 Package Explorer 视图。 在包资源管理器视图中 : 右键单击包含 main 方法的 java 类。 选择“Run As”→ Java Application。 通过选择包含 main 方法的类并单击 Alt + Shift + X、J,可以使用 Package Explorer 视图执行相同的操作。 上述任一操作都

  • 系统 cron 作业 系统 cron 作业不是使用 crontab 命令定义的,而是在一组配置文件中配置的。系统 cron 作业是在两个位置定义的:/etc/crontab 和 /etc/cron.d/*。安装 cron 作业的软件包应当通过在 /etc/cron.d/ 中放置文件才能执行安装操作,但是,管理员还可以使用此位置来更轻松地将相关作业分到单个文件中,或者使用配置管理系统推送作业。/et

  • 每当我尝试运行我的应用程序时,屏幕截图中的窗口就会弹出。声明找不到默认活动,因此我无法部署我的应用程序: 我的代码清单文件 这就是我点击运行时得到的窗口- 我的代码的Gradle文件:

  • 将应用程序打包为jar并使用嵌入式HTTP服务器的最大优势之一是,您可以像运行任何其他程序一样运行应用程序。 调试Spring Boot应用程序也很容易。 您不需要任何特殊的IDE插件或扩展。 本节仅涉及基于JAR的包装。如果选择将应用程序打包为WAR文件,则应参考服务器和IDE文档。 3.7.1 从IDE运行 您可以从IDE运行Spring Boot应用程序作为简单的Java应用程序。 但是,您