字符串对象的处理方法、装置、计算机设备和存储介质与流程

文档序号:14774006发布日期:2018-06-23 02:30阅读:224来源:国知局
字符串对象的处理方法、装置、计算机设备和存储介质与流程

本申请涉及计算机技术领域,特别是涉及一种字符串对象的处理方法、装置、计算机设备和存储介质。



背景技术:

目前,Java语言(一种面向对象编程语言)广泛用于实现不同应用程序,如ERP应用程序(Enterprise Resource Planning企业资源计划系统)。基于Java语言的应用程序(以下简称“Java程序”)需要在JVM(Java Virtual Machine,Java虚拟机)中运行。当Java程序启动时,Java程序所在计算机设备的操作系统从操作系统内存中给JVM分配内存(以下称“JVM内存”)。JVM内存包括堆内存和其他内存,其中堆内存是JVM内存中最大的一块内存。当在JVM中运行Java程序时,Java程序在JVM内存中创建需要的字符串对象。

传统方式只能采用Java语言的软件开发工具包(JDK)提供的String类创建字符串对象。但根据JDK的内存管理机制,采用JDK提供的String类创建的字符串对象只能存储在JVM的堆内存中,由于堆内存是有限的,使得在Java程序需要大量字符串对象时,容易发生OOM(Out of memory,内存溢出)。大量堆内存的占用也会导致Full GC(Full Garbage Collection,超负荷垃圾回收),使得Java进程停止服务,造成Java程序卡顿的现象。



技术实现要素:

基于此,有必要针对上述技术问题,提供一种能够减少堆内存占用的字符串对象的处理方法、装置、计算机设备和存储介质。

一种字符串对象的处理方法,所述方法包括:

获取Java程序包含的字符串信息以及对应的内存申请信息;

对所述字符串信息进行转化,得到字符序列;

利用所述字符序列和所述内存申请信息生成字符串对象创建请求,将所述字符串对象创建请求发送至宿主机,使所述宿主机根据所述内存申请信息从操作系统内存为所述字符序列分配相应的堆外内存;

将所述字符序列作为字符串对象存储至所述堆外内存。

在其中一个实施例中,在获取Java程序包含的字符串信息以及对应的内存申请信息的步骤之前,还包括:当所述Java程序启动时,向所述宿主机发送Java程序运行请求,获取所述宿主机根据Java程序运行请求从所述操作系统内存分配的JVM内存;所述操作系统内存包括所述JVM内存和目标内存;所述JVM内存包括堆内存和直接内存;所述堆外内存包括所述目标内存或所述直接内存中的至少一种。

在其中一个实施例中,对所述字符串信息进行转化,得到字符序列的步骤,包括:对所述字符串信息进行拆分处理,得到所述字符序列。

在其中一个实施例中,所述内存申请信息包括基于第一接口的目标内存访问信息;利用所述字符序列和所述内存申请信息生成字符串对象创建请求的步骤,包括:获取所述字符串信息,计算对应的内存空间;比较所述内存空间的大小是否达到阈值;当所述内存空间的大小达到阈值时,利用所述字符序列和所述基于第一接口的目标内存访问信息生成字符串对象创建请求。

在其中一个实施例中,所述内存申请信息包括基于第二接口的直接内存访问信息;利用所述字符序列和所述内存申请信息生成字符串对象创建请求的步骤,包括:获取所述字符串信息,计算对应的内存空间;比较所述内存空间的大小是否达到阈值;当所述内存空间的大小未达到阈值时,利用所述字符序列和所述基于第二接口的直接内存访问信息生成字符串对象创建请求。

在其中一个实施例中,所述方法还包括:向所述宿主机发送字符串对象引用请求,所述字符串对象引用请求携带了所述字符序列的内存地址索引和字符长度,使所述宿主机根据所述内存地址索引和字符长度在所述堆外内存中读取对应的所述字符序列;所述字符序列包括多个字符;接收所述宿主机返回的多个字符,通过将多个字符进行拼接,将所述字符序列转换为字符串对象。

