当前位置: 首页 > 网络应用技术

JVM详细说明了实用执行引擎(Play Java,避免使用)

时间:2023-03-08 02:09:59 网络应用技术

  Java虚拟机的执行引擎子系统包含两种类型的执行器,即解释器和即时编译器。执行引擎获得JAVAC编译的字节代码文件后,将其转换为最终机械代码以通过解释器在运行时通过解释器执行。此外,为了提高效率,JVM添加了一种称为JIT Instant Compile的技术。即时编译器的目的是避免解释和执行一些频繁的执行代码。JIT将将整个功能编译为平台上的本地机械代码,以便大大提高执行效率。

  当Java程序运行时,执行方法或代码在某处执行代码时,将找到文件中的相应字节代码,然后将通过定义规范说明需要执行的字节代码指令。相应的本地机械机械与平台相对应的代码执行。当解释和执行字节码指令时,将执行PC寄存器(程序计数器)中记录的下一个订单,并根据PC寄存器(程序计数器)重新解释执行操作。

  在热点虚拟机中,解释器主要由解释器模块和代码模块组成。解释器模块实现了解释执行的核心功能。代码模块主要用于管理解释器生成的本地机械指令。

  解释器分为两种类型,模板解释器和C ++字节码解释器如下:

  本文首先进入一扇门,简要理解,然后谈论这一点。

  JVM操作期间使用的解释器+编译器混合执行模式通常是指JIT编译器。热点虚拟机中有两个JIT即时编译器。以及C2编译器,JVM在64-位系统中使用的C2编译器,即编译器。在参数期间使用编译器的编译器。以下如下::

  由于解释器很简单并且具有非常出色的跨平台,因此解释器执行了许多高级语言,例如汇编语言,例如语言,例如一件事,它不止一次:Java使用了一个称为JIT即时编译的技术以解决性能问题,即整个方法或代码块直接编译机器代码的成本,然后直接编译机器代码,然后将来执行这些方法或代码。,可以直接执行生成的机器代码。

  好?,在上述执行中更频繁执行的代码判断基准是什么?答案是:热点检测技术。

  可以看出,热点VM的名称是具有热代码检测功能的虚拟机。SO称为热代码是指具有更多调用并更频繁地执行的代码。当达到指定的阈值时,JIT将在代码的深度优化中直接将方法直接编译到与当前平台相对应的机器代码中,从而提高Java程序的性能。

  多次执行或具有大量循环的循环主体可以称为热代码,因此可以通过JIT将其作为本地计算机说明进行编译。

  在所有编程语言类似的所有编程语言中,它都属于静态编译,这意味着所有源代码都将在程序启动时将所有源代码汇编为与平台相对应的机器代码。此方法也被称为堆栈更换,有些地方也称为OSR替换。

  如前所述:“一种被多次执行的方法或代码中有大量周期的循环主体可以称为热点。”“循环几次被称为热代码?不可避免地会有一个阈值,JIT如何判断执行代码的数量是否达到此阈值?这主要取决于热代码检测技术。

  在HotSpotVM中,主要基于计数器实施热代码检测技术。HOTSPOT将为每种方法创建两种不同类型的计数器,即方法调用计数器(Invocation Count)和Backbing Counter。方法主体。

  2.2.1方法限制计数器方法默认情况下计数器的阈值为1500次,默认值在模式下为10,000次。当执行代码的数量达到此阈值时,将触发JIT。当然,如果您对这些默认值(默认值)值不满意,则还可以通过JVM参数独自指定它。

  当调用和执行方法时,它将首先检查该方法是否已由JIT编译。如果是这样,它将直接执行上次汇编后生成的本地计算机代码。相反,如果没有汇编,请先将计数器+1调用到该方法,然后确定计数器是否达到指定的阈值。如果尚未达到阈值标准,则解释器模式执行代码。如果达到指定的阈值,则提交了编译请求,并且JIT负责编译背景。背景线程汇编完成后,将生成本地机器代码指令。

  2.2.2边界计数器的后计数器的作用是计算方法中方法中的执行次数。在字节码中,遇到控制流以跳回到跳跃的指令称为“后边缘”。

  好?,汇编过程和反向调用计数器的汇编过程和方法几乎相同。唯一值得一提的是:该方法是调用计数器还是边界计数器,OSR编译请求的执行操作仍将通过解释的解释来解释该设备在不等待机器代码的情况下执行,直到编译操作为完全的。因为这段时间需要很长时间,因此只有在下次执行代码时才执行编译的机器代码。

  一般而言,如果Java程序在默认参数中激活一段时间。当柜台仍未到达JIT即时编译器编译时,计数器仍未达到编译阈值,然后此时将柜台减半。此时,它被称为一种称呼计数器的方法柜台。

  热衰减的发生的作用由虚拟机GC执行。热衰减可以通过参数关闭。标准。但是,如果降低热量,只要在线操作长时间,它将导致Java程序在线运行,并且该程序中的大多数方法都将不可避免地编译进入本地机器代码。

  同时,可以通过参数调整半年循环的时间,并且单元位于第二。

  一般而言,如果项目规模不大,并且很长一段时间后不需要版本迭代的产品,则可以尝试关闭热量衰减。这可以使Java程序在线运行更长的时间。内存,管理内存需要时间,但是执行程序时不需要执行Java程序,但是对于内存问题而言,不需要需要责任,因此负责GC机制)。

  在先前的分析中,我们了解到,基于计数器模式实现了热点中的热点检测,但是除了检测计数器外,它还可以基于采样和跟踪(跟踪)模式来进行热点在代码上的代码上。

  采样检测:使用此检测技术的虚拟机会检查每个线程的虚拟机堆栈的顶部。如果某些方法在检查过程中经常出现在堆栈的顶部,则通常调用和执行此方法。可以将类方法确定为热点方法。

  跟踪检测:以这种方式采用的虚拟机是使用经常执行的代码作为编译单元,仅编译该单元。该单元由线性和连续的指令集组成。只有一个入口,但是有多少,这也意味着基于痕迹编译的热代码不限于单独的方法或代码块。一个跟踪可能对应于多种方法,并且代码中的频率执行路径可以识别为不同的轨迹。

  热点虚拟机采用的计数检测方法可以在难度,汇编开销和精度检测之间实现良好的交易。这三个检测技术如下:

  上述情况可以被视为适当的。在JrockitVM中,删除了解释器模块,因此它在历史中获得了“最快”虚拟机的标题。

  至于为什么热点虚拟机保留这两个项目,有两个点:

  一个是确保Java的绝对交叉平台,另一个是确保启动速度并考虑全面的性能。①确保绝对交叉平台的性质:如果将解释器从虚拟机中删除,则代表:每次:您转到另一个平台,例如从Windows迁移到Linux环境,然后必须重新编制JIT以生成相应平台结构的机器代码,可以让Java程序执行。工作不必担心这个问题,因为解释器可以由解释器直接翻译为当前的机械代码以执行。将机器代码指令转换为与平台相对应的机器代码指令。这使Java More cross -platform.②确保确保Java的起始速度并考虑全面的性能:因为如果删除了解释器模块,则需要编译所有字节代码指令作为始终机械代码,如果您想在程序开始时作为机器代码指令编译整个程序中的所有字节代码指令,则所需的时间非常巨大。如果将口译员从JVM中删除,这将导致一些需要紧急启动才能上网。该项目可以汇编半天。

  当然,上面我们还提到,如果项目大小不大,并且在启动后很长一段时间内都不需要迭代,我们可以采用默认执行方法(解释器+JIT Instant Instant Instant Instant Compiler的混合模式已实现在一起。此时,您可以尝试关闭热量衰减,这可以使Java计划在网上运行更长的时间,并且性能会更好。只要在线运行时间足够长,C撰写的程序的性能几乎甚至超过它。

  从上面的分析可以看出,该机器在加热机中可以承受的交通负载将远远超出了冷机,因为执行过程中有许多类字节代码编译的类字节码。流到冷机上,由于无法运输流量,冷机中的服务器可能会被杀死。

  在生产环境的发布期间,它分批发布,并根据机器数量分为多批次。每个批次中最多占整个集群的1/8的机器数量。有这样的故障情况:发布发布平台时,程序员在批处理中释放。当输入批量总数时,填充组件的错误分两批发布。如果是热机状态,则一半的机器在正常情况下几乎无法携带流量,但是由于刚刚启动的JVM被解释并执行了,没有热代码统计信息和JIT动态汇编。机器启动后,服务器的服务器立即吸引了,此故障显示了JIT的存在。

  从上面的情况下,可以知道,如果加热机中的流量直接移至冷机不可行,则通常是在扩展计划的时候,流量将顺利切换到新机器。通常,有软件和硬件。两个级别的解决方案如下:

  JVM操作期间使用的解释器+编译器混合执行模式通常是指JIT编译器,在Java中静态编译器的应用中相对较小。两个Instant Instant Compilers嵌入了热点虚拟机中,与之相同C1和C2编译器,通常称为C1和C2编译器。64位系统中使用的C2编译器,即编译器。以下如下::

  让我们简要分析C1和C2编译器。

  C1编译器主要追求稳定性和编译速度。这是一个保守派。C1中有几种常见的优化方案:公共儿童表达消除,方法内部连接,DE -VIRTUATIALITION和冗余消除。

  C2编译器主要追求编译的性能。它属于激进分子。C2编译器基于C1编译器的基本优化。除了在C1中使用优化方法外,基于逃生分析的逃生分析类型。审计优化方法:标量更换,堆栈分配和同步消除。

  如前所述,64位JVM默认使用C2编译器,但实际上,如果它是JDK1.6之后的64位计算机,则当默认情况可能指定-Server模式运行时,JVM将转动关于得分汇编策略,是通过C1+C2合作一起处理汇编任务。分层编译的一般逻辑是:当Java程序仍在冷机中时,C1编译器将使用C1编译器来优化它,以追求它汇编的速度和稳定性。当JVM到达热机状态时,以后的汇编请求是通过C2编译的,设备是全面而激进的,在编译后追求执行的性能和效率。

  PS:正在运行两种不同的模式,热代码缓存区域的大小将不同。服务器模式下的CodeCache的初始大小为2496KB,客户端模式下的CodeCache的初始大小为160KB。可以通过参数指定CodeCache的最大大小。

  编译器:当JDK10时,热点添加了一个新编译器

  在JVM中执行引擎的位置:

  执行发动机流程图:

  - - 互联网上的Attais

  一般而言,在将字节代码加载到内存中后,它将通过几个步骤后的土地翻译的机械指令执行,但是这些优化步骤不需要。通常,尽管优化过程将花费一些时间,但在执行时可以大大提高程序的速度,因此总是比缺点更好。

  执行引擎的数据是字节代码文件,热点虚拟机中类文件结构的定义如下:

  任何后缀的Java源代码将按照上述格式诞生为字节码文件。执行引擎收到的输入格式也是上述格式的文件,但值得注意的是,JVM不仅是:JVM不仅是一个文件由文件编译,但适用于满足上述格式规格的所有字节码文件。

  热点虚拟机基于堆栈类型,这意味着执行该方法的引擎时,执行堆栈帧。相关信息。但是,当执行引擎在虚拟机中运行时,它仅执行顶部 -堆栈框架,因为堆栈框架的顶层当前是需要执行的方法。新的堆栈框架)取出以继续执行。刚刚提到的方法的相关信息存储在堆栈帧中,方法是堆栈框架的信息是从字节码文件中读取的。每种方法由结构描述,如下:

  原始:https://juejin.cn/post/7102783284018577422