CN110914799B - 一种反序列化方法、装置以及计算设备 - Google Patents
一种反序列化方法、装置以及计算设备 Download PDFInfo
- Publication number
- CN110914799B CN110914799B CN201880012901.9A CN201880012901A CN110914799B CN 110914799 B CN110914799 B CN 110914799B CN 201880012901 A CN201880012901 A CN 201880012901A CN 110914799 B CN110914799 B CN 110914799B
- Authority
- CN
- China
- Prior art keywords
- shell
- class
- space
- type
- pool
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/4493—Object persistence
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/547—Remote procedure calls [RPC]; Web services
- G06F9/548—Object oriented; Remote method invocation [RMI]
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请公开了一种反序列化方法,在进程的内存空间中创建第一对象的第一对象壳,所述第一对象壳包括第一对象头和第一对象体;获取所述第一对象的序列化结果;根据所述第一对象壳,反序列化所述第一对象的序列化结果以得到所述第一对象;所述进程使用完毕所述第一对象后,释放所述第一对象壳,所述第一对象壳可以用于反序列化后续接收的序列化结果。通过对象壳的复用,提升了反序列化的效率。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及反序列化方法以及相应的装置和用于执行该方法的计算设备。
背景技术
面向对象的编程语言,例如Java、Python,大量运用于商业场景中,每个对象可以是客户个人信息、产品的属性信息等。这些对象在使用过程中需要对大量对象进行序列化和反序列化操作。其中,反序列化操作要求在内存空间中重建对象。现有技术中,反序列化出一个对象要求在内存空间中重建整个对象,效率低下。
发明内容
本申请提供了一种反序列化方法,该方法提升了反序列化的效率。
本申请的第一方面提供了一种反序列化方法,该方法由计算设备执行,初始化阶段中,在进程的内存空间中创建第一对象的第一对象壳,所述第一对象壳包括第一对象头和第一对象体,所述第一对象头包括所述第一对象的类型指针,所述第一对象体中为所述第一对象的元素预留了空间,其中,基本类型的元素的预留空间的大小取决于该元素属于哪个基本类型,不同基本类型的元素所需的空间大小可能不同,引用类型的元素的预留空间内存储指针,因此引用类型的元素的预留空间的大小一般为32 bit或64 bit;获取所述第一对象的序列化结果;获取所述第一对象壳,根据所述第一对象壳反序列化所述第一对象的序列化结果以得到所述第一对象。可选的,所述进程使用完毕所述第一对象后,还可以释放所述第一对象壳,以供后续反序列化使用。该方法通过预创建对象壳,避免了反序列化过程中对象壳的创建,提升了反序列化的效率。同时,通过释放对象壳,使得反序列化的过程中能够复用对象壳,避免了每次反序列化都要重新创建对象壳。
在一种可能的实现方式中,所述第一对象壳位于所述进程的老年代内存空间。第一对象壳可以在新生代内存空间创建,然后老化到老年代内存空间,也可以直接在老年代内存空间创建。通过利用位于老年代内存空间的对象壳,降低了新生代垃圾回收、老年代垃圾回收以及内存溢出的可能性,提升了反序列化的效率,增强了进程运行的稳定性。
在一种可能的实现方式中,所述方法还包括:所述第一对象壳位于所述第一对象所属的类对应的对象池中,所述第一对象所属的类对应的对象池中包括至少一个对象壳;从所述第一对象所属的类对应的对象池中选择空闲的所述第一对象壳以反序列化所述第一对象的序列化结果;所述进程使用完毕所述第一对象后,释放所述第一对象壳,被释放的所述第一对象壳为空闲的。通过预先在所述进程的内存空间中创建所述第一对象所属的类对应的对象池,反序列化出一个对象的过程中从对象池中借用一个空闲的对象壳,对象使用完毕后归还借用的对象壳至对象池,避免了整个对象的重新创建。
在一种可能的实现方式中,所述释放所述第一对象壳包括:清除所述第一对象体中为所述第一对象的元素预留的空间。清除所述第一对象体中为所述第一对象的元素预留的空间即清除该预留的内存空间内存储的内容,清除后的内存空间仍然属于该对象体。由于相同对象的对象头相同,因此释放所述第一对象壳的过程中,不清除第一对象头中存储的类型指针。清除对象体的空间保证了后续该对象壳能够被正确复用,保留对象头节约了对象头的填充时间,进一步提升了反序列化的效率。
在一种可能的实现方式中,所述根据所述第一对象壳,反序列化所述第一对象的序列化结果以得到所述第一对象包括:为所述第一对象创建引用,所述引用指向所述第一对象壳;将所述第一对象的序列化结果填入所述第一对象体中为所述第一对象的元素预留的空间。通过创建引用,将序列化结果填入对象体,结合预先填充号的对象头,对象被完整反序列化出来,反序列化出来的对象可供进程使用。
在一种可能的实现方式中,所述方法还包括:在所述进程的内存空间中创建引用类型的对象的第二对象壳,所述第二对象壳包括第二对象头和第二对象体,所述第二对象头包括所述引用类型的对象的类型指针,所述第二对象体中为所述引用类型的对象的元素预留了空间,所述引用类型的对象为所述第一对象的元素。第二对象壳的创建与第一对象壳的创建均可以在初始化阶段完成。所述根据所述第一对象壳,反序列化所述第一对象的序列化结果以得到所述第一对象包括:将指向所述第二对象壳的指针填入所述第一对象体中为所述引用类型的元素预留的空间;将所述第一对象的序列化结果中与所述引用类型的元素相关的部分填入所述第二对象体中为所述引用类型的对象的元素预留的空间。反序列化出一个对象的过程中,不仅可以采用对象壳反序列化父对象,还可以采用对象壳反序列化子对象,保证了对象嵌套的情况下子对象的反序列化也可以达到本方面任一实现方式中描述的效果。
在一种可能的实现方式中,所述方法还包括:在所述进程的内存空间中创建所述引用类型的对象所属的类对应的对象池,所述引用类型的对象所属的类对应的对象池包括至少一个对象壳;从所述引用类型的对象所属的类对应的对象池中选择空闲的所述第二对象壳;所述进程使用完毕所述第一对象后,释放所述第一对象壳和所述第二对象壳,被释放的所述第二对象壳为空闲的。第二对象壳和第一对象壳位于不同的对象池内,第二对象池和第一对象池的创建和使用过程相同。
在一种可能的实现方式中,释放所述第一对象壳后,所述方法还包括:获取第二对象的序列化结果,所述第二对象和所述第一对象属于相同的类;获取被释放的所述第一对象壳,根据被释放的所述第一对象壳,反序列化所述第二对象的序列化结果以得到所述第二对象。第二对象的反序列化过程中,可以采用以上任意实现方式中反序列化第一对象的方法。相同类实例化出的对象在反序列化过程中,可以复用同一对象池中的对象壳,之前的对象使用完毕后,其借用的对象壳将被释放以供反序列化后续的对象使用。通过对象壳的复用,避免了每次反序列化都需要创建完整对象或创建对象壳,提升了反序列化的效率。
在一种可能的实现方式中,进程运行过程中,还可以根据接收的序列化结果对应的对象所属的类,确定需要为第一对象所属的类对应的对象池新增对象壳,或者为引用类型的对象所属的类对应的对象池新增对象壳。一般而言,如果进程运行过程中接收到一个对象的频率增大,即一个对象的反序列化频率增大,该对象所属的类对应的对象池内的对象壳的数量和该对象嵌套的子对象所属的类对应的对象池内的对象壳的数量需要增大,以保证该对象的反序列化过程中能够从对象池壳借用到空闲的对象壳。
在一种可能的实现方式中,进程运行过程中,还可以根据接收的序列化结果对应的对象所属的类,确定需要为第一对象所属的类对应的对象池减少对象壳,或者为引用类型的对象所属的类对应的对象池减少对象壳。一般而言,如果进程运行过程中接收到一个对象的频率降低,即一个对象的反序列化频率降低,该对象所属的类对应的对象池内的对象壳的数量和该对象嵌套的子对象所属的类对应的对象池内的对象壳的数量需要减少,以保证有足够的内存空间供其他对象池使用。
本申请的第二方面提供了一种反序列化装置,该装置包括对象池管理模块和存储模块。所述对象池管理模块,用于在所述存储模块中创建第一对象的第一对象壳,所述第一对象壳包括第一对象头和第一对象体,所述第一对象头包括所述第一对象的类型指针,所述第一对象体中为所述第一对象的元素预留了空间;获取所述第一对象的序列化结果;根据所述第一对象壳,反序列化所述第一对象的序列化结果以得到所述第一对象。可选的,所述对象池管理模块还用于在所述第一对象被使用完毕后,释放所述第一对象壳;所述存储模块,用于存储所述第一对象壳。该反序列化装置用于执行前述第一方面提供的任一方法。
在一种可能的实现方式中,所述第一对象壳位于使用所述第一对象的进程的老年代内存空间。所述存储模块包括进程的老年代内存空间。
在一种可能的实现方式中,所述对象池管理模块,所述第一对象壳位于所述第一对象所属的类对应的对象池中,所述第一对象所属的类对应的对象池中包括至少一个对象壳;还用于从所述第一对象所属的类对应的对象池中选择空闲的所述第一对象壳以反序列化所述第一对象的序列化结果;所述第一对象后被使用完毕后,释放所述第一对象壳,被释放的所述第一对象壳为空闲的。
在一种可能的实现方式中,所述对象池管理模块,用于清除所述第一对象体中为所述第一对象的元素预留的空间。
在一种可能的实现方式中,所述装置还包括反序列化模块,用于创建所述第一对象的引用,所述引用指向所述第一对象壳;所述对象池管理模块,还用于将所述第一对象的序列化结果填入所述第一对象体中为所述第一对象的元素预留的空间。
在一种可能的实现方式中,所述对象池管理模块,还用于在所述存储模块中创建引用类型的对象的第二对象壳,所述第二对象壳包括第二对象头和第二对象体,所述第二对象头包括所述引用类型的对象的类型指针,所述第二对象体中为所述引用类型的对象的元素预留了空间,所述引用类型的对象为所述第一对象的元素;将指向所述第二对象壳的指针填入所述第一对象体中为所述引用类型的元素预留的空间;将所述第一对象的序列化结果中与所述引用类型的元素相关的部分填入所述第二对象体中为所述引用类型的对象的元素预留的空间。
在一种可能的实现方式中,所述对象池管理模块,还用于获取第二对象的序列化结果,所述第二对象和所述第一对象属于相同的类;获取被释放的所述第一对象壳,根据被释放的所述第一对象壳反序列化所述第二对象的序列化结果以得到所述第二对象。
本申请的第三方面提供了一种计算设备,包括处理器和存储器,所述处理器,用于访问所述存储器中的代码运行进程,在所述进程的内存空间中创建第一对象的第一对象壳,所述第一对象壳包括第一对象头和第一对象体,所述第一对象头包括所述第一对象的类型指针,所述第一对象体中为所述第一对象的元素预留了空间;获取所述第一对象的序列化结果;获取所述第一对象壳,根据所述第一对象壳反序列化所述第一对象的序列化结果以得到所述第一对象。可选的,所述处理器,还可以在所述进程使用完毕所述第一对象后,释放所述第一对象壳。该计算设备用于执行前述第一方面提供的任一方法。
在一种可能的实现方式中,所述第一对象壳位于所述进程的老年代内存空间。
在一种可能的实现方式中,所述第一对象壳位于所述第一对象所属的类对应的对象池中,所述第一对象所属的类对应的对象池中包括至少一个对象壳;所述处理器,用于从所述第一对象所属的类对应的对象池中选择空闲的所述第一对象壳以反序列化所述第一对象的序列化结果;所述进程使用完毕所述第一对象后,释放所述第一对象壳,被释放的所述第一对象壳为空闲的。
在一种可能的实现方式中,所述处理器,用于清除所述第一对象体中为所述第一对象的元素预留的空间。
在一种可能的实现方式中,所述处理器,用于为所述第一对象创建引用,所述引用指向所述第一对象壳;将所述第一对象的序列化结果填入所述第一对象体中为所述第一对象的元素预留的空间。
在一种可能的实现方式中,所述处理器,用于在所述进程的内存空间中创建引用类型的对象的第二对象壳,所述第二对象壳包括第二对象头和第二对象体,所述第二对象头包括所述引用类型的对象的类型指针,所述第二对象体中为所述引用类型的对象的元素预留了空间,所述引用类型的对象为所述第一对象的元素;将指向所述第二对象壳的指针填入所述第一对象体中为所述引用类型的元素预留的空间;将所述第一对象的序列化结果中与所述引用类型的元素相关的部分填入所述第二对象体中为所述引用类型的对象的元素预留的空间。
在一种可能的实现方式中,所述处理器,用于获取第二对象的序列化结果,所述第二对象和所述第一对象属于相同的类;获取被释放的所述第一对象壳,根据被释放的所述第一对象壳,反序列化所述第二对象的序列化结果以得到所述第二对象。
本申请的第四方面提供了一种反序列化方法,该方法由计算设备执行,包括:从对象池中获取空闲的对象壳,所述对象池中设置有至少一个对象壳,每个对象壳用于反序列化出多个对象,所述多个对象属于相同的类;根据所述空闲的对象壳,反序列化接收到的序列化结果得到目标对象。
在一种可能的实现方式中,所述方法还包括:所述目标对象使用完毕后,释放所述目标对象的对象壳,被释放的所述目标对象的对象壳为空闲的。
在一种可能的实现方式中,所述方法还包括:接收另一反序列化结果;根据被释放的所述目标对象的对象壳,反序列化所述另一反序列化结果,获得另一目标对象,所述目标对象和所述另一目标对象属于相同的类。
本申请的第五方面提供了一种计算设备,包括处理器和存储器,所述处理器,用于访问所述存储器中的代码以执行第四方面提供的任一方法。
本申请的第六方面提供了一种非瞬态的可读存储介质,所述非瞬态的可读存储介质被计算设备执行时,所述计算设备执行前述第一方面提供的任一方法。该存储介质中存储了程序。该存储介质包括但不限于易失性存储器,例如随机访问存储器,非易失性存储器,例如快闪存储器、硬盘(hard disk drive,HDD)、固态硬盘(solid state drive,SSD)。
本申请的第七方面提供了一种计算设备程序产品,所述计算设备程序产品被计算设备执行时,所述计算设备执行前述第一方面提供的任一方法。该计算机程序产品可以为一个软件安装包,在需要使用前述第一方面提供的任一方法的情况下,可以下载该计算机程序产品并在计算设备上执行该计算机程序产品。
附图说明
为了更清楚地说明本申请实施例的技术方法,下面将对实施例中所需要使用的附图作以简单地介绍。
图1为本申请提供的类和对象的结构示意图;
图2为本申请提供的对象序列化示意图;
图3a为本申请提供的序列化和反序列化应用场景的示意图;
图3b为本申请提供的另一序列化和反序列化应用场景的示意图;
图4a为本申请提供的计算设备的结构示意图;
图4b为本申请提供的另一计算设备的结构示意图;
图5a为本申请提供的另一计算设备的结构示意图;
图5b为本申请提供的对象壳的结构示意图;
图6为本申请提供的序列化结果与反序列化出的对象的示意图;
图7为本申请提供的另一计算设备的结构示意图;
图8为本申请提供的另一计算设备的结构示意图;
图9为本申请提供的反序列化的流程示意图;
图10为本申请提供的反序列化装置的结构示意图;
图11为本申请提供的另一计算设备的结构示意图。
具体实施方式
下面结合本申请实施例中的附图,对本申请实施例中的技术方法进行描述。
本申请中各个“第一”、“第二”、“第n”之间不具有逻辑或时序上的依赖关系。
本申请中,类库(class library)里包括了多个类,每个类记录了该类的定义信息,即类实例化出的对象的元信息。类库也称为类型系统(type system)。一个类包括至少一个元素。每个类记录的内容包括:类名,该类的各个元素的元素类型,以及该类的各个元素的元素名。一个对象通过实例化一个类得到,该对象属于该类,该对象包括该类的元素。每个对象包括:对象名,该对象的各个元素的元素名,该对象的各个元素的元素值。一个对象的每个元素的元素名和元素值的类型继承于实例化得出该对象的类的各个元素的元素名和元素类型。
图1展示了一个类的定义信息,EventData为类名,该类包括4个元素,分别为intseqNo/int creatTime/String userId/List<Byte>data,其中int/int/String/List<Byte>为4个元素的元素类型,seqNo/creatTime/userId/data为4个元素的元素名。EventData可以实例化成EventData1,EventData中的元素定义与EventData1中的元素一一对应,例如int seqNo对应seqNo:54。EventData1中元素名seqNo的元素值54的元素类型继承于EventData中元素名seqNo的元素类型int。
元素类型为基本类型(basic type)或引用类型(reference type)。其中,基本类型的元素的长度是固定的。基本类型包括:byte(8 bit),short(16 bit),long(64 bit),int(32 bit),float(32 bit),double(64 bit),char(16 bit),boolean(长度视编译环境确定)。
引用类型的元素的长度一般不固定,引用类型包括类、接口、数组、枚举、注解等。一个对象的引用类型的元素可以为基本类型的元素或者另一个对象(即对象中嵌套对象)。对象嵌套的场景下,最后一层嵌套对象的元素为基本类型。例如,user ID指向对象String1,String1的元素Array<Char>指向对象Array1,Array1的元素为基本类型char。再例如,data指向对象List1,List1的元素Array<Byte>指向对象Array2,Array2的元素为基本类型Byte。
如图2所示,本申请中,把对象EventData1或其他数据结构转换为可存储于文件或内存中的格式,或者转换为可以在通信通路上传输的格式的过程称之为序列化。相反的,将该格式转换为原始对象或者原始数据结构的过程称之为反序列化。序列化结果为二进制序列或字符串序列。序列化一个对象也可以称之为编列(marshal)/腌制(pickle)/压扁(flatten)一个对象,不同编程语言对序列化的称呼可能不同。
序列化和反序列化主要包括以下两个场景。如图3a所示,内存空间中的对象需要被存入非易失性的存储器以便长期保存。序列化模块将对象转换为序列化结果并存入存储器。当需要访问对象的时候,从存储器中读取序列化结果并通过反序列化模块转换为对象。图3a中的序列化模块和反序列化模块可以为两个独立的模块。由于序列化和反序列化为相逆的过程,序列化模块和反序列化模块也可以集成为同一模块。
如图3b所示,源计算设备(例如客户端)的对象需要发送到目的计算设备(例如服务器)。源计算设备的序列化模块将对象转化为序列化结果。源计算设备将序列化结果封装为数据包,并通过通信通路将数据包发送至目的计算设备。目的计算设备将数据包解封装后获取序列化结果,通过反序列化模块将序列化结果转换为对象。以源计算设备为金融公司的客户端,目的计算设备为云环境中的虚拟机为例。金融公司将客户鉴权的功能设置在云环境中,因此金融公司需要将客户端接收的客户信息发送至云环境的虚拟机,虚拟机获取客户信息并判断客户是否通过鉴权。金融公司的客户端获取客户登录账号时输入的客户信息EventData1,客户端将EventData1序列化后发送至云上的虚拟机,虚拟机将序列化结果反序列化以重新构建客户信息EventData1。随着业务种类和客户数量的提升,虚拟机单位时间内获取的反序列化结果的数量不断增大,对于反序列化的速度也有了更高的要求。
本申请适用于各种语言环境,包括Java,Python,C#等。不同语言环境下的进程运行的空间名称也不同,例如Java下的进程运行于Java虚拟机(Java virtual machine,JVM)内。此处的进程,也可以指代一个应用程序,或一个应用程序中的一部分。如图4a所示,进程的内存空间包括栈内存、堆内存以及反序列化模块(一般还有序列化模块,图中未示出,或者序列化模块与反序列化模块集成为一个模块)。类库存储于反序列化模块中,或存储于进程的内存空间的其他部位。堆内存被分为新生代(young generation)和老年代(oldgeneration)。当进程需要调用一个对象时,反序列化模块获取该对象对应的序列化结果,根据该序列化结果在栈内存和堆内存中重建该对象。对象包括对象头和对象体。栈内存中创建有该对象的引用,引用中包括指向对象头的指针(即对象头的地址)。堆内存中创建有该对象的对象头和对象体。对象头中包括类型指针,该类型指针指向该对象的类,也即该类型指针指向类库中的某一地址,该地址存储有该对象的类。进程后续访问该对象时,需要通过该类型指针获取该对象的类,以得知该对象的信息,例如元素名、元素类型等。对象体中存有各个元素,其中,基本类型的元素可以直接存储于对象体中,如果一个元素为引用类型,对象体中存有的可以是该元素指向的对象的指针。例如图4a中,元素1和元素2为基本类型,元素3和元素4为引用类型,因此元素3和元素4中存有指针,分别指向另一对象的对象头。
现有技术中,如果想要新建一个对象,只能在新生代内创建该对象。创建该对象的效率较低。同时,当新生代内存储的对象占新生代的总空间超过一定比例后,进程会启动新生代垃圾回收(young garbage collection)。通过新生代垃圾回收,使用完毕的对象将从新生代中删除,未使用完毕的对象将继续存活于新生代。
如图4b所示,如果一个对象在新生代中的存活时间超过阈值或者一个对象在一定轮次的新生代垃圾回收后仍然存活于新生代,该对象将被拷贝到老年代;又或者新生代的可用空间低于阈值,该新生代内的对象将被拷贝到老年代。如果老年代中积累的对象过多,将会触发老年代垃圾回收,将老年代中使用完毕的对象删除。由于老年代的大小一般远大于新生代,老年代垃圾回收的时间开销将会远远高于新生代垃圾回收的时间开销,并且老年代垃圾回收期间,进程内的所有线程将被停止。因此,老年代垃圾回收将会严重影响进程的运行性能。同时,如果老年代内未被使用完毕的对象过多,会造成即使采用老年代垃圾回收(full garbage collection),老年代的内存空间仍然会被占满,造成内存溢出,导致进程崩溃。
为了提升反序列化的效率,减少新生代垃圾回收、老年代垃圾回收以及内存溢出对进程的运行性能以及安全性的影响,本申请提出一种方法提升反序列化效率,减少新生代垃圾回收、老年代垃圾回收的触发次数并降低内存溢出的出现的可能性,提升进程运行稳定性。在老年代内为不同类设置有对象池,每个对象池中有至少一个对象壳。当反序列化一个对象时,从待反序列化的对象所属的类对应的对象池中借用对象壳,当该对象使用完毕后,将该借用的对象壳归还该对象所属的类的对象池。反序列化过程中可以重复利用对象壳,无须每次反序列化时均重新创建新的对象,提升了反序列化的效率。更进一步的,由于无须在新生代创建对象,避免了新生代垃圾回收。由于新生代垃圾回收被避免,老年代垃圾回收也随之被避免,内存溢出的可能性也大幅降低。
如图5a所示,对象池管理模块在初始化阶段预先在内存空间内创建多个对象池,例如对象池201、对象池202、对象池203。这些对象池可以在新生代内创建然后老化至老年代,也可以直接创建于老年代。每个对象池对应于一个类。每个对象池内包括多个对象壳,例如对象池201内包括对象壳2011、对象壳2012…对象壳201n。一个对象池内的对象壳相同。一个对象池内的对象壳用于创建该对象池对应的类实例化出的对象。例如,对象池201中的对象壳均可以用于创建相同对象。一个对象所属的类对应的对象池的创建早于该对象被首次反序列化。每个对象池内创建有至少一个对象壳。对象池管理模块可以为该进程需要调用的每个对象以及调用的对象内嵌套的每个类均创建一个对应的对象池。对象池管理模块为一个对象池内预先分配的对象壳的数量取决于预计的该对象池对应的类实例化出的对象被调用的频率,一般而言预计被调用频率越高的对象所属的类的对象池内的对象壳的数量越多。
如图5b所示,以对象壳201n为例介绍对象壳的结构,对象壳201n用于创建对象x,即对象池201对应于对象x。对象壳201n包括两部分,对象头和对象体。对象壳201n的对象头中包括类型指针,类型指针指向对象x所属的类。对象壳201n的对象体内为对象x的各个元素预留有空间,该预留的空间由对象壳201n占用。其中,对象体内为基本类型的元素预留的空间的大小为该基本类型的元素的大小。对象体内为引用类型的元素预留的空间的大小为指针大小,也即32 bit或64 bit,具体采用32 bit还是64 bit依据于进程使用的操作系统。由于引用类型的元素实质为一个对象,引用类型的元素的空间内存放的指针实际指向另一个对象池中的某一个对象壳的对象头。
反序列化出一个对象时,首先由反序列化模块在栈内存中建立该对象对应的引用,以引用101为例,对象池管理模块确定该对象所属的类对应的对象池201。图5中,引用101、引用102、引用10n分别属于不同的对象。然后,对象池管理模块从该对象池201中获取一个当前空闲的对象壳201n,将该对象的各个元素填充进该对象壳201n的对象体中。空闲的对象壳201n可以是在其他对象创建过程中被使用过并被释放的,空闲的对象壳201n也可以被创建后未被使用过的。如果填充的元素为引用类型,将指针填入对应的元素空间。该指针指向该引用类型的元素在另一对象池中的对象壳,例如对象壳201n的某一元素n为引用类型,则对象壳201n的元素n空间内存储有指针,指向对象池202中的对象壳202n。对象池管理模块中维护有对象池状态信息,对象池状态信息记录了各个对象池中哪些对象壳空闲,哪些对象壳正在被借用。
图6中,以反序列化出对象EventData1为例。反序列化模块获取EventData1的序列化结果(二进制序列)后,从EventData对应的对象池中获取EventData的对象壳。访问类库后,通过类EventData,得知EventData1对象的第一个元素为基本类型int,第二个元素为基本类型int,因此将54和78分别填入EventData的对象体中第一个元素空间和第二个元素空间中。通过类EventData,还得知EventData1对象的第三个元素为引用类型String,第四个元素为引用类型List。从String(具体可以为StringBuilder或者StringBuffer)对应的对象池中获取String的对象壳,将指向String的对象壳的指针填入EventData的对象体中第三个元素空间。从List对应的对象池中获取List的对象壳,将指向List的对象壳的指针填入EventData的对象体中第四个元素空间。通过类String,还得知String对象的元素为引用类型Array<Char>。从Array<Char>对应的对象池中获取Array<Char>的对象壳,将指向Array<Char>的对象壳的指针填入String的对象体的元素空间。通过类List,还得知List对象的元素为引用类型Array<Byte>。从Array<Byte>对应的对象池中获取Array<Byte>的对象壳,将指向Array<Byte>的对象壳的指针填入List的对象体的元素空间。通过类Array<Char>,得知Array<Char>对象的元素为基本类型Char。将61、62、63(ASCII码(美国信息交换标准代码,American Standard Code for Information Interchange))转换为a、b、c,并分别填入Array<Char>的第一、第二和第三个元素空间。通过类Array<Byte>,得知Array<Byte>对象的元素为基本类型Byte。12、23分别填入Array<Byte>的第一和第二个元素空间。至此,通过EventData1的序列化结果反序列化出了对象EventData1。以上Eventdata的对象壳,String的对象壳,List的对象壳,Array<Char>对象壳,Array<Byte>的对象壳分别来自老年代内存中5个不同的对象池。父对象的反序列化和子对象的反序列化顺序可以任意执行。可以先反序列化父对象,再反序列化子对象,将指向子对象的对象壳的指针填入父对象的对象壳内;也可以先反序列化子对象,再反序列化父对象,将指向子对象的对象壳的指针填入父对象的对象壳内,以上实施例不限定两者的执行顺序。
对于长度不固定(变长)的引用类型的对象,例如String类型的对象、Map类型的对象、List类型的对象和Array类型的对象,由于变长的引用类型的对象包含的元素的长度往往不固定,不便于为变长的引用类型的对象所属的类预先创建对象池以及对象壳。因此,可以采用以下两种方案之一:
1.不为变长的引用类型的对象创建对象池。如图8,在需要创建变长的引用类型的对象时,在新生代内创建该变长的引用类型的对象2041,并将指向新生代内创建的对象2041的指针填入对象壳201n的元素空间内。其中,对象2041为对象壳201n对应的对象的子对象,即对象壳201n对应的对象的元素之一是对象2041。以图6中,String类型的对象userID为例,对象EventData1嵌套了String类型的对象user ID,反序列化EventData1的过程中在新生代创建字符串类型的对象user ID,并将新生代内该String类型的对象的地址作为指针,填入创建EventData1的对象体的对应的元素空间中。此种情况下,图6中,String1的指针指向新生代中创建的字符串类型的对象String1。
2.仍然为变长的引用类型的对象创建对象池,对象池内对象壳的元素空间的长度为N(N为该对象包括的元素的个数)。当需要创建一个变长的引用类型的对象时,判断这个变长的引用类型的对象的元素的长度M和N的大小关系。如果N不小于M,则根据池内空闲的对象壳创建该变长的引用类型的对象。如果N小于M,则在新生代内创建该变长的引用类型的对象,并将指向新生代内创建的该变长的引用类型的对象的指针填入对象壳的元素空间内。该变长的引用类型的对象使用完毕后,将该变长的引用类型的对象在新生代的对象体的元素清除,清除后的对象作为对象壳加入到该变长的引用类型的对象所属的类的对象池。这样,如果下一次需要创建的该变长的引用类型的对象的长度大于N且小于M,可以利用该新加入的对象壳创建该变长的引用类型的对象。
当一个对象被进程使用完毕后,该对象将会被释放。当对象被释放时,该对象的引用将从栈内存中被删除,反序列化出该对象的过程中借用的对象壳将会被释放回对应的对象池。对象池管理模块释放一个对象壳的过程中,将该对象壳的对象体内记录的内容清除,即将对象体中为元素预留的空间清空,该对象壳仍然拥有这些空间,但这些空间内不再记录元素或指针。同时,该对象壳的对象头内记录的类型指针不会被清除。释放一个对象壳后,对象池管理模块在对象池状态信息中记录该对象壳为空闲状态,以便该对象壳被其他对象借用。如图7所示,引用101对应的对象使用完毕后,引用101被删除,该对象借用的对象壳201n和对象壳202n被释放回对应的对象池。
下面以图9,介绍一个对象从开始反序列化到被释放的完整生命周期。
S301,进程开始运行,发送初始化指令至反序列化模块。计算设备上运行的进程启动后,通过初始化指令通知反序列化模块进行初始化,该初始化指令中可以携带该进程后续可能使用到的对象所属的类,以及各类实例化出的对象的预计数量/占比等信息。
S302,反序列化模块根据初始化指令,发送创建指令至对象池管理模块。创建指令中可以携带该进程后续可能使用到的对象所属的类,各类实例化出的对象的数量/占比等信息,以便对象池管理模块确定创建的对象池对应的类以及每个对象池内对象壳的数量。
S303,对象池管理模块根据创建指令,在内存空间内创建对象池和对象池状态信息。创建的对象池的类型以及每个对象池内对象壳的数量参考创建指令携带的信息。
S304,对象池管理模块完成创建对象池,返回创建响应至反序列化模块。
S305,反序列化模块根据创建响应返回初始化响应至进程。
对象池初始化完毕后,反序列化模块开始持续接收序列化结果,将每个序列化结果反序列化成对象,反序列化过程包括S307至S315。对于每个序列化结果,均执行S306至S321。因此随着序列化结果的不断获取,S306至S321被持续重复执行。
S306,反序列化模块获取序列化结果。反序列化模块创建引用,例如引用101,该引用指向该序列化结果对应的对象的对象壳,例如对象壳201n。
S307,反序列化模块发送对象创建指令至对象池管理模块。该创建指令中携带了该序列化结果对应的对象所属的类以及S306中获取的序列化结果。
S308,对象池管理模块根据该对象所属的类,判断该对象所属的类对应的对象池是否已经在S301至S305中被创建了,如果未创建则执行S309,如果已经创建则执行S310至S313。
S309,由于对应的对象池未被创建,因此对象池管理模块在新生代中创建该对象。
S310,对象池管理模块判断该对象所属的类对应的对象池内是否还有空闲的对象壳,例如该对象池为201。如果还有空闲的对象壳则执行S311,如果没有空闲的对象壳则执行S312或S313。
进程运行过程中,如果某一对象池中对象壳被借用完,导致对象池中缺乏可被借用的对象壳,例如S310中判断为否的分支,或者对象管理模块判断某一对象的反序列化频率上升,这两种情况下对象池管理模块均可以为该对象池创建新的对象壳。如果该对象池内的对象壳被频繁借用,新创建的对象壳可以长期保留在该对象池中。或者,新创建的对象壳在使用完毕后,或者新创建的对象壳存活一定周期/时间后,对象池管理模块可以删除该新创建的对象壳,以空出老年代的内存空间供新创建对象池或者为其他对象池新创建对象壳。为了避免某一对象池内对象壳过多导致其他对象池空间不足,对象池管理模块可以为对象池内的对象壳的数量设计上限,或者为对象池占用的内存空间设计上限。达到该上限之前,如果对象池内的对象壳不足,对象池管理模块可以为该对象池新创建对象壳。如果该对象池内的对象壳的数量达到上限,或者该对象池占用的内存空间达到上限,则即使该对象池内的对象壳不足,对象池管理模块也不能为该对象池新创建对象壳,此时如果反序列化模块仍然请求反序列化该对象,则对象池管理模块向反序列化模块返回异常响应,告知反序列化模块当前无法反序列化该对象,或者对象池管理模块在新生代内存空间创建该对象。
S311,对象池管理模块从该对象对应的对象池内借用空闲的对象壳,例如对象壳201n,通过对象壳201n创建该对象。对象池管理模块将该序列化结果填入对象壳201n的对象体中为该对象的元素预留的空间。如果该对象的一个元素是基本类型,则将该序列化结果中与基本类型的元素相关的部分填入对象体中为该元素预留的空间。如果该对象的一个元素是引用类型,则对象池管理模块从该元素对应的对象所属的类的对象池,例如对象池202,内借用空闲的另一个对象壳202n。将对象壳202n的指针填入对象壳201的对象体中为该引用类型的元素预留的空间,并将该序列化结果中与该引用类型的元素相关的部分填入对象壳202n的对象体中为该引用类型的对象的元素预留的空间。
S312,对象池管理模块在对象池201中创建一个新的对象壳,并根据该新创建的对象壳创建该对象。根据该新创建的对象壳创建该对象的方法与上述方法相同。
S313,对象池管理模块在新生代内存空间内创建该对象。
S314,对象创建完毕,对象池管理模块返回对象创建响应至反序列化模块。
S315,反序列化模块返回该对象的引用101至进程。
S316,进程通过引用101使用该对象。
针对每个序列化结果S306至S316和S317至S321可以不连续执行,即可以对多个序列化结果执行S306至S316后,其中某一个序列化结果对应的对象才需要被进程释放。
S317,进程使用完毕该对象后,发送释放指令至对象池管理模块。对象池管理模块获取释放指令后,根据创建该对象时的步骤,执行S318和S319,或执行S320。其中,若创建该对象时采用了S311或S312,则执行S318至S319。若创建该对象时采用了S309或S313,则执行S320。
S318,对象池管理模块根据释放指令,清除借用的对象壳,即清除该对象壳201n的对象体中为元素预留的空间。不清除该对象壳的对象头。如果有多层对象嵌套,则每一层嵌套的对象借用的对象壳均采用该方法清除。
S319,对象池管理模块释放该被清除的对象壳201n至对象池201。对象池管理模块在对象池状态信息中,将对象壳201n标记为空闲状态。
S320,对象池管理模块在新生代内存空间中删除该对象。
S321、S219或S320后,对象池管理模块返回释放响应至进程,通知进程对象201已经被释放。
S321后,如果进程接收到另一序列化结果,该另一序列化结果与S306中接收到的序列化结果采用相同的类,即这两个序列化结果由相同的类实例化得来,则反序列化模块和对象池管理模块可以采用S306至S321中被释放的对象壳201创建该另一序列化结果对应的对象。根据被释放的对象壳201创建对象的过程,参考前述S306至S321。
图10提供了一种反序列化装置400。反序列化装置400包括反序列化模块401,对象池管理模块402和存储模块403。反序列化模块401与对象池管理模块402建立通信,对象池管理模块402和存储模块403建立通信。反序列化装置400可以为前述图中进程空间的一部分。反序列化装置400及其包括的各个模块可以为软件模块。其中,反序列化模块401中存储了序列化结果和类库。存储模块403中存储了各个对象池。存储模块403为前述图中的老年代内存空间,或为老年代内存空间的一部分。反序列化装置400支持反序列化功能,将反序列化出的对象供于进程使用。
图11提供了一种计算设备500。计算设备500包括总线501、处理器502、通信接口503和存储器504。处理器502、存储器504和通信接口503之间通过总线501通信。通信接口503用于与外部通信,例如接收序列化结果。
其中,处理器502可以为中央处理器(英文:central processing unit,缩写:CPU)。存储器504可以包括易失性存储器(英文:volatile memory),例如随机存取存储器(英文:random access memory,缩写:RAM)。存储器504还可以包括非易失性存储器(英文:non-volatile memory),例如只读存储器(英文:read-only memory,缩写:ROM),快闪存储器,HDD或SSD。
存储器504中存储有可执行代码,处理器501执行该可执行代码以执行前述反序列化方法。具体的,存储器504中存储有前述进程空间,包括前述栈内存、堆内存、反序列化模块、对象池管理模块。计算设备500运行时,存储器504提供前述进程空间供使用。存储器504中除了存储进程空间,还可以包括操作系统等其他运行进程所需的软件模块。操作系统可以为LINUXTM,UNIXTM,WINDOWSTM等。
上述各个附图对应的流程的描述各有侧重,某个流程中没有详述的部分,可以参见其他流程的相关描述。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如SSD)等。
Claims (24)
1.一种计算设备执行反序列化的方法,其特征在于,包括:
运行进程并发送初始化指令至反序列化模块,所述初始化指令携带至少一个对象所属的类;
根据所述初始化指令,发送创建指令至对象池管理模块,所述创建指令携带所述至少一个对象所属的类;
根据所述创建指令,所述对象池管理模块在所述进程的内存空间中预先创建多个对象壳,其中,每一对象壳包括对象头和对象体,所述对象头包括类型指针,所述对象体中为元素预留了空间;
获取第一对象的序列化结果;
从所述多个对象壳中获取第一对象壳,根据所述第一对象壳反序列化所述第一对象的序列化结果以得到所述第一对象。
2.如权利要求1所述的方法,其特征在于,所述第一对象壳位于所述进程的老年代内存空间。
3.如权利要求1或2所述的方法,其特征在于,所述第一对象壳位于所述第一对象所属的类对应的对象池中,所述第一对象所属的类对应的对象池中包括至少一个对象壳,所述方法还包括:
从所述第一对象所属的类对应的对象池中选择空闲的所述第一对象壳以反序列化所述第一对象的序列化结果;
所述进程使用完毕所述第一对象后,释放所述第一对象壳,被释放的所述第一对象壳为空闲的。
4.如权利要求3所述的方法,其特征在于,所述释放所述第一对象壳包括:
清除所述第一对象体中为所述第一对象的元素预留的空间。
5.如权利要求1或2所述的方法,其特征在于,所述根据所述第一对象壳反序列化所述第一对象的序列化结果以得到所述第一对象包括:
为所述第一对象创建引用,所述引用指向所述第一对象壳;
将所述第一对象的序列化结果填入所述第一对象体中为所述第一对象的元素预留的空间。
6.如权利要求1或2所述的方法,其特征在于,所述方法还包括:
在所述进程的内存空间中创建引用类型的对象的第二对象壳,所述第二对象壳包括第二对象头和第二对象体,所述第二对象头包括所述引用类型的对象的类型指针,所述第二对象体中为所述引用类型的对象的元素预留了空间,所述引用类型的对象为所述第一对象的元素;
所述根据所述第一对象壳反序列化所述第一对象的序列化结果以得到所述第一对象包括:
将指向所述第二对象壳的指针填入所述第一对象体中为所述引用类型的元素预留的空间;
将所述第一对象的序列化结果中与所述引用类型的元素相关的部分填入所述第二对象体中为所述引用类型的对象的元素预留的空间。
7.如权利要求3所述的方法,其特征在于,释放所述第一对象壳后,所述方法还包括:
获取第二对象的序列化结果,所述第二对象和所述第一对象属于相同的类;
获取被释放的所述第一对象壳,根据被释放的所述第一对象壳反序列化所述第二对象的序列化结果以得到所述第二对象。
8.一种反序列化装置,其特征在于,包括反序列化模块、对象池管理模块和存储模块,
所述反序列化模块,用于获取初始化指令,所述初始化指令携带至少一个对象所属的类;所述反序列化模块,还用于根据所述初始化指令,发送创建指令至对象池管理模块,所述创建指令携带所述至少一个对象所属的类;
所述对象池管理模块,用于根据所述创建指令在所述存储模块中预先创建多个对象壳,其中,每一对象壳包括对象头和对象体,所述对象头包括类型指针,所述对象体中为元素预留了空间;获取第一对象的序列化结果;从所述多个对象壳中获取第一对象壳,根据所述第一对象壳反序列化所述第一对象的序列化结果以得到所述第一对象;
所述存储模块,用于存储所述第一对象壳。
9.如权利要求8所述的装置,其特征在于,所述第一对象壳位于使用所述第一对象的进程的老年代内存空间。
10.如权利要求8或9所述的装置,其特征在于,所述第一对象壳位于所述第一对象所属的类对应的对象池中,所述第一对象所属的类对应的对象池中包括至少一个对象壳;
所述存储模块,还用于存储所述第一对象所属的类对应的对象池;
所述对象池管理模块,还用于从所述第一对象所属的类对应的对象池中选择空闲的所述第一对象壳以反序列化所述第一对象的序列化结果;所述第一对象后被使用完毕后,释放所述第一对象壳,被释放的所述第一对象壳为空闲的。
11.如权利要求8或9所述的装置,其特征在于,所述对象池管理模块,用于清除所述第一对象体中为所述第一对象的元素预留的空间。
12.如权利要求8或9所述的装置,其特征在于,所述装置还包括反序列化模块,
所述反序列化模块,用于创建所述第一对象的引用,所述引用指向所述第一对象壳;
所述对象池管理模块,还用于将所述第一对象的序列化结果填入所述第一对象体中为所述第一对象的元素预留的空间。
13.如权利要求8或9所述的装置,其特征在于,所述对象池管理模块,还用于在所述存储模块中创建引用类型的对象的第二对象壳,所述第二对象壳包括第二对象头和第二对象体,所述第二对象头包括所述引用类型的对象的类型指针,所述第二对象体中为所述引用类型的对象的元素预留了空间,所述引用类型的对象为所述第一对象的元素;将指向所述第二对象壳的指针填入所述第一对象体中为所述引用类型的元素预留的空间;将所述第一对象的序列化结果中与所述引用类型的元素相关的部分填入所述第二对象体中为所述引用类型的对象的元素预留的空间。
14.如权利要求8或9所述的装置,其特征在于,所述对象池管理模块,还用于获取第二对象的序列化结果,所述第二对象和所述第一对象属于相同的类;获取被释放的所述第一对象壳,根据被释放的所述第一对象壳反序列化所述第二对象的序列化结果以得到所述第二对象。
15.一种计算设备,其特征在于,包括处理器和存储器,
所述处理器,用于运行进程并发送初始化指令至反序列化模块,所述初始化指令携带至少一个对象所属的类;根据所述初始化指令,发送创建指令至对象池管理模块,所述创建指令携带所述至少一个对象所属的类;根据所述创建指令,所述对象池管理模块在所述进程的内存空间中创建第一对象的第一对象壳,所述第一对象壳包括第一对象头和第一对象体,所述第一对象头包括所述第一对象的类型指针,所述第一对象体中为所述第一对象的元素预留了空间;获取所述第一对象的序列化结果;获取所述第一对象壳,根据所述第一对象壳反序列化所述第一对象的序列化结果以得到所述第一对象。
16.如权利要求15所述的设备,其特征在于,所述初始化指令还携带有所述至少一个对象所属的类中每一类的对象的数量和/或比例。
17.如权利要求15或16所述的设备,其特征在于,所述至少一个对象所属的类为所述进程可能使用到的对象所属的类。
18.如权利要求15或16所述的设备,其特征在于,所述第一对象壳位于所述进程的老年代内存空间。
19.如权利要求15或16所述的设备,其特征在于,所述第一对象壳位于所述第一对象所属的类对应的对象池中,所述第一对象所属的类对应的对象池中包括至少一个对象壳;
所述处理器,用于从所述第一对象所属的类对应的对象池中选择空闲的所述第一对象壳以反序列化所述第一对象的序列化结果;所述进程使用完毕所述第一对象后,释放所述第一对象壳,被释放的所述第一对象壳为空闲的。
20.如权利要求15或16所述的设备,其特征在于,所述处理器,用于清除所述第一对象体中为所述第一对象的元素预留的空间。
21.如权利要求15或16所述的设备,其特征在于,所述处理器,用于为所述第一对象创建引用,所述引用指向所述第一对象壳;将所述第一对象的序列化结果填入所述第一对象体中为所述第一对象的元素预留的空间。
22.如权利要求15或16所述的设备,其特征在于,所述处理器,用于在所述进程的内存空间中创建引用类型的对象的第二对象壳,所述第二对象壳包括第二对象头和第二对象体,所述第二对象头包括所述引用类型的对象的类型指针,所述第二对象体中为所述引用类型的对象的元素预留了空间,所述引用类型的对象为所述第一对象的元素;将指向所述第二对象壳的指针填入所述第一对象体中为所述引用类型的元素预留的空间;将所述第一对象的序列化结果中与所述引用类型的元素相关的部分填入所述第二对象体中为所述引用类型的对象的元素预留的空间。
23.如权利要求15或16所述的设备,其特征在于,所述处理器,用于获取第二对象的序列化结果,所述第二对象和所述第一对象属于相同的类;获取被释放的所述第一对象壳,根据被释放的所述第一对象壳反序列化所述第二对象的序列化结果以得到所述第二对象。
24.一种非瞬态的可读存储介质,其特征在于,所述非瞬态的可读存储介质被计算设备执行时,所述计算设备执行上述权利要求1至7中任一所述的方法。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/CN2018/093920 WO2020000484A1 (zh) | 2018-06-30 | 2018-06-30 | 一种反序列化方法、装置以及计算设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110914799A CN110914799A (zh) | 2020-03-24 |
CN110914799B true CN110914799B (zh) | 2023-02-28 |
Family
ID=68985742
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201880012901.9A Active CN110914799B (zh) | 2018-06-30 | 2018-06-30 | 一种反序列化方法、装置以及计算设备 |
Country Status (4)
Country | Link |
---|---|
US (1) | US20210004243A1 (zh) |
EP (1) | EP3620912A4 (zh) |
CN (1) | CN110914799B (zh) |
WO (1) | WO2020000484A1 (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6240498B1 (en) * | 1999-01-06 | 2001-05-29 | International Business Machines Corporation | Object oriented storage pool apparatus and method |
CN104360865A (zh) * | 2014-11-28 | 2015-02-18 | 中国建设银行股份有限公司 | 一种序列化方法、反序列化方法及相关设备 |
CN104461745A (zh) * | 2014-12-23 | 2015-03-25 | 中科创达软件股份有限公司 | 一种内存优化方法及装置 |
CN106155630A (zh) * | 2015-04-14 | 2016-11-23 | 阿里巴巴集团控股有限公司 | 序列化方法、反序列化方法、序列化装置及反序列化装置 |
CN106250242A (zh) * | 2016-08-10 | 2016-12-21 | 西安诺瓦电子科技有限公司 | 基于操作系统的内存复用方法及装置 |
CN106294385A (zh) * | 2015-05-19 | 2017-01-04 | 阿里巴巴集团控股有限公司 | 数据对象序列化和反序列化数据对象的方法及装置 |
CN107341262A (zh) * | 2017-07-14 | 2017-11-10 | 上海达梦数据库有限公司 | 数据库中对象类型列的序列化、反序列化方法及装置 |
CN107463668A (zh) * | 2017-08-02 | 2017-12-12 | 湖南新航动力信息科技有限公司 | 序列化和反序列化的方法及装置、计算机设备及存储介质 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6275916B1 (en) * | 1997-12-18 | 2001-08-14 | Alcatel Usa Sourcing, L.P. | Object oriented program memory management system and method using fixed sized memory pools |
US6928488B1 (en) * | 2001-06-27 | 2005-08-09 | Microsoft Corporation | Architecture and method for serialization and deserialization of objects |
CN101122852A (zh) * | 2006-08-08 | 2008-02-13 | 华为技术有限公司 | 一种联机事务处理系统中间件的封装方法 |
US8935662B2 (en) * | 2011-02-15 | 2015-01-13 | Red Hat Israel, Ltd. | Generating persistent variables in a shell environment |
US10642663B2 (en) * | 2014-09-10 | 2020-05-05 | Oracle International Corporation | Coordinated garbage collection in distributed systems |
US10467321B2 (en) * | 2017-09-07 | 2019-11-05 | Mastercard International Incorporated | Systems and methods for dynamic C# serialization |
US10795704B2 (en) * | 2019-03-01 | 2020-10-06 | Red Hat, Inc. | Serialization of objects to java bytecode |
-
2018
- 2018-06-30 WO PCT/CN2018/093920 patent/WO2020000484A1/zh unknown
- 2018-06-30 CN CN201880012901.9A patent/CN110914799B/zh active Active
- 2018-06-30 EP EP18920191.6A patent/EP3620912A4/en active Pending
-
2020
- 2020-09-23 US US17/030,003 patent/US20210004243A1/en active Pending
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6240498B1 (en) * | 1999-01-06 | 2001-05-29 | International Business Machines Corporation | Object oriented storage pool apparatus and method |
CN104360865A (zh) * | 2014-11-28 | 2015-02-18 | 中国建设银行股份有限公司 | 一种序列化方法、反序列化方法及相关设备 |
CN104461745A (zh) * | 2014-12-23 | 2015-03-25 | 中科创达软件股份有限公司 | 一种内存优化方法及装置 |
CN106155630A (zh) * | 2015-04-14 | 2016-11-23 | 阿里巴巴集团控股有限公司 | 序列化方法、反序列化方法、序列化装置及反序列化装置 |
CN106294385A (zh) * | 2015-05-19 | 2017-01-04 | 阿里巴巴集团控股有限公司 | 数据对象序列化和反序列化数据对象的方法及装置 |
CN106250242A (zh) * | 2016-08-10 | 2016-12-21 | 西安诺瓦电子科技有限公司 | 基于操作系统的内存复用方法及装置 |
CN107341262A (zh) * | 2017-07-14 | 2017-11-10 | 上海达梦数据库有限公司 | 数据库中对象类型列的序列化、反序列化方法及装置 |
CN107463668A (zh) * | 2017-08-02 | 2017-12-12 | 湖南新航动力信息科技有限公司 | 序列化和反序列化的方法及装置、计算机设备及存储介质 |
Non-Patent Citations (5)
Title |
---|
Generational Garbage Collection Algorithm Based on Lifespan Prediction;Xin Ren 等;《2016 4th International Conference on Future Internet of Things and Cloud Workshops》;20160822;183-187 * |
Object serialization support for object oriented java processors;J. C. Ross 等;《2008 International Symposium on Information Technology》;20080826;第3卷;1-6 * |
Process of Pooling Objects;源数据没有提供作者名;《https://ip.com/IPCOM/000035508》;20501201;1 * |
Reducing Memory Management Activity in a Virtual Machine through the use of Internal Object Pools;源数据没有提供作者名;《https://ip.com/IPCOM/000251646》;20171121;1-6 * |
源数据没有提供作者名.Process of Pooling Objects.《https://ip.com/IPCOM/000035508》.2050,1. * |
Also Published As
Publication number | Publication date |
---|---|
US20210004243A1 (en) | 2021-01-07 |
WO2020000484A1 (zh) | 2020-01-02 |
CN110914799A (zh) | 2020-03-24 |
EP3620912A1 (en) | 2020-03-11 |
EP3620912A4 (en) | 2020-08-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP2488950B1 (en) | A tiered data management method and system for high performance data monitoring | |
JP2020038623A (ja) | データを記憶するための方法、装置及びシステム | |
US7496586B1 (en) | Method and apparatus for compressing data in a file system | |
CN111930473B (zh) | 在容器云上部署图像识别服务的方法与设备 | |
CN110928483B (zh) | 数据存储、数据获取方法及设备 | |
US20190026317A1 (en) | Memory use in a distributed index and query system | |
US10649967B2 (en) | Memory object pool use in a distributed index and query system | |
CN106570113B (zh) | 一种海量矢量切片数据云存储方法及系统 | |
KR20080043517A (ko) | 통신 소프트웨어 구조에서의 도메인 프로파일 파싱 장치 및그 방법 | |
EP4296854A1 (en) | Application management method and apparatus | |
CN116680040A (zh) | 一种容器处理方法、装置、设备、存储介质及程序产品 | |
CN115712500A (zh) | 内存释放、内存恢复方法、装置、计算机设备及存储介质 | |
US11080909B2 (en) | Image layer processing method and computing device | |
US7028287B2 (en) | Method and apparatus for facilitating compact object headers | |
CN110914799B (zh) | 一种反序列化方法、装置以及计算设备 | |
CN110750221B (zh) | 卷克隆方法、装置、电子设备及机器可读存储介质 | |
CN111435323B (zh) | 信息的传输方法、装置、终端、服务器及存储介质 | |
CN110543357B (zh) | 管理应用程序对象的方法,相关装置及系统 | |
CN112346848A (zh) | 一种管理内存池的方法、装置及终端 | |
US20230147878A1 (en) | Implementing heterogeneous memory within a programming environment | |
CN113609091B (zh) | 日志管理方法、装置、设备及存储介质 | |
CN1828596A (zh) | 在数据库内部表示的文件系统 | |
CN111435302B (zh) | 一种应用程序的处理方法及装置 | |
CN110941591A (zh) | 一种文件删除方法、装置、设备及可读存储介质 | |
CN113741787B (zh) | 一种数据存储方法、装置、设备、介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20220223 Address after: 550025 Huawei cloud data center, jiaoxinggong Road, Qianzhong Avenue, Gui'an New District, Guiyang City, Guizhou Province Applicant after: Huawei Cloud Computing Technology Co.,Ltd. Address before: 518129 Bantian HUAWEI headquarters office building, Longgang District, Guangdong, Shenzhen Applicant before: HUAWEI TECHNOLOGIES Co.,Ltd. |
|
TA01 | Transfer of patent application right | ||
GR01 | Patent grant | ||
GR01 | Patent grant |