在其中一个实施例中,所述方法还包括:按照预设频率检测所述字符串对象是否被引用;当所述字符串对象未被引用时,从所述堆外内存中将相应的字符串对象进行释放,对所述堆外内存进行回收。

一种字符串对象的处理装置,所述装置包括:宿主机以及运行在所述宿主机上的JVM虚拟机;当Java程序运行时,所述JVM虚拟机用于获取所述Java程序包含的字符串信息以及对应的内存申请信息,对所述字符串信息进行转化,得到字符序列,利用所述字符序列和所述内存申请信息生成字符串对象创建请求,将所述字符串对象创建请求发送至宿主机;所述宿主机用于根据所述内存申请信息从操作系统内存为所述字符序列分配相应的堆外内存;所述JVM虚拟机还用于将所述字符序列作为字符串对象存储至所述堆外内存。

在其中一个实施例中,当所述Java程序启动时,所述JVM虚拟机还用于向所述宿主机发送Java程序运行请求;所述宿主机还用于根据所述Java程序运行请求从所述操作系统内存给所述JVM虚拟机分配JVM内存;所述JVM虚拟机还用于在所述JVM内存中运行所述Java程序;所述操作系统内存包括所述JVM内存和目标内存;所述JVM内存包括堆内存和直接内存;所述堆外内存包括所述目标内存或所述直接内存中的至少一种。

在其中一个实施例中,所述JVM虚拟机还用于对所述字符串信息进行拆分处理,得到所述字符序列。

在其中一个实施例中,所述内存申请信息包括基于第一接口的目标内存访问信息;所述JVM虚拟机还用于获取所述字符串信息,计算对应的内存空间,比较所述内存空间的大小是否达到阈值,当所述内存空间的大小达到阈值时,利用所述字符序列和所述基于第一接口的目标内存访问信息生成字符串对象创建请求。

在其中一个实施例中,所述内存申请信息包括基于第二接口的直接内存访问信息;所述JVM虚拟机还用于获取所述字符串信息,计算对应的内存空间,比较所述内存空间的大小是否达到阈值,当所述内存空间的大小未达到阈值时,利用所述字符序列和所述基于第二接口的直接内存访问信息生成字符串对象创建请求。

在其中一个实施例中,当需要引用字符串对象时,所述JVM虚拟机还用于向所述宿主机发送字符串对象引用请求,所述字符串对象引用请求携带了所述字符序列的内存地址索引和字符长度;所述宿主机还用于根据所述内存地址索引和字符长度在所述堆外内存中读取对应的所述字符序列,所述字符序列包括多个字符,将多个字符返回至所述JVM虚拟机;所述JVM虚拟机还用于通过将多个字符进行拼接,将所述字符序列转换为字符串对象。

在其中一个实施例中,所述JVM虚拟机还用于按照预设频率检测所述字符串对象是否被引用;当所述字符串对象未被引用时,从所述堆外内存中将相应的字符串对象进行释放,对所述堆外内存进行回收。

一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任一项方法的步骤。

一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一项方法的步骤。

上述字符串对象的处理方法、装置、计算机设备和存储介质,通过对Java程序中的字符串信息进行转化,可以将字符串转换为字符序列;利用转换得到的字符序列以及Java程序中的内存申请信息,可以向宿主机申请堆外内存,从而可以实现在堆外内存中创建和存储字符串对象。将字符串转换为非字符串的字符序列,且根据特定的内存申请信息访问宿主机的堆外内存,可以突破JDK关于字符串对象只能在堆内存中创建和存储的内存管理机制,自由的使用宿主机的操作系统内存来创建和存储字符串对象,进而可以减少堆内存的占用,减少GC与OOM的发生,提高Java程序的稳定性与流畅性。

附图说明

图1为一个实施例中字符串对象的处理方法的应用场景图;

图2为一个实施例中字符串对象的处理方法的流程示意图;

图3为一个实施例中计算机设备的内部结构图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。

