当前位置: 首页 > 面试题库 >

我可以强制JVM本地编译给定方法吗?

濮彬
2023-03-14
问题内容

当我的应用启动时,我经常调用一种性能至关重要的方法。最终,它会被JIT编译,但是不会在解释器中运行一些明显的时间之后编译。

有什么办法可以告诉JVM我想从一开始就编译该方法(而无需使用诸如的东西来调整其他内部结构-XX:CompileThreshold)?


问题答案:

我知道的唯一方法是-Xcomp标志,但是通常不建议使用该标志。它会在第一次运行所有类和方法时强制立即进行JIT编译。缺点是,由于启动JIT活动增加,您将看到性能在初始启动时下降。此标志的另一个主要限制是,它似乎禁用了JIT通常会执行的基于增量分析的优化。在标准混合模式下,JIT编译器可以(并且将)基于概要分析和所收集的运行时信息来连续地对代码的某些部分进行优化和重新编译。这使它可以“纠正”错误的优化,例如省略但事实证明是必需的边界检查,次优内联等。-Xcomp
禁用基于性能分析的优化,并且取决于程序,可能会导致整体性能显着下降,而启动时仅获得很小的收获或没有真正的收获,这就是为什么不建议使用它的原因。

除了-Xcomp(这非常残酷)和-XX:CompileThreshold控制JIT将以解释模式运行多少给定方法以在编译/优化它之前收集统计信息)之外,还有-Xbatch。这迫使JIT编译进入“前景”,本质上阻止了对方法的调用,直到它被编译为止,而不是像通常那样在后台编译它。

您没有指定要使用哪个Java版本,但是如果可以选择使用Java
7,它将引入一个新的JIT模型,称为“分层编译”(通过-XX:+TieredCompilation开关激活)。分层编译的作用是,基于收集的性能分析数据,它允许在首次使用方法时进行初始的较小编译,然后在以后进行其他较大的编译/优化。听起来您应该很感兴趣。

据说它需要一些额外的调整和参数/配置,但是我还没有进一步检查它。



 类似资料:
  • 问题内容: JVM崩溃中的日志文件包含各种有用的调试信息,例如加载的共享库和完整的环境。我可以强制JVM以编程方式生成其中之一吗?通过执行使它崩溃的代码还是其他方式?或者以另一种方式访问​​相同的信息? 问题答案: 您可以尝试抛出OutOfMemoryError并添加-XX:+ HeapDumpOnOutOfMemoryError jvm参数。从1.6开始,这是新功能,而McDowell建议使用其

  • 主要内容:本地方法,为什么要使用Native Method,现状本地方法 简单来讲,一个Native Method就是一个java滴啊用非java代码的接口,一个Native Method 是这样一个java方法:该方法的实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。 在定义一个native method时,并不提供实现体(有些像

  • 问题内容: 我已经使用,并且我知道JIT编译器的基本技术以及为什么使用JIT编译。 但是我仍然没有找到JVM如何决定JIT编译方法的方法,即“何时到了JIT编译方法的正确时间”。 我假设每个方法都开始被解释,并且只要它不被归类为“热方法”,就不会被编译,这是对的吗?我脑海里有些东西我读到,当一个方法执行至少10.000次(解释该方法10.000次后,将被编译)时,该方法被视为“热”,但我必须承认不

  • 我已经使用过,我知道JIT-compiler的基本技术以及为什么要使用JIT-compilization。 然而,我仍然没有发现JVM是如何决定JIT编译一个方法的,即“当合适的时间来JIT编译一个方法时”。 我假设每个方法都开始被解释,只要它不被归类为“热方法”,它就不会被编译,这是对的吗?我在后脑勺上读到,当一个方法被执行至少10.000次(在解释该方法10.000次后,它将被编译)时,它被认

  • 我遇到过包的当前版本似乎不起作用并需要重新安装的情况。但是不会碰已经是最新的包。我看到了如何通过首先卸载(使用)然后安装来强制重新安装,但是有没有办法在一个步骤中简单地强制“更新”到名义上的当前版本?

  • 我在HashMap中存储的对象作为键覆盖equals(),但不是hashCode();当我在映射中放置一个对象时,equals()方法没有被调用。如果我还重写hashCode(),则会调用equals()方法。为什么? 为什么我不能使用自定义的equals方法来阻止向映射中添加对象,而不管我是否重写hashCode()? 谢谢 如果注释了hashCode(),则大小为2,否则大小为1。 我在想,如