Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
短时间运行的Java CLI应用程序的性能_Java_Performance_Jvm - Fatal编程技术网

短时间运行的Java CLI应用程序的性能

短时间运行的Java CLI应用程序的性能,java,performance,jvm,Java,Performance,Jvm,我正在构建一个java CLI实用程序应用程序,用于处理文件中的一些数据 除了读取文件外,所有操作都在内存中完成。内存中的处理部分花费了惊人的长时间,因此我尝试对其进行分析,但无法确定任何执行特别糟糕的特定功能 我担心JIT无法在一次运行期间优化程序,因此我用所有程序逻辑(包括读取输入文件)和足够的数据,对函数连续执行之间的运行时变化进行了基准测试,内存中处理部分的运行时间会下降几次,并且在第5次运行时已经变小了近10倍 我尝试在每次执行之前洗牌输入数据,但没有任何明显的效果。我不确定某些缓存是

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

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

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

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


是否有可能在第一次跑步时获得良好的表现?对于短时间运行的java应用程序,是否有一种通用的性能优化方法?

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

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

类数据共享(CDS)是一种功能,它允许JIT编译的类缓存在文件系统中(作为CDS存档),然后由应用程序的后续运行重用。此功能自Java5开始提供(尽管在早期Java版本中有限制)

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

  • -Xshare:dump
    在运行期间生成CD存档
  • -Xshare:off
    -Xshare:on
    -Xshare:auto
    控制是否使用现有的CD存档
提高热点JVM启动时间的另一种方法是(was)使用提前(AOT)编译。基本上,您可以使用
jaotc
命令将应用程序编译为本机代码二进制文件,然后运行它生成的可执行文件,而不是
java
命令。
jaotc
命令是实验性的,是在Java9中引入的

Oracle发布的Java16版本中似乎没有包含
jaotc
,并计划在Java17中删除。(见附件)

当前推荐的获取Java AOT编译的方法是使用


1-您可以转换为一个客户机-服务器应用程序,在该应用程序中,服务器始终处于“启动”状态。但是,这还有其他问题,并且不能消除客户端的启动时间问题。。。假设它是用Java编码的。
2-根据,还有一些其他的应用程序调整可能会使您的代码更加JIT友好,尽管这将取决于您当前的代码执行情况。

3-可以想象,大型(长时间运行)单片应用程序的启动时间可以通过重构来提高,这样应用程序的子系统可以仅在需要时加载和初始化。但是,这听起来不适合您的用例。

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

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

类数据共享(CDS)是一种功能,它允许JIT编译的类缓存在文件系统中(作为CDS存档),然后由应用程序的后续运行重用。此功能自Java5开始提供(尽管在早期Java版本中有限制)

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

  • -Xshare:dump
    在运行期间生成CD存档
  • -Xshare:off
    -Xshare:on
    -Xshare:auto
    控制是否使用现有的CD存档
提高热点JVM启动时间的另一种方法是(was)使用提前(AOT)编译。基本上,您可以使用
jaotc
命令将应用程序编译为本机代码二进制文件,然后运行它生成的可执行文件,而不是
java
命令。
jaotc
命令是实验性的,是在Java9中引入的

Oracle发布的Java16版本中似乎没有包含
jaotc
,并计划在Java17中删除。(见附件)

当前推荐的获取Java AOT编译的方法是使用


1-您可以转换为一个客户机-服务器应用程序,在该应用程序中,服务器始终处于“启动”状态。但是,这还有其他问题,并且不能消除客户端的启动时间问题。。。假设它是用Java编码的。
2-根据,还有一些其他的应用程序调整可能会使您的代码更加JIT友好,尽管这将取决于您当前的代码执行情况。

3-可以想象,大型(长时间运行)单片应用程序的启动时间可以通过重构来提高,这样应用程序的子系统可以仅在需要时加载和初始化。但是,这听起来不适合您的用例。

您可以将小型处理作为服务运行:当您需要运行它时,“只”对该服务进行网络调用(如果是HTTP,则更容易,因为有简单的方法可以实现)