本申请提供的字符串对象创建与存储方法,可以应用于如图1所示的应用环境中。其中,宿主机102上运行了JVM虚拟机104。JVM虚拟机104中部署了Java程序。当Java程序启动时,JVM虚拟机104向宿主机102发送Java程序运行请求,宿主机102的操作系统根据Java程序运行请求,从操作系统内存为JVM虚拟机104分配JVM内存。操作系统内存是指宿主机102中用于保存进程运行时程序和数据的总内存,包括“内存条”存储器的存储空间。操作系统内存包括JVM内存和目标内存。其中,JVM内存是指JVM虚拟机104的专用内存。目标内存是指操作系统内存中除JVM内存之外的其他内存。JVM内存包括堆内存和直接内存。

本实施例提供一种可以在堆外内存中创建和存储字符串对象(以下称“Str对象”)的目标接口。当创建的字符串对象需要占用大量堆内存的存储空间时,可以选择在Java程序中调用目标接口,利用目标接口在堆外内存中创建字符串对象,以减少堆内存的占用。当Java程序在宿主机102上运行时,JVM虚拟机104加载Java程序,获取Java程序包含的字符串信息。字符串信息包括一个或多个字符串的内容。若Java程序调用了目标接口,则Java程序中还记录了字符串信息对应的内存申请信息。内存申请信息包括基于第一接口的目标内存访问信息或基于第二接口的直接内存访问信息。其中,第一接口可以是Unsafe接口(一种用于访问目标内存的接口),第二接口可以是Java NIO接口(一种用于访问直接内存的接口)。JVM虚拟机104在Java程序中获取内存申请信息。JVM虚拟机104利用目标接口对字符串信息进行拆分处理,得到字符序列。JVM虚拟机104利用字符序列和内存申请信息生成字符串对象创建请求,将字符串对象创建请求发送至宿主机102。宿主机104根据内存申请信息从操作系统内存为字符序列分配相应的堆外内存。堆外内存可以是目标内存,也可以是直接内存。JVM虚拟机104将字符序列封装为字符串对象,将字符串对象存储至分配得到的堆外内存中。上述字符串对象创建过程,通过将字符串转换为字符序列,并通过第一接口或者第二接口向宿主机申请堆外内存,可以将字符序列存储至堆外内存,从而可以减少堆内存的占用。

在一个实施例中,如图2所示,提供了一种字符串对象创建与存储方法,以该方法应用于图1中的JVM虚拟机为例进行说明,包括以下步骤:

步骤202,获取Java程序包含的字符串信息以及对应的内存申请信息。

Java程序可以是任意基于Java语言的应用程序。

在一个实施例中,在获取Java程序包含的字符串信息以及对应的内存申请信息的步骤之前,还包括:当Java程序启动时,向宿主机发送Java程序运行请求,获取宿主机根据Java程序运行请求从操作系统内存分配的JVM内存;操作系统内存包括JVM内存和目标内存;JVM内存包括堆内存和直接内存;堆外内存包括目标内存或直接内存中的至少一种。

当Java程序启动时,JVM虚拟机向宿主机发送Java程序运行请求,宿主机的操作系统根据Java程序运行请求,从操作系统内存为JVM虚拟机分配JVM内存。操作系统内存是指宿主机中用于保存进程运行时程序和数据的总内存,包括“内存条”存储器的存储空间。在另一个实施例中,操作系统内存还包括扩展内存,如虚拟内存。操作系统内存包括JVM内存和目标内存。其中,JVM内存是指JVM虚拟机的专用内存。目标内存是指操作系统内存中除JVM内存之外的其他内存。JVM内存包括堆内存和直接内存。容易理解,扩展内存属于目标内存。

