短时间运行的Java CLI应用程序的性能
我正在构建一个java CLI实用程序应用程序,用于处理文件中的一些数据 除了读取文件外,所有操作都在内存中完成。内存中的处理部分花费了惊人的长时间,因此我尝试对其进行分析,但无法确定任何执行特别糟糕的特定功能 我担心JIT无法在一次运行期间优化程序,因此我用所有程序逻辑(包括读取输入文件)和足够的数据,对函数连续执行之间的运行时变化进行了基准测试,内存中处理部分的运行时间会下降几次,并且在第5次运行时已经变小了近10倍 我尝试在每次执行之前洗牌输入数据,但没有任何明显的效果。我不确定某些缓存是否会导致这种改进或程序运行期间所做的JIT优化,但由于程序通常一次运行一次,因此它总是显示出最差的性能短时间运行的Java CLI应用程序的性能,java,performance,jvm,Java,Performance,Jvm,我正在构建一个java CLI实用程序应用程序,用于处理文件中的一些数据 除了读取文件外,所有操作都在内存中完成。内存中的处理部分花费了惊人的长时间,因此我尝试对其进行分析,但无法确定任何执行特别糟糕的特定功能 我担心JIT无法在一次运行期间优化程序,因此我用所有程序逻辑(包括读取输入文件)和足够的数据,对函数连续执行之间的运行时变化进行了基准测试,内存中处理部分的运行时间会下降几次,并且在第5次运行时已经变小了近10倍 我尝试在每次执行之前洗牌输入数据,但没有任何明显的效果。我不确定某些缓存是
是否有可能在第一次跑步时获得良好的表现?对于短时间运行的java应用程序,是否有一种通用的性能优化方法?您可能无法通过更改应用程序1、2来优化启动时间和性能。特别是对于小型应用程序3。我当然不认为有“通用”的方法可以做到这一点;i、 e.适用于所有情况的优化 但是,有几个JVM特性可以提高短期JVM的性能 类数据共享(CDS)是一种功能,它允许JIT编译的类缓存在文件系统中(作为CDS存档),然后由应用程序的后续运行重用。此功能自Java5开始提供(尽管在早期Java版本中有限制) CDS功能使用
-Xshare
JVM选项进行控制
在运行期间生成CD存档-Xshare:dump
-Xshare:off
和-Xshare:on
控制是否使用现有的CD存档-Xshare:auto
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选项进行控制
在运行期间生成CD存档-Xshare:dump
-Xshare:off
和-Xshare:on
控制是否使用现有的CD存档-Xshare:auto
jaotc
命令将应用程序编译为本机代码二进制文件,然后运行它生成的可执行文件,而不是java
命令。jaotc
命令是实验性的,是在Java9中引入的
Oracle发布的Java16版本中似乎没有包含jaotc
,并计划在Java17中删除。(见附件)
当前推荐的获取Java AOT编译的方法是使用
1-您可以转换为一个客户机-服务器应用程序,在该应用程序中,服务器始终处于“启动”状态。但是,这还有其他问题,并且不能消除客户端的启动时间问题。。。假设它是用Java编码的。
2-根据,还有一些其他的应用程序调整可能会使您的代码更加JIT友好,尽管这将取决于您当前的代码执行情况。
3-可以想象,大型(长时间运行)单片应用程序的启动时间可以通过重构来提高,这样应用程序的子系统可以仅在需要时加载和初始化。但是,这听起来不适合您的用例。您可以将小型处理作为服务运行:当您需要运行它时,“只”对该服务进行网络调用(如果是HTTP,则更容易,因为有简单的方法可以实现)