热点检测
自适应优化通过利用有趣的程序属性解决了JIT编译的问题。实际上,所有程序都将大部分时间都花在执行少量代码上。Java HotSpot VM不会立即编译方法,而是立即使用解释器运行程序,并在运行时分析代码以检测程序中的关键热点。然后,它将本地代码优化器的注意力集中在热点上。通过避免不经常执行的代码(程序的大部分)的编译,Java HotSpot编译器可以将更多的注意力放在程序的性能关键部分上,而不必增加总的编译时间。随着程序的运行,热点监视将动态地继续进行,
这种方法的一个微妙但重要的好处是,通过将编译延迟到代码执行了一段时间之后(以机器时间而非用户时间来衡量),可以收集有关代码使用方式的信息,然后加以利用进行更智能的优化。同样,减少了内存占用。除了在程序中收集有关热点的信息外,还会收集其他类型的信息,例如有关用于虚拟方法调用的主叫方关系的数据。
参考官方链接:https://www.oracle.com/java/technologies/whitepaper.html#method
方法内联
Java编程语言中虚拟方法调用的频率是重要的优化瓶颈。一旦Java HotSpot自适应优化器在执行期间收集了有关程序热点的信息,它不仅将热点编译为本机代码,而且还会对该代码执行大量的方法内联。
内联具有重要的好处。它大大降低了方法调用的动态频率,从而节省了执行这些方法调用所需的时间。但更重要的是,内联会产生更大的代码块,以供优化程序使用。这就产生了一种情况,大大提高了传统编译器优化的效率,克服了提高Java编程语言性能的主要障碍。
内联与其他代码优化具有协同作用,因为它使它们更有效。随着Java HotSpot编译器的成熟,对大型内联代码块进行操作的能力将为将来的许多更高级的优化打开大门。
参考官方链接:https://www.oracle.com/java/technologies/whitepaper.html#method
方法内联个人笔记:Java 方法内联
动态反优化
内联是一项重要的优化,但是传统上,对于像Java语言这样的面向动态对象的语言,执行内联一直非常困难。此外,尽管检测热点并内联它们调用的方法非常困难,但仍不足以提供完整的Java编程语言语义。这是因为用Java语言编写的程序不仅可以即时更改方法调用的模式,而且还可以将新的Java代码动态地加载到正在运行的程序中。
内联基于全局分析的形式。动态加载显着使内联复杂化,因为它更改了程序中的全局关系。新类可能包含需要在适当位置内联的新方法。因此,即使在执行针对热点的代码时,Java HotSpot VM也必须能够动态地取消优化(然后在必要时重新优化)先前优化的热点。如果没有此功能,就无法在基于Java技术的程序上安全地执行常规内联。
参考官方链接:https://www.oracle.com/java/technologies/whitepaper.html#method