传统的基于JDK的内存管理机制,JVM虚拟机只能采用JDK提供的String类函数在堆内存中创建和存储字符串对象(以下称“String对象”)。例如,String str=“hello world”。容易理解,String对象会占用有限的堆内存,使得在Java程序需要大量字符串对象时容易发生GC或OOM,使得Java进程停止服务,造成Java程序卡顿的现象。虽然Java程序可以通过多种方式来避免OOM的发生,如把大任务拆分为多个小任务执行,避免一次性申请太大的堆内存空间,但这不但难以从根源上规避OOM,且会增加Java程序的程序代码复杂度。

为了解决上述问题,本实施例提供一种可以在堆外内存中创建和存储字符串对象的目标接口。为了与传统的在堆内存中创建的String对象进行区分,将在堆外内存中创建的字符串对象记作Str对象。堆外内存包括目标内存或直接内存中的至少一种。当创建的字符串对象需要占用大量堆内存的存储空间时,可以选择在Java程序中调用目标接口,利用目标接口在堆外内存中创建字符串对象,以减少堆内存的占用。

Java程序的程序代码包含了需要创建的字符串对象的信息(以下称“字符串信息”)。字符串信息包括至少一个String字符串或char数组(字符数组),如上述举例中的String字符串“Hello world!”。JVM虚拟机加载执行Java程序,获取Java程序包含的字符串信息。若Java程序调用了上述目标接口,则Java程序的程序代码还包含了字符串信息对应的内存申请信息。内存申请信息包括基于第一接口的目标内存访问信息或基于第二接口的直接内存访问信息。

步骤204,对字符串信息进行转化,得到字符序列。

JVM虚拟机利用目标接口将字符串信息转换为字符序列(CharSequence)。

在一个实施例中,对字符串信息进行转化,得到字符序列的步骤,包括:对字符串信息进行拆分处理,得到字符序列。

目标接口包括字符转换脚本。当字符串信息包括char数组时,JVM虚拟机利用字符转换脚本对char数组进行拆分处理,得到字符序列。字符序列包括多个字符。当字符串信息包括String字符串时,JVM虚拟机利用字符转换脚本将String字符串转换为char数组,按照上述方式对转换得到的char数组进行拆分处理,得到字符序列。

以内存申请信息为基于第一接口的目标内存访问信息为例,对应的字符转换脚本记录的程序代码可以如表1所示:

表1

JVM虚拟机利用目标接口可以将字符串(String字符串或char数组)转换为非字符串(字符序列),从而可以不受JDK的内存管理机制的限制,可以在宿主机的操作系统内存中自由申请内存。

步骤206,利用字符序列和内存申请信息生成字符串对象创建请求,将字符串对象创建请求发送至宿主机,使宿主机根据内存申请信息从操作系统内存为字符序列分配相应的堆外内存。

步骤208,将字符序列作为字符串对象存储至堆外内存。

JVM虚拟机利用转换得到的字符序列以及在Java程序中获取到的内存申请信息生成字符串对象创建请求,将字符串对象创建请求发送至宿主机。当内存申请信息为基于第一接口的目标内存访问信息时,JVM虚拟机通过第一接口向宿主机申请目标内存。其中,第一接口可以是Unsafe接口。当内存申请信息为基于第二接口的直接内存访问信息时,JVM虚拟机通过第二接口向宿主机申请直接内存。其中,第二接口可以是Java NIO接口。字符串对象创建请求携带了字符序列的序列长度信息以及对应的需要申请的存储空间。宿主机根据序列长度信息和内存申请信息从操作系统内存为字符序列分配相应存储空间的目标内存或直接内存。

目标接口还包括字符封装脚本。JVM虚拟机利用字符封装脚本将字符序列封装为Str对象。字符封装脚本可以如表2所示:

表2

JVM虚拟机将Str对象存储至宿主机分配的目标内存或直接内存。宿主机完成Str对象的存储后,向JVM虚拟机返回Str对象的内存地址索引。

