上一篇文章提到了汇编阈值。当方法调用的数量和周期数的总和时,当达到编译阈值时,服务器编译器将编译热代码。LET简要介绍了内部细节。本章中提到的内容不建议您使用手动优化,仅作为理解原则。
当达到汇编阈值时,方法或周期将输入,并且背景线的代码不同步以获得队列。
这不是一个严格的先进,而是执行的代码越优先级。这也是上一章。当我们通过徽标检查汇编方法时,原因越来越多地增加。
使用不同的编译器,在不同平台下将有不同的线程,这与平台上的CPU数量有关。
一般而言,使用客户端编译器将打开线程;使用服务器编译器,将打开两个线程。当打开分层编译时,将打开多个线程。在不同平台的CPU数量下,线程数将不同。在分层编译器中,客户端编译器将被称为C1编译器并编译服务器编译。该设备称为C2编译器,我们这样称呼它们,只需列出一些情况:
1 1 1 1 1 1 1 1 1 1 2 8 1 2 16 2 6 3 7 64 4 8 128 4我们通过徽标查看当前JVM的线程数。
我的服务器是2个内核,因此是2。它包含一个客户端线程和服务器线程。
这是编译器中最重要的性能优化。我们所熟悉的Java实体类通常会将Getter和Setter方法添加到每个属性中。与直接访问变量相比,该方法的调用将具有较大的性能开销。
该方法调用JVM,存在于虚拟机堆栈的堆栈框架中,整个呼叫链较长,并且会有更大的性能损失。
有以下代码:
在JVM帮助我们在编译时执行内部对联之后,将有以下代码:
如上所示,GET和集合方法的调用已被直接属性调用替换。
您可以通过以下方式查看内部关联属性:
默认值已打开。该参数对性能产生巨大影响,不建议关闭。
触发方法是有条件的,并非所有代码都是内部的。
内部联邦是否可以取决于方法代码是否与之相关。
逃生分析只是检查变量,检查变量的位置,并检测其他区域是否使用它。如果它不超过范围,它是局部变量,我们可以对此变量进行更优化。
如果通过外部方法调用它,则称为逃脱的方法。如果由外部线程调用,则称为线程逃脱。
JAVA8中的逃生分析默认打开:
打开逃生分析后,服务器编译器将非常激进:
当然,有许多复杂的优化。这里不建议这样做,因为我们不建议我们优化逃生分析。
但是我们可以在逃生分析上解决一些问题:
原始:https://juejin.cn/post/7111091157240643615