具体实施方式
为了使本领域技术人员更好地理解本说明书实施例中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行详细地描述,显然,所描述的实施例仅仅是本说明书的一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于保护的范围。
Java程序运行过程包括两个步骤,依次为:通过编译器将Java源码编译成字节码,通过JVM将字节码编译为机器指令并执行,其中,JVM将字节码编译为机器指令并执行的过程又可分为两种方式,其一:针对热点代码,在首次执行热点代码时,通过JIT编译器直接将热点代码编译为机器指令后执行,并将编译好的机器指令存储在缓存区中,以供下一次执行时直接从缓存区获取已编译好的机器指令;其二,针对非热点代码,按照常规方式对字节码进行逐行解释并执行。
上述热点代码是指运行特别频繁的方法函数或代码块,例如,当某个方法函数的被调用次数达到一定阈值,例如10000次,则该方法函数为热点代码,又例如,某个循环类型的方法函数的循环次数达到一定阈值,则该方法函数为热点代码。
然而,现有技术中,JVM是在设备启动之后,也即大量业务流量涌入之后才启用JIT编译器对热点代码进行编译的,而在分布式系统中,单机高并发请求发生地越来越突然,持续时间也越来越长,从而,单机高并发请求发生时,JIT编译器对大量业务流量进行编译的过程很可能会造成设备负载飙升,CPU利用率飙升,从而导致设备针对部分业务流量的处理超时,进一步很可能导致设备不可用,更有甚者将由于单台设备不可用从而导致整个集群故障。
基于此,本说明书实施例提供一种Java虚拟机启动时预热的方法,该方法中,在JVM启动过程中,即提前将某些热点代码优化到最佳状态,或者将运行热点代码所需数据提前准备充分,以应对设备启动后突然出现的流量洪峰。
如下,示出下述实施例对Java虚拟机启动时预热的方法进行说明:
请参见图1,为本说明书实施例示例出的一种Java虚拟机启动时预热的方法的实施例流程图,该方法发生在Java虚拟机启动过程中,可以包括以下步骤:
步骤101:根据预设的系统关键字与历史编译日志确定待预热方法函数。
在本说明书实施例中,JVM开始启动后,即可根据预先配置的静态文件开启预热过程,该静态文件中至少可以包括:系统关键字、预热超时时间、指定时间范围,其中,系统关键字可以包括待预热方法函数的方法属性,例如函数名称、代码路径等,预热超时时间则可以用于指示预热时长,即预热过程持续时长不得超过的最大时长,指定时间范围则可以用于指示待预热方法函数的历史编译时间范围,也即可以仅对编译时刻属于该指定时间范围内的待预热方法函数进行预热。
基于上述静态文件,在本说明书实施例中,则可以从历史编译日志中筛选出已编译完成,且编译时刻属于上述指定时间范围的方法函数,为了描述方便,将该些方法函数称为候选方法函数,例如,如图2所示,为候选方法函数列表的一种示例,在图2中,每一行记载有一个候选方法函数的方法属性,该方法属性包括代码路径与函数名称,其中,“::”前边为代码路径,“::”后边为函数名称,例如,以图2中的第一行为例,“com.aLipay.securitycenter.test.jit.jitCompLier”为代码路径,“calcSum”为函数名称。
在一实施例中,可以采用文件监听的方式从历史编译日志中筛选出候选方法函数,并且,在筛选候选方法函数时,还可以监听JVM的关闭钩子,以保证当JVM正常关闭时,将筛选出来的候选方法函数写入硬盘。
在一实施例中,可以按照时间升序的顺序,从历史编译日志中筛选出候选方法函数,并且,可以以“天”为单位,将筛选出的候选方法函数分文件存储在内存中。
进一步,则可以根据上述系统关键字,在候选方法函数中,查找到方法属性与系统关键字相匹配的方法函数,在说明书实施例中,方法属性与系统关键字相匹配的方法函数则为待预热方法函数,例如,图2中的第二行中所记载的方法函数即为待预热方法函数。
此外,由于在编写Java源码时,可以使用方法调用方式,例如,在图2中,第二行所记载的方法函数“doubleValue”则被第一行所记载的方法函数“calcSum”调用,为了描述方便,可以将被其它方法函数调用的方法函数称为内嵌函数,例如,“doubleValue”这一方法函数即为内嵌函数,而调用内嵌函数的方法则称为内嵌函数的上一层级的方法函数,而本领域技术人员可以理解的是,该上一层级的方法函数同时又可以为某一方法函数的内嵌函数,也即,对于某一内嵌函数而言,其可以具有多个层级的上层函数。
在本说明书实施例中,可以以最上层的方法函数作为预热入口,从而,在查找到方法属性与系统关键字相匹配的方法函数后,还可以进一步判断该方法函数是否为内嵌函数,若是,则将其各级上层方法函数均确定为待预热方法函数,例如,如图3所示,为待预热方法函数列表的一种示例,该图3所示例的待预热方法函数列表中包括编译时刻,序号,方法属性,例如,在图3所示例的第一行中,“2017-11-10T01:43:22.068+0800”表示编译时刻,318表示序号,其它部分则表示方法属性。
步骤102:获取待预热方法函数对应的单元测试用例。
在本说明书实施例中,确定待预热方法函数之后,可以进一步在Java源码中获取待预热方法函数对应的单元测试用例,本领域技术人员可以理解的是,开发人员在编写Java源码时,即可为全部或某些方法函数编写单元测试用例,例如,如图4所示,为图3中所示例的待预设方法函数对应的单元测试用例的一种示例。
如图4所示,单元测试用例带有自定义注解@PreJitHot,从而,在Java源码中查找待预热方法函数对应的单元测试用例时,则可以根据自定义注解@PreJitHot与待预热方法函数的方法属性共同查找。
步骤103:执行待预热方法函数对应的单元测试用例。
在本说明书实施例中,可以调用多个线程分别重复执行各个待预热方法函数对应的单元测试用例,直至各个单元测试用例的被执行次数均达到预设次数,或者是直至执行时长达到预设时长,其中,该预设时长即可以为上述步骤101中描述的超时时间。
需要说明的是,若待预热方法函数包括多个层级的方法函数,例如如图4所示例的待预热方法函数列表中包括两个层级的方法函数,则可以从最上层的待预热方法函数对应的单元测试用例开始,按照从上到下的层级顺序依次执行各个层级的待预热方法函数各自对应的单元测试用例。
至此,则完成了本说明书实施例提供的Java虚拟机启动时预热的过程。
此外,在本说明书实施例中,若采取严格模式时,还可以进一步通过查看历史编译日志以确定是否完成预热过程,也即通过是否可以在历史编译日志中查找到执行待预热方法函数对应的单元测试用例的相关记录,来确定是否完成预热过程,需要说明的是,本说明书实施例对是否采取严格模式并不作限制。
此外,在完成本说明书实施例提供的Java虚拟机启动时预热的过程之后,设备则可以正常加载业务模块并启动成功了,待启动成功之后,设备则可以打开对外流量的监听接口,以允许流量进入。
本说明书实施例所提供的技术方案,通过在Java虚拟机启动过程中执行如下步骤:根据预设的系统关键字与历史编译日志确定待预热方法函数,获取待预热方法函数对应的单元测试用例,执行单元测试用例,由于根据预设的系统关键字确定待预热方法函数,从而可以实现灵活定制不同的预热策略,并且,通过复用现有的单元测试用例即可实现方法级别的精准预热,无需额外编码,节省人力物力,同时,通过在Java虚拟机启动过程中即完成预热,可以实现提前将热点代码优化到最佳状态,以及将运行热点代码所需数据准备充分,以应对设备启动后突然出现的流量洪峰。
相应于上述方法实施例,本说明书实施例还提供一种Java虚拟机启动时预热的装置,请参见图5,为本说明书实施例示例出的一种Java虚拟机启动时预热的装置实施例框图,该装置可以包括:确定模块51、获取模块52,以及执行模块53。
其中,确定模块51,可以用于根据预设的系统关键字与历史编译日志确定待预热方法函数;
获取模块52,可以用于获取所述待预热方法函数对应的单元测试用例;
执行模块53,可以用于执行所述单元测试用例。
在一实施例中,所述确定模块51可以包括(图5中未示出):
筛选子模块,用于从历史编译日志中筛选出已编译完成,且编译时刻属于指定时间范围的候选方法函数;
匹配子模块,用于确定所述候选方法函数中方法属性与预设的系统关键字相匹配的方法函数为待预热方法函数,所述方法函数属性至少包括方法名称、代码路径。
在一实施例中,所述执行模块53可以具体用于:
调用多个线程分别重复执行各个待预热方法函数对应的单元测试用例,直至各个所述单元测试用例的被执行次数均达到预设次数。
在一实施例中,所述执行模块53可以具体用于:
调用多个线程分别重复执行各个待预热方法函数对应的单元测试用例,直至执行时长达到预设时长。
在一实施例中,所述装置还可以包括(图5中未示出):
判断模块,用于判断所述方法函数属性与预设的系统关键字相匹配的方法函数是否为内嵌函数;
处理模块,用于若所述方法属性与预设的系统关键字相匹配的方法函数为内嵌函数,则确定所述方法属性与预设的系统关键字相匹配的方法函数的各级上层方法函数为待预热方法函数。
在一实施例中,所述执行模块53可以具体用于:
若所述待预热方法函数包括多个层级的方法函数,则从最上层的待预热方法函数对应的单元测试用例开始,按照从上至下的层级顺序依次执行各个层级的待预热方法函数各自对应的单元测试用例。
可以理解的是,确定模块51、获取模块52,以及执行模块53作为三种功能独立的模块,既可以如图5所示同时配置在装置中,也可以分别单独配置在装置中,因此图5所示的结构不应理解为对本说明书实施例方案的限定。
此外,上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
本说明书实施例还提供一种计算机设备,其至少包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行所述程序时实现前述的一种Java虚拟机启动时预热的方法,该方法至少包括:在Java虚拟机启动过程中执行以下步骤:根据预设的系统关键字与历史编译日志确定待预热方法函数;获取所述待预热方法函数对应的单元测试用例;执行所述单元测试用例。
在一实施例中,所述根据预设的系统关键字与历史编译日志确定待预热方法函数,包括:
从历史编译日志中筛选出已编译完成,且编译时刻属于指定时间范围的候选方法函数;
确定所述候选方法函数中方法属性与预设的系统关键字相匹配的方法函数为待预热方法函数,所述方法属性至少包括方法名称、代码路径。
在一实施例中,所述执行所述单元测试用例,包括:
调用多个线程分别重复执行各个待预热方法函数对应的单元测试用例,直至各个所述单元测试用例的被执行次数均达到预设次数。
在一实施例中,所述执行所述单元测试用例,包括:
调用多个线程分别重复执行各个待预热方法函数对应的单元测试用例,直至执行时长达到预设时长。
在一实施例中,在所述确定所述候选方法函数中方法函数属性与预设的系统关键字相匹配的方法函数为待预热方法函数之后,所述方法还包括:
判断所述方法属性与预设的系统关键字相匹配的方法函数是否为内嵌函数;
若是,则确定所述方法属性与预设的系统关键字相匹配的方法函数的各级上层方法函数为待预热方法函数。
在一实施例中,所述执行所述单元测试用例,包括:
若所述待预热方法函数包括多个层级的方法函数,则从最上层的待预热方法函数对应的单元测试用例开始,按照从上至下的层级顺序依次执行各个层级的待预热方法函数各自对应的单元测试用例。
图6示出了本说明书实施例所提供的一种更为具体的计算机设备硬件结构示意图,该设备可以包括:处理器610、存储器620、输入/输出接口630、通信接口640和总线650。其中处理器610、存储器620、输入/输出接口630和通信接口640通过总线650实现彼此之间在设备内部的通信连接。
处理器610可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
存储器620可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器620可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器620中,并由处理器610来调用执行。
输入/输出接口630用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图6中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口640用于连接通信模块(图6中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线650包括一通路,在设备的各个组件(例如处理器610、存储器620、输入/输出接口630和通信接口640)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器610、存储器620、输入/输出接口630、通信接口640以及总线650,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前述的一种Java虚拟机启动时预热的方法,该方法至少包括:在Java虚拟机启动过程中执行以下步骤:根据预设的系统关键字与历史编译日志确定待预热方法函数;获取所述待预热方法函数对应的单元测试用例;执行所述单元测试用例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法函数或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本说明书实施例可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本说明书实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本说明书实施例各个实施例或者实施例的某些部分所述的方法函数。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法函数实施例,所以描述得比较简单,相关之处参见方法函数实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本说明书实施例方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本说明书实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本说明书实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本说明书实施例的保护范围。