本实施例中,通过对Java程序中的字符串信息进行转化,可以将字符串转换为字符序列;利用转换得到的字符序列以及Java程序中的内存申请信息,可以向宿主机申请堆外内存,从而可以实现在堆外内存中创建和存储字符串对象。将字符串转换为非字符串的字符序列,且根据特定的内存申请信息访问宿主机的堆外内存,可以突破JDK关于字符串对象只能在堆内存中创建和存储的内存管理机制,自由的使用宿主机的操作系统内存来创建和存储字符串对象,进而可以减少堆内存的占用,减少GC与OOM的发生,提高Java程序的稳定性与流畅性。

在一个实施例中,内存申请信息包括基于第一接口的目标内存访问信息;利用字符序列和内存申请信息生成字符串对象创建请求的步骤,包括:获取字符串信息,计算对应的内存空间;比较内存空间的大小是否达到阈值;当内存空间的大小达到阈值时,利用字符序列和基于第一接口的目标内存访问信息生成字符串对象创建请求;当内存空间的大小未达到阈值时,利用字符序列和基于第二接口的直接内存访问信息生成字符串对象创建请求。

JVM虚拟机可以利用启动参数MaxDirectMemorySize对可以申请的直接内存的存储空间上限值进行设置。若未进行设置,可以申请的直接内存的存储空间上限值设置为默认值。由于可以申请的直接内存的存储空间是有限制的,JVM虚拟机可以通过计算字符串信息需要申请的内存空间的大小,根据对内存空间的大小是否达到阈值的判断结果来选择向宿主机申请目标内存还是直接内存。其中,阈值可以是根据上述可以申请的直接内存的存储空间上限值设定的。

当判断结果为内存空间的大小达到阈值时,JVM虚拟机利用字符序列和基于第一接口的目标内存访问信息生成字符串对象创建请求,将字符串对象创建请求发送至宿主机,即JVM虚拟机通过第一接口访问宿主机上的目标内存,并向宿主机申请目标内存。其中,第一接口可以是Unsafe接口;基于第一接口的目标内存访问信息可以如表3所示:

表3

当判断结果为内存空间的大小未达到阈值时,JVM虚拟机利用字符序列和基于第二接口的直接内存访问信息生成字符串对象创建请求,将字符串对象创建请求发送至宿主机,即JVM虚拟机通过第二接口访问宿主机上的直接内存,并向宿主机申请直接内存。其中,第二接口可以是Java NIO接口;基于第二接口的直接内存访问信息可以如表4所示:

表4

需要说明的是,在另一个实施例中,JVM虚拟机可以不受上述阈值的限制,自由申请直接内存或目标内存。

本实施例中,结合目标内存对应的存储空间相对直接内存的存储空间较大,以及可以申请的直接内存的存储空间具有限制的情况,根据字符串信息需要申请的内存空间大小是否超过阈值选择申请不同的堆外内存,可以适应不同数据量的字符串对象,可以避免因字符串对象需要申请的直接内存超过JVM虚拟机剩余的直接内存无法成功创建与存储字符串对象。

在一个实施例中,该方法还包括:向宿主机发送字符串对象引用请求,字符串对象引用请求携带了字符序列的内存地址索引和字符长度,使宿主机根据内存地址索引和字符长度在堆外内存中读取对应的字符序列;字符序列包括多个字符;接收宿主机返回的多个字符,通过将多个字符进行拼接,将字符序列转换为字符串对象。

JVM虚拟机在将字符串信息转换为字符序列后,计算该字符序列的字符长度。宿主机完成Str对象的存储后,会向JVM虚拟机返回Str对象的内存地址索引。JVM虚拟机对字符串对象的内存地址索引和字符长度进行存储。当需要引用某个字符串对象时,JVM虚拟机获取该字符串对象的内存地址索引和字符长度,利用获取到的内存地址索引和字符长度生成字符串对象引用请求,将字符串对象引用请求发送至宿主机。宿主机根据内存地址索引和字符长度在堆外内存中读取对应的Str对象,将Str对象对应字符序列包含的多个字符返回至JVM虚拟机。JVM虚拟机将多个字符拼接为char数组,对char数组进行转换即可获取存储的String对象。其中,字符串对象引用请求携带的信息可以如表5所示:

