Java性能问题
我正在对我编写的应用程序进行基准测试。我在一个循环中将我的应用程序在基准测试中运行了10次(得到10个结果,而不是只有1个)。每一次,第一次迭代似乎比其余的迭代长50-100毫秒Java性能问题,java,performance,Java,Performance,我正在对我编写的应用程序进行基准测试。我在一个循环中将我的应用程序在基准测试中运行了10次(得到10个结果,而不是只有1个)。每一次,第一次迭代似乎比其余的迭代长50-100毫秒 这与JIT编译器有关吗?是否可以做些什么来“重置”状态,以便在所有迭代中都包含初始“滞后” 这可能是由于JIT的影响,但是您可能希望忽略初始延迟。至少大多数基准测试都试图这样做,因为它严重扭曲了统计数据 您不能“解压”已编译的代码,但可以使用-Xint命令行开关完全关闭编译。这可能是由JIT启动引起的,但是您可能希望忽
这与JIT编译器有关吗?是否可以做些什么来“重置”状态,以便在所有迭代中都包含初始“滞后” 这可能是由于JIT的影响,但是您可能希望忽略初始延迟。至少大多数基准测试都试图这样做,因为它严重扭曲了统计数据
您不能“解压”已编译的代码,但可以使用
-Xint
命令行开关完全关闭编译。这可能是由JIT启动引起的,但是您可能希望忽略初始延迟。至少大多数基准测试都试图这样做,因为它严重扭曲了统计数据
您不能“解压缩”已编译的代码,但可以使用
-Xint
命令行开关完全关闭编译。要对长时间运行的应用程序进行基准测试,您应该允许初始化(第一次),这是因为必须加载类,必须生成代码,在web应用程序中,JSP编译为servlet等。当然,JIT也起到了作用。有时,如果发生垃圾收集,则传递可能需要更长的时间。要对长时间运行的应用程序进行基准测试,您应该允许进行初始化(第一次传递),这是因为在web应用程序JSP编译为servlet等中,必须加载类,生成代码。JIT当然也起到了作用。有时,如果发生垃圾收集,传递可能需要更长的时间。代码中可能有某些结构,例如只初始化一次并消耗系统资源的结构。例如,如果您使用的是数据库连接池,可能就是这种情况。此外,它是Java类初始化所需的时间。出于这些原因,我认为您应该放弃第一个值,只保留其余值。代码中可能有某些结构,例如只初始化一次并占用系统资源的结构。例如,如果您使用的是数据库连接池,可能就是这种情况。此外,它是Java类初始化所需的时间。出于这些原因,我认为您应该放弃第一个值,只保留其余的值。由于JIT,第一次传递可能总是比较慢。我甚至希望在由于可能的增量编译或更好的分支预测而进行更多运行时看到差异
对于基准测试,请遵循其他答案中给出的建议(除非我不会关闭JIT,因为您的应用程序在生产环境中使用JIT运行)
在任何情况下,都可以使用诸如JVisualVM(包含在JDK中)这样的探查器。由于JIT,第一次传递可能总是比较慢。我甚至希望在由于可能的增量编译或更好的分支预测而进行更多运行时看到差异 对于基准测试,请遵循其他答案中给出的建议(除非我不会关闭JIT,因为您的应用程序在生产环境中使用JIT运行) 在任何情况下,都可以使用诸如JVisualVM(包含在JDK中)这样的探查器 这与JIT编译器有关吗 可能是的,尽管还有其他潜在的“滞后”来源:
- 引导JVM并创建初始类加载器
- 读取和加载应用程序的类以及使用的库类
- 初始化类
- JIT编译
- 堆预热效应;e、 g.堆最初太小的开销。(这可能导致GC比正常运行更频繁…直到堆达到与应用程序峰值工作集大小匹配的大小。)
- 虚拟记忆预热效应;e、 g.JVM增加进程地址空间和分配物理页面时产生的操作系统开销
然而,你可以做一些事情来消除这些“滞后”的根源;e、 g.使用较大的初始堆大小,在其他空闲机器上运行JIT编译 此外,@Joachim在上面提供的链接值得一读 这与JIT编译器有关吗 可能是的,尽管还有其他潜在的“滞后”来源:
- 引导JVM并创建初始类加载器
- 读取和加载应用程序的类以及使用的库类
- 初始化类
- JIT编译
- 堆预热效应;e、 g.堆最初太小的开销。(这可能导致GC比正常运行更频繁…直到堆达到与应用程序峰值工作集大小匹配的大小。)
- 虚拟记忆预热效应;e、 g.JVM增加进程地址空间和分配物理页面时产生的操作系统开销
然而,你可以做一些事情来消除这些“滞后”的根源;e、 g.使用较大的初始堆大小,在其他空闲机器上运行JIT编译
另外,@Joachim在上面提供的链接值得一读。把它想象成。你可能会对它感兴趣。@Joachim Sauer:好东西,好读物。我要你+1