表5

本实施例中,虽将字符串信息转换为字符序列存储至堆外内存,但当需要引用该字符串时,对字符序列进行简答拼接即可还原得到字符串对象,换言之,在堆外内存的处理字符串对象在进行简单处理后可以直接引用。

在一个实施例中,该方法还包括:按照预设频率检测字符串对象是否被引用;当字符串对象未被引用时,从堆外内存中将相应的字符串对象进行释放,对堆外内存进行回收。

JVM虚拟机按照预设频率对堆外内存存储的多个字符串对象是否被引用进行检测。当检测到某个字符串对象未被引用时,JVM虚拟机在预设时间之后从堆外内存中将该字符串对象进行释放,对堆外内存进行回收。例如,JVM虚拟机可以采用方法Void free(){charSequence.free();}对未被引用的字符串对象进行垃圾回收。

本实施例中,对堆外内存存储的多个字符串对象的引用情况进行检测,可以及时对未被引用的字符串对象进行垃圾回收,减少堆外内存的资源浪费。

应该理解的是,虽然图2的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。

在一个实施例中,提供了一种字符串对象的处理装置,包括:宿主机以及运行在宿主机上的JVM虚拟机,其中:当Java程序运行时,JVM虚拟机用于获取Java程序包含的字符串信息以及对应的内存申请信息,对字符串信息进行转化,得到字符序列,利用字符序列和内存申请信息生成字符串对象创建请求,将字符串对象创建请求发送至宿主机;宿主机用于根据内存申请信息从操作系统内存为字符序列分配相应的堆外内存;JVM虚拟机还用于将字符序列作为字符串对象存储至堆外内存。

在一个实施例中,当Java程序启动时,JVM虚拟机还用于向宿主机发送Java程序运行请求;宿主机还用于根据Java程序运行请求从操作系统内存给JVM虚拟机分配JVM内存;JVM虚拟机还用于在JVM内存中运行Java程序;操作系统内存包括JVM内存和目标内存;JVM内存包括堆内存和直接内存;堆外内存包括目标内存或直接内存中的至少一种。

在一个实施例中,JVM虚拟机还用于对字符串信息进行拆分处理,得到字符序列。

在一个实施例中,内存申请信息包括基于第一接口的目标内存访问信息;JVM虚拟机还用于获取字符串信息,计算对应的内存空间,比较内存空间的大小是否达到阈值,当内存空间的大小达到阈值时,利用字符序列和基于第一接口的目标内存访问信息生成字符串对象创建请求。

在一个实施例中,内存申请信息包括基于第二接口的直接内存访问信息;JVM虚拟机还用于获取字符串信息,计算对应的内存空间,比较内存空间的大小是否达到阈值,当内存空间的大小未达到阈值时,利用字符序列和基于第二接口的直接内存访问信息生成字符串对象创建请求。

在一个实施例中,当需要引用字符串对象时,JVM虚拟机还用于向宿主机发送字符串对象引用请求,字符串对象引用请求携带了字符序列的内存地址索引和字符长度;宿主机还用于根据内存地址索引和字符长度在堆外内存中读取对应的字符序列,字符序列包括多个字符,将多个字符返回至JVM虚拟机;JVM虚拟机还用于通过将多个字符进行拼接,将字符序列转换为字符串对象。

在一个实施例中,JVM虚拟机还用于按照预设频率检测字符串对象是否被引用;当字符串对象未被引用时,从堆外内存中将相应的字符串对象进行释放,对堆外内存进行回收。

关于字符串对象的处理装置的具体限定可以参见上文中对于字符串对象的处理方法的限定,在此不再赘述。在一个实施例中,本申请提供的字符串对象的处理装置可以实现为一种计算机程序的形式,计算机程序可在如图3所示的计算机设备上运行。

在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图3所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、JVM虚拟机和计算机程序。该内存储器为非易失性存储介质中的操作系统、JVM虚拟机和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种字符串对象的处理方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。

本领域技术人员可以理解,图3中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,处理器执行计算机程序时实现以下步骤:获取Java程序包含的字符串信息以及对应的内存申请信息;对字符串信息进行转化,得到字符序列;利用字符序列和内存申请信息生成字符串对象创建请求,将字符串对象创建请求发送至宿主机,使宿主机根据内存申请信息从操作系统内存为字符序列分配相应的堆外内存;将字符序列作为字符串对象存储至堆外内存。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:当Java程序启动时,向宿主机发送Java程序运行请求,获取宿主机根据Java程序运行请求从操作系统内存分配的JVM内存;操作系统内存包括JVM内存和目标内存;JVM内存包括堆内存和直接内存;堆外内存包括目标内存或直接内存中的至少一种。。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:对字符串信息进行拆分处理,得到字符序列。

在一个实施例中,内存申请信息包括基于第一接口的目标内存访问信息;处理器执行计算机程序时还实现以下步骤:获取字符串信息,计算对应的内存空间;比较内存空间的大小是否达到阈值;当内存空间的大小达到阈值时,利用字符序列和基于第一接口的目标内存访问信息生成字符串对象创建请求。

在一个实施例中,内存申请信息包括基于第二接口的直接内存访问信息;处理器执行计算机程序时还实现以下步骤:获取字符串信息,计算对应的内存空间;比较内存空间的大小是否达到阈值;当内存空间的大小未达到阈值时,利用字符序列和基于第二接口的直接内存访问信息生成字符串对象创建请求。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:向宿主机发送字符串对象引用请求,字符串对象引用请求携带了字符序列的内存地址索引和字符长度,使宿主机根据内存地址索引和字符长度在堆外内存中读取对应的字符序列;字符序列包括多个字符;接收宿主机返回的多个字符,通过将多个字符进行拼接,将字符序列转换为字符串对象。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:按照预设频率检测字符串对象是否被引用;当字符串对象未被引用时,从堆外内存中将相应的字符串对象进行释放,对堆外内存进行回收。

在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:获取Java程序包含的字符串信息以及对应的内存申请信息;对字符串信息进行转化,得到字符序列;利用字符序列和内存申请信息生成字符串对象创建请求,将字符串对象创建请求发送至宿主机,使宿主机根据内存申请信息从操作系统内存为字符序列分配相应的堆外内存;将字符序列作为字符串对象存储至堆外内存。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:当Java程序启动时,向宿主机发送Java程序运行请求,获取宿主机根据Java程序运行请求从操作系统内存分配的JVM内存;操作系统内存包括JVM内存和目标内存;JVM内存包括堆内存和直接内存;堆外内存包括目标内存或直接内存中的至少一种。。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:对字符串信息进行拆分处理,得到字符序列。

在一个实施例中,内存申请信息包括基于第一接口的目标内存访问信息;计算机程序被处理器执行时还实现以下步骤:获取字符串信息,计算对应的内存空间;比较内存空间的大小是否达到阈值;当内存空间的大小达到阈值时,利用字符序列和基于第一接口的目标内存访问信息生成字符串对象创建请求。

在一个实施例中,内存申请信息包括基于第二接口的直接内存访问信息;计算机程序被处理器执行时还实现以下步骤:获取字符串信息,计算对应的内存空间;比较内存空间的大小是否达到阈值;当内存空间的大小未达到阈值时,利用字符序列和基于第二接口的直接内存访问信息生成字符串对象创建请求。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:向宿主机发送字符串对象引用请求,字符串对象引用请求携带了字符序列的内存地址索引和字符长度,使宿主机根据内存地址索引和字符长度在堆外内存中读取对应的字符序列;字符序列包括多个字符;接收宿主机返回的多个字符,通过将多个字符进行拼接,将字符序列转换为字符串对象。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:按照预设频率检测字符串对象是否被引用;当字符串对象未被引用时,从堆外内存中将相应的字符串对象进行释放,对堆外内存进行回收。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。

以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1