具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本申请保护的范围。
图1所示为本申请核心构思的示意图。如图1所示本申请的核心思想之一在于提出一种垃圾回收的优化方法、装置、终端设备及机器可读介质,在源程序20加载至内存管理单元100的指定区域10之后,当源程序运行结束需要回收内存之前,可以标记不需要回收的对象,这些区域例如包括存放提前编译文件的指定区域10中的多个第一对象11、12、13、第一对象引用的指定区域10以外的第二对象21。本发明利用提前编译文件存储的区域不需要进行垃圾回收的特点,直接对提前编译区域和相关区域中的对象进行标记,节省了逐个判断区域中的对象是否需要回收的时间,从而提高了垃圾回收的效率。
第一实施例
本发明第一实施例提出一种垃圾回收的优化方法。图2所示为本发明第一实施例的垃圾回收的优化方法的步骤流程图。如图2所示,本发明实施例的垃圾回收的优化方法包括如下步骤:
S101,在回收内存管理单元前,判断文件包含的多个第一对象是否引用了所述文件所在的指定区域以外的第二对象,其中所述指定区域位于所述内存管理单元中;
上述的文件例如可以为提前编译文件,也可以为其他类型的文件。对于动态编程语言,提前编译文件是由源程序进行编译之后存储在内存管理单元的指定区域中的。在内存管理单元回收之前,例如是在将源程序对应的提前编译文件加载至内存管理单元的指定区域的过程中,和/或,运行源程序的过程中,可以对第一对象是否引用了指定区域之外的第二对象进行判断。其中第一对象中可以具有指针,该指针指向引用的第二对象的地址。当判断第二对象的地址位于指定区域之外,则判断第一对象引用了外部的第二对象。
具体来说,执行主体,例如服务器、客户端等各种电子装置,可以首先调用***的已有的编译器中的源程序处理程序,将源程序进行编译,生成编译数据,之后,***该可以将编译数据链接至内存管理单元,由内存管理单元进行管理。随后,***可以依据链接至内存管理单元中的编译数据生成提前编译文件。内存管理单元是内存区域的一部分,是虚拟机***管理的用于满足程序动态内存分配的内存区域,相比于普通的用于存放代码和对象的内存区域,内存管理单元是虚拟机划定的特定区域,用来管理生成的脚本语言对象。
在生成提前编译文件之后,可以将提前编译文件加载至内存管理单元的指定区域。例如将所述提前编译文件映射至动态编程语言***的***存储空间;以及将映射至所述内存空间的提前编译文件加载到所述内存管理单元。
在映射的过程中,可以在内存管理单元中标记指定区域,作为提前编译文件的存储空间,这一指定区域也可以称为提前编译区域。如上述,在提前编译文件加载的过程中,执行主体可以判断提前编译文件中的每一个对象是否引用了该指定区域之外的其他区域。
上述“对象”是可被视为一个单元的代码和数据的组合。对象可以是一段应用程序,如控件或窗体。整个应用程序也可以是一个对象。如上述,指针是对象中指向一段内存的地址。当判断出某个对象的指针指向的地址区域为该指定区域之外的区域时,则认为第一对象引用的第二对象为指定区域外的地址区域。
在执行步骤S101之后,可以执行步骤S102如下:
S102,在确定其中一个或多个第一对象引用所述指定区域以外的第二对象的情况下,记录所述第二对象的地址;
在这一步骤中,在判断出第一对象的指针所指向的是指定区域外的区域时,则确定第一对象引用指定区域以外的第二对象,为了防止第二对象的地址在后续被错误地回收,在这一步骤中,可以记录第二对象的地址,存储于存储区域中,例如现有的RememberSet、StoreBuffer、cardtable、数组、列表等存储结构中。
在执行步骤S102之后,可以执行步骤S103如下:
S103,确定所述指定区域以及所述第二对象所在的地址为非回收区域。
在上一步骤中,确定了第二对象的地址之后,可以在存储空间中记载这些对象所在的地址,并对这些地址中的第二对象进行标记。在这一步骤中,可以根据步骤S103标记的对象,确定这些对象对应的区域为非回收区域。
针对指定区域,可以分别标记指定区域中的每一个第一对象为非回收对象,也可以针对区域整体进行标记,在此不再赘述。
此外,在回收内存管理单元中,由于存储提前编译文件的指定区域本身为不可回收区域,因此可以将上述指定区域,即提前编译区域整体作为非回收区域。在一些实施例中,可以回收上述的指定区域、第二对象所在的区域以外的其他所有区域,在另一些实施例中,除了指定区域、第二对象所在的区域以外,执行主体还可以按照其他原则标记其他非回收区域,并在回收中一并跳过这些区域,对标记的区域以外的区域进行回收。
由上述可知,本发明第一实施例提出的垃圾回收的优化方法至少具有如下技术效果:
本申请提供的方案中,依据存放提前编译文件的指定区域的对象无需被垃圾回收的特点,在垃圾回收时不再遍历提前编译文件的指定区域以及与提前编译文件相关的区域,因此可以不需要像现有技术一般对内存管理单元中的全部的对象做标记,从而省去了很大一部分标记的时间,因此,本发明实施例提出的方案能够节约提前编译文件运行后的垃圾回收的时间,提升了用户体验。
第二实施例
本发明第二实施例提出一种垃圾回收的优化方法。图3所示为本发明第二实施例的垃圾回收的优化方法的步骤流程图。如图3所示,本发明实施例的垃圾回收的优化方法如下步骤:
S204,在回收内存管理单元前,判断文件包含的多个第一对象是否引用了所述文件所在的指定区域以外的第二对象,其中所述指定区域位于所述内存管理单元中;
S205,在确定其中一个或多个第一对象引用所述指定区域以外的第二对象的情况下,记录所述第二对象的地址;
S207,确定所述指定区域以及所述第二对象所在的地址为非回收区域。
上述步骤S204、S205和步骤S207与上一实施例的步骤S101至步骤S104相同或相似,在此不再赘述。本实施例重点说明与上一实施例的不同之处。
在一实施例中,在步骤S205之后,可以执行步骤S206如下:
S206,在回收内存管理单元的情况下,依据所述第二对象的地址确定所述第二对象的子对象;
在这一步骤中,当提前编译文件对应的源程序运行完毕,为了防止不再活跃的对象占用内存管理单元的太多空间,可以对内存管理单元进行回收,清扫不再活跃的非可达对象,回收空间。在回收过程中,可以从步骤S205记录的第二对象的地址出发,遍历第二对象的子节点,确定第二对象包含的多个的子对象。在一实施例中,可以对第二对象及其每一个子对象进行标记,标记为非回收对象,以避免第二对象所在的区域在后续被错误地回收。
在本发明一实施例中,所述步骤S206,依据所述第二对象的地址确定所述第二对象的子对象的步骤可以为:
以所述第一对象中指向所述第二对象的指针作为根节点,遍历获得所述第二对象的子对象。
S208,确定所述第二对象的子对象所在的地址为非回收区域。
在一实施例中,在步骤S204之前,该方法还可以包括如下步骤:
S201,根据源程序生成编译数据;
S202,将所述编译数据链接至内存管理单元;
S203,依据链接至内存管理单元中的编译数据生成提前编译文件。
在上述步骤S201,即根据源程序生成编译数据的步骤中,执行主体,例如服务器、客户端等各种电子装置,可以调用***的已有的编译器中的源程序处理程序,例如词法解析、语法分析、字节码生成组件等,对源程序进行编译词法解析、语法解析,生成动态语言***可以直接运行的字节码和/或本地代码,以及相关的常量池和符号表,这些字节码、常量池和符号表可以称为源程序经过编译后生成的“编译数据”,即编译数据可以包括字节码、常量池和符号表。
在上述编译数据中,字节码(Byte-code)是一种经过编译器预处理过的二进制文件,其包含执行程序,并由一序列操作码/数据对组成。符号表是一种数据结构,其为每一个变量名字创建一个记录条目,记录的字段就是名字的各个属性,该数据结构允许编译器迅速查找到每个变量名字的记录条目,并向记录条目中快速存放变量的属性、存储位置等编译数据,并获取记录中的上述编译数据。常量池中包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值,还包含一些以文本形式出现的符号引用,比如:类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等。
在上述步骤S202,即将所述编译数据链接至内存管理单元的步骤中,***该可以将编译数据链接至内存管理单元,由内存管理单元进行管理。其中,“链接”可以指指将编译器生成的一个或多个目标文件(object files)组合成一个可执行文件、库文件或者另一个目标文件的过程。
当这些编译数据存储在存储空间时,步骤S202具体可以包括将这些字节码和符号表、常量池等编译数据所在的存储空间链接至内存管理单元。
将存储空间“链接”至内存管理单元,例如是将创建的存储空间对应的虚拟地址加入到内存管理单元中,由内存管理单元对该存储空间进行管理。在实现上,可以将编译数据移动至动态编程语言***的存储空间中,并链接至内存管理单元。
动态编程语言***的存储空间的单位例如是“存储页”,在这一步骤中,可以将上述编译数据移动至存储页内,将存储页中的编译数据作为一个整体链接至内存管理单元上。在一可选实施例中,这些存储页可以为连续的存储页,例如为临时创建的存储页,这些存储页的格式与所述动态编程语言***的存储页格式相匹配,例如格式一致。将编译数据移动到连续的存储页可以节省空间,以在将编译数据写入提前编译文件时节省存储空间。
这一步骤中,将编译数据链接到内存管理单元上,可以是将编译数据所在的存储页的连续或不连续的页地址链接到内存管理单元上。当包含上述编译数据的页地址被链接到内存管理单元上后,这些页方能被内存管理单元管理,包括执行读取、遍历等操作,以顺利执行后续的加载过程。
在上述步骤S203,即依据所述链接至内存管理单元中的编译数据生成提前编译文件的步骤中,***可以依据链接至内存管理单元中的编译数据生成提前编译文件。具体地,如果编译数据是存储在存储空间中,而存储空间的地址已在步骤S202中链接至内存管理单元,则在步骤S203中,这些编译数据便可以由动态编程语言***来进行管理。在这一步骤中,动态编程语言***可以对编程数据的存储空间进行扫描,获取指定的内容写入提前编译文件。
在一具体实施例中,可以按照指定格式,例如提前编译文件的格式,从存储空间中的编译数据中提取所述指定格式中的各项目对应的项目内容,并将各项目内容写入提前编译文件,从而生成满足指定格式的提前编译文件。
上述指定格式可以是***原先定义的或者由开发人员定义的。在本申请一实施例中,指定格式包括的项目例如可以包括:文件头、程序字节码地址表、公用对象地址表、提前编译对象页面地址表和提前编译对象页表等至少其一;上述文件头例如可以包括:源程序数量、公用对象数量、编译数据占用的存储空间信息,例如占用的页面数。程序字节码地址表用于存储编译数据中的字节码地址;公用对象地址表用于存储编译数据对应的公用对象的地址;提前编译文件地址表用于存储所述提前编译文件的地址;提前编译对象页表用于存储所述提前编译文件对应的对象的地址。
在这一步骤中,执行主体可以遍历上述编译数据的存储空间,按照提前编译文件头格式构造文件头结构,写入文件。然后依次写入程序字节码地址表、公用对象地址表、提前编译文件地址表、提前编译对象地址表。最后写入存储空间的所有页面内容,从而依据编译数据生成提前编译文件。
在上述步骤S204中,在将文件加载至所述内存管理单元的过程中,可以读入文件头并映射到***空间;根据所述文件头中对应的源程序数量、公用对象数量和编译数据占用的存储空间信息,将所述提前编译文件映射至动态编程语言***的***存储空间;以及将映射至所述内存空间的提前编译文件加载到所述内存管理单元。
在读入文件头并映射到***空间的步骤中,可以读取文件头,并将文件头映射到***内存的进程空间;从而可以由动态编程语言***快速访问文件头这一项目所对应的项目内容。之后,可以利用文件头的结构,将提前编译文件中的存储页面中的存储内容依次映射到***内存的进程空间,并链接到内存管理单元中,即将这些页面对应的地址加入内存管理单元中,以在动态语言***访问这些页面中的地址时,可以像正常的动态语言***访问自己生成的内容一样。
在一实施例中,该方法还可以包括如下步骤:
S209,遍历所述内存管理单元中的其他对象,判断所述其他对象是否包括非回收对象。
在这一步骤中,“其他对象”可以为已进行标记的对象以外的对象。根据前述步骤可知,已标记的对象包括指定区域中的第一对象、第一对象引用的第二对象、以及可选实施例中的第二对象的子对象,除了这些之外,内存管理单元中还可以存在多个其他对象,可以根据开发人员设定的判断规则,判断其他对象是否包括非回收对象,例如活对象。当存在非回收对象时,可以根据相同的标记方法,对这些非回收对象进行标记。
在一实施例中,该方法还可以包括如下步骤:
S210,回收所述内存管理单元中的所述非回收对象所在的区域以外的其他区域。
在这一步骤中,可以对步骤S209中判断获得的非回收对象所在的区域以外的其他区域进行回收,实现***内存空间的重复利用。
在本发明一实施例中,步骤S204中的“内存管理单元回收前”包括将源程序对应的提前编译文件加载至内存管理单元的指定区域的过程中,和/或,运行源程序的过程中。将将源程序对应的提前编译文件加载至内存管理单元的指定区域的步骤可以通过如下子步骤实现:
S2041,向所述内存管理单元的指定区域加载提前编译文件;
S2042,将所述指定区域标记为提前编译区域;
S2043,对所述提前编译区域进行初始化。
其中,向所述内存管理单元的指定区域加载提前编译文件可以通过如下方式实现:
读入文件头并映射到***空间;根据所述文件头中对应的源程序数量、公用对象数量和编译数据占用的存储空间信息,将所述提前编译文件映射至动态编程语言***的***存储空间;以及将映射至所述内存空间的提前编译文件加载到所述内存管理单元。
在读入文件头并映射到***空间的步骤中,可以读取文件头,并将文件头映射到***内存的进程空间;从而可以由动态编程语言***快速访问文件头这一项目所对应的项目内容。之后,可以利用文件头的结构,将提前编译文件中的存储页面中的存储内容依次映射到***内存的进程空间,并链接到内存管理单元中,即将这些页面对应的地址加入内存管理单元中,以在动态语言***访问这些页面中的地址时,可以像正常的动态语言***访问自己生成的内容一样。
子步骤S2042将所述指定区域标记为提前编译区域的步骤中,可以在向内存管理单元的指定区域加载提前编译文件之后,将该指定区域标记为提前编译区域,即存放提前编译文件的区域。
子步骤S2043中,可以对提前编译区域进行初始化。
初始化***是将***环境初始化至可以运行源程序的程度,例如释放不需要的变量、为动态编程***分配***空间等;在初始化之后可以运行源程序。
在上述步骤S204中,运行源程序的过程可以通过如下方式实现:由于根据源程序所生成的编译数据对应的提前编译文件已存在于内存管理单元中,初始化之后运行源程序的步骤中,源程序可以直接运行,不需要执行读入字节码、译码、反序列化、重构对象的步骤,减少了***内存占用量。动态语言程序在运行时可以执行引进新的函数、删除已有的函数等动态行为,可以动态地产生代码,例如字节码或者本地代码,因此在运行过程中,可以检查所修改的地址区域是否指向了指定区域之外的区域,可以用于判定指定区域内的第一对象是否引用了指定区域以外的第二对象。
在一实施例中,所述判断所述文件包含的第一对象是否引用了所述文件所在的指定区域以外的第二对象的步骤S204,可以包括如下子步骤:
S2041,分别判断所述提前编译文件包括的多个第一对象的指针是否指向所述指定区域以外的区域;
S2042,当确定所述指针指向所述指定区域以外的区域时,确定所述第一对象引用了指定区域以外的第二对象。
在子步骤S2041和子步骤S2042中,例如在提前编译文件加载到内存管理单元的指定区域的过程中,可以通过第一对象的指针指向的区域判断其引用的第二对象是否在指定区域内。例如,可以预先获取指定区域的地址信息,用第二对象的地址与指定区域的地址信息对比,判断第二对象是否在指定区域内。
在一实施例中,所述确定所述文件包含的第一对象是否引用了所述文件所在的指定区域以外的第二对象的步骤S204,包括:
S2043,在对所述提前编译文件中的第一对象的地址进行修改时,判断修改后的第一对象的地址是否位于所述指定区域以外的区域;
S2044,当判断修改后的对象的地址位于所述指定区域以外的区域,确定所述第一对象引用了指定区域以外的第二对象。
在子步骤S2043到S2044中,例如在运行源程序的过程中,当检测到第一对象的地址被修改,例如被开发人员修改之后,判断修改后的第一对象的地址是否仍位于指定区域内。例如,可以预先获取指定区域的地址信息,用修改后的第一对象引用的地址与指定区域的地址信息对比,判断第一对象修改后的引用地址是否在指定区域内。
图4为本发明第一实施例对应的垃圾回收方法的示意性流程图。在图4中,将提前编译文件的执行到回收划分为三个阶段,分别为加载、运行和回收。
如图4所示,在加载阶段,在步骤S11中可以对提前编译文件进行读取,存放于内存管理单元的指定区域中。在步骤S12中可以初始化该指定区域,例如释放不需要的变量、为动态编程***分配***空间等,在步骤S13中,当指定区域的第一对象引用指定区域之外的第二对象时,可以记录第二对象的地址。
在运行阶段,在步骤S21中运行提前编译文件的源程序,在步骤S22中当确认第一对象的地址被修改,且修改后的地址位于指定区域之外时,记录运行中第一对象被修改的地址。
在垃圾回收阶段,在步骤S31中首先将指定区域中的第一对象标记为非回收对象,在可选的步骤S32中,从第二对象的地址出发进行深度遍历,获取第二对象的多个子对象,对第二对象和多个子对象进行标记。在步骤S33中可以对其他对象进行遍历并标记非回收对象。在步骤S34中,针对未标注的对象,进行清扫和回收内存。
综上所述,本实施例提出的垃圾回收的优化方法至少具有如下优点:
本申请提供的方案中,依据存放提前编译文件的指定区域的对象无需被垃圾回收的特点,在垃圾回收时不再遍历提前编译文件的指定区域以及与提前编译文件相关的区域,因此可以不需要像现有技术一般对内存管理单元中的全部的对象做标记,从而省去了很大一部分标记的时间,因此,本发明实施例提出的方案能够节约提前编译文件运行后的垃圾回收的时间,提升了用户体验。
除此之外,本实施例提出的垃圾回收的优化方法至少还包括如下优点:
在本发明可选实施例中,在存储提前编译文件在加载过程中、以及提前编译文件运行时记录所有从存储提前编译文件的对象指向非指定区域的对象的地址,在垃圾回收时以这些记录的地址指向的对象为根节点,深度遍历所有子节点并标记为活对象,以防止存储提前编译文件的指定区域的对象引用的非指定区域对象在垃圾回收时被错误的清除。
第三实施例
本发明第三实施例提出一种垃圾回收方法,图5所示为一实施例的垃圾回收方法的流程图。如图5所示,该方法包括:
S301,判断文件包含的多个第一对象是否引用了文件所在的指定区域以外的第二对象;
在这一步骤中,可以将文件加载至内存管理单元的指定区域。例如将所述文件映射至动态编程语言***的***存储空间;以及将映射至所述内存空间的文件加载到所述内存管理单元。
在映射的过程中,可以在内存管理单元中标记指定区域。如上述,在文件加载的过程中,执行主体可以判断文件中的每一个对象是否引用了该指定区域之外的其他区域。
上述“对象”是可被视为一个单元的代码和数据的组合。对象可以是一段应用程序,如控件或窗体。整个应用程序也可以是一个对象。如上述,指针是对象中指向一段内存的地址。当判断出某个对象的指针指向的地址区域为该指定区域之外的区域时,则认为第一对象引用的第二对象为指定区域外的地址区域。
S302,在确定其中一个或多个第一对象引用所述指定区域以外的第二对象的情况下,记录所述第二对象的地址;
在这一步骤中,在判断出第一对象的指针所指向的是指定区域外的区域时,则确定第一对象引用指定区域以外的第二对象,为了防止第二对象的地址在后续被错误地回收,在这一步骤中,可以记录第二对象的地址,存储于存储区域中,例如现有的RememberSet、StoreBuffer、cardtable、数组、列表等存储结构中。
S304,确定所述指定区域、所述第二对象所在的区域为非回收区域。
在上一步骤中,确定了第二对象之后,可以在存储空间中记载这些对象所在的地址,并对这些地址中的第二对象进行标记。在这一步骤中,可以根据步骤S302标记的对象,确定这些对象对应的区域为非回收区域。
此外,在回收内存管理单元中,由于指定区域本身为不可回收区域,因此可以将上述指定区域整体作为非回收区域。在一些实施例中,可以回收上述的指定区域、第二对象所在的区域以外的其他所有区域,在另一些实施例中,除了指定区域、第二对象所在的区域以外,执行主体还可以按照其他原则标记其他非回收区域,并在回收中一并跳过这些区域,对标记的区域以外的区域进行回收。
在一可选实施例中,还可以包括如下步骤:
S303,在回收内存管理单元的情况下,依据所述第二对象的地址确定所述第二对象的子对象;
在这一步骤中,为了防止内存管理单元不再活跃的对象占用内存管理单元的太多空间,可以对内存管理单元进行回收,清扫不再活跃的对象,回收空间。在回收过程中,可以从步骤S302记录的第二对象的地址出发,遍历第二对象的子节点,确定第二对象包含的多个的子对象。在一实施例中,可以对第二对象及其每一个子对象进行标记,标记为非回收对象,以避免第二对象所在的区域在后续被错误地回收。
S305,确定所述第二对象的子对象所在的地址为非回收区域。
在这一步骤中,可以确定第二对象的子对象也为非回收对象。
在一实施例中,所述文件可以为提前编译文件,所述指定区域可以为提前编译区域。在其他实施例中,所述指定区域可以为非提前编译区域,所述指定区域可以加入其他对象或者区域,也可由开发人员所指定的特定区域。例如,该特定区域中存储的文件中的多个第一对象的被调用频率高于第一阈值;所述多个第一对象引用所述指定区域以外的第二对象的频率低于第二阈值。其中第一阈值例如可以为内存管理单元中的所有对象被调用的次数的平均值;第二阈值例如是内存管理单元中的所有对象引用外部对象的频率的平均值。
综上所述,本实施例提出的垃圾回收的优化装置至少具有如下优点:
本申请提供的方案中,依据存放特定的文件的指定区域的对象无需被垃圾回收的特点,在垃圾回收时不再遍历特定的文件的指定区域以及相关的区域,因此可以不需要像现有技术一般对内存管理单元中的全部的对象做标记,从而省去了很大一部分标记的时间,因此,本发明实施例提出的方案能够节约文件运行后的垃圾回收的时间,提升了用户体验。
第四实施例
本发明第四实施例提出一种垃圾回收的优化装置,如图6所示,该装置包括:
第一对象确定模块401,用于在回收内存管理单元前,确定所述提前编译文件包含的多个第一对象是否引用了所述文件所在的指定区域以外的第二对象;
第一记录模块402,用于在确定其中一个或多个第一对象引用所述指定区域以外的第二对象的情况下,记录所述第二对象的地址;
第一标记模块403,用于确定所述指定区域以及所述第二对象所在的区域为非回收区域。
综上所述,本实施例提出的垃圾回收的优化装置至少具有如下优点:
本申请提供的方案中,依据存放提前编译文件的指定区域的对象无需被垃圾回收的特点,在垃圾回收时不再遍历提前编译文件的指定区域以及与提前编译文件相关的区域,因此可以不需要像现有技术一般对内存管理单元中的全部的对象做标记,从而省去了很大一部分标记的时间,因此,本发明实施例提出的方案能够节约提前编译文件运行后的垃圾回收的时间,提升了用户体验。
第五实施例
本发明第五实施例提出一种垃圾回收的优化装置,如图7所示,该装置包括:
第一对象确定模块501,用于在回收内存管理单元前,确定所述提前编译文件包含的多个第一对象是否引用了所述文件所在的指定区域以外的第二对象;
第一记录模块502,用于在确定其中一个或多个第一对象引用所述指定区域以外的第二对象的情况下,记录所述第二对象的地址;
第一标记模块504,用于确定所述指定区域、所述第二对象所在的区域为非回收区域。
在一可选实施例中,所述装置还包括:
第一地址确定模块503,用于在回收内存管理单元的情况下,依据所述第二对象的地址确定所述第二对象的子对象。
在一可选实施例中,第一标记模块504还可以用于确定所述第二对象的子对象所在的区域为非回收区域。
在一可选实施例中,所述第一子对象确定模块503用于:
将所述第二对象的地址作为根节点,遍历所述根节点的所有可达节点,将所述可达节点的对象作为第二对象的子对象。
在一可选实施例中,所述装置还包括:
第一判断模块505,用于遍历所述内存管理单元中的其他对象,判断所述其他对象是否为非回收对象。
在一可选实施例中,所述装置还包括:
第一回收模块506,用于回收所述内存管理单元中的所述非回收对象所在的区域以外的其他区域。
在一可选实施例中,所述第一对象确定模块501包括:
第一判定子模块,用于分别判断所述文件包括的多个第一对象的指针是否指向所述指定区域以外的区域;
第一确定子模块,用于当确定所述指针指向所述指定区域以外的区域时,确定所述第一对象引用了指定区域以外的第二对象。
在一可选实施例中,所述第一对象确定模块501包括:
第二判定子模块,用于在对所述文件中的对象的地址进行修改时,判断修改后的对象的地址是否位于所述指定区域以外的区域;
第二确定子模块,用于当判断修改后的对象的地址位于所述指定区域以外的区域,确定所述第一对象引用了指定区域以外的第二对象。
在一可选实施例中,所述装置还包括:
编译数据生成模块507,用于根据源程序生成编译数据;
链接模块508,用于将所述编译数据链接至内存管理单元;
提前编译文件生成模块509,用于依据链接至内存管理单元中的编译数据生成提前编译文件。
在一可选实施例中,所述内存管理单元回收前包括:
将源程序对应的提前编译文件加载至内存管理单元的指定区域的过程中,和/或,
运行源程序的过程中。
综上所述,本实施例提出的垃圾回收的优化装置至少具有如下优点:
本申请提供的方案中,依据存放提前编译文件的指定区域的对象无需被垃圾回收的特点,在垃圾回收时不再遍历提前编译文件的指定区域以及与提前编译文件相关的区域,因此可以不需要像现有技术一般对内存管理单元中的全部的对象做标记,从而省去了很大一部分标记的时间,因此,本发明实施例提出的方案能够节约提前编译文件运行后的垃圾回收的时间,提升了用户体验。
除此之外,本实施例提出的垃圾回收的优化装置至少还包括如下优点:
在本发明可选实施例中,在存储提前编译文件在加载过程中、以及提前编译文件运行时记录所有从存储提前编译文件的对象指向非指定区域的对象的地址,在垃圾回收时以这些记录的地址指向的对象为根节点,深度遍历所有子节点并标记为活对象,以防止存储提前编译文件的指定区域的对象引用的非指定区域对象在垃圾回收时被错误的清除。
第六实施例
本发明第六实施例提出一种垃圾回收的优化装置,如图8所示,该装置包括:
第二对象确定模块601,用于确定文件包含的多个第一对象是否引用了所述文件所在的指定区域以外的第二对象;
第二记录模块602,用于在确定其中一个或多个第一对象引用所述指定区域以外的第二对象的情况下,记录所述第二对象的地址;
第二标记模块604,用于确定所述指定区域以及所述第二对象所在的地址为非回收区域。
可选地,该装置还可以包括第二子对象确定模块603,用于依据所述第二对象的地址确定所述第二对象的子对象。
第二标记模块604还可以用于确定所述第二对象的子对象所在的地址为非回收区域
综上所述,本实施例提出的垃圾回收的优化装置至少具有如下优点:
本申请提供的方案中,依据存放提前编译文件的指定区域的对象无需被垃圾回收的特点,在垃圾回收时不再遍历提前编译文件的指定区域以及与提前编译文件相关的区域,因此可以不需要像现有技术一般对内存管理单元中的全部的对象做标记,从而省去了很大一部分标记的时间,因此,本发明实施例提出的方案能够节约提前编译文件运行后的垃圾回收的时间,提升了用户体验。
除此之外,本实施例提出的垃圾回收的优化装置至少还包括如下优点:
在本发明可选实施例中,在存储提前编译文件在加载过程中、以及提前编译文件运行时记录所有从存储提前编译文件的对象指向非指定区域的对象的地址,在垃圾回收时以这些记录的地址指向的对象为根节点,深度遍历所有子节点并标记为活对象,以防止存储提前编译文件的指定区域的对象引用的非指定区域对象在垃圾回收时被错误的清除。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。
图9为本申请一实施例提供的终端设备的硬件结构示意图。如图9所示,该终端设备可以包括输入设备90、处理器91、输出设备92、存储器93和至少一个通信总线94。通信总线94用于实现元件之间的通信连接。存储器93可能包含高速RAM存储器,也可能还包括非易失性存储NVM,例如至少一个磁盘存储器,存储器93中可以存储各种程序,用于完成各种处理功能以及实现本实施例的方法步骤。
可选的,上述处理器91例如可以为中央处理器(Central Processing Unit,简称CPU)、应用专用集成电路(ASIC)、数字信号处理器(DSP)、数字信号处理设备(DSPD)、可编程逻辑器件(PLD)、现场可编程门阵列(FPGA)、控制器、微控制器、微处理器或其他电子元件实现,该处理器91通过有线或无线连接耦合到上述输入设备90和输出设备92。
可选的,上述输入设备90可以包括多种输入设备,例如可以包括面向用户的用户接口、面向设备的设备接口、软件的可编程接口、摄像头、传感器中至少一种。可选的,该面向设备的设备接口可以是用于设备与设备之间进行数据传输的有线接口、还可以是用于设备与设备之间进行数据传输的硬件***接口(例如USB接口、串口等);可选的,该面向用户的用户接口例如可以是面向用户的控制按键、用于接收语音输入的语音输入设备以及用户接收用户触摸输入的触摸感知设备(例如具有触摸感应功能的触摸屏、触控板等);可选的,上述软件的可编程接口例如可以是供用户编辑或者修改程序的入口,例如芯片的输入引脚接口或者输入接口等;可选的,上述收发信机可以是具有通信功能的射频收发芯片、基带处理芯片以及收发天线等。麦克风等音频输入设备可以接收语音数据。输出设备92可以包括显示器、音响等输出设备。
在本实施例中,该终端设备的处理器包括用于执行各设备中数据处理装置各模块的功能,具体功能和技术效果参照上述实施例即可,此处不再赘述。
图10为本申请另一实施例提供的终端设备的硬件结构示意图。图10是对图9在实现过程中的一个具体的实施例。如图10所示,本实施例的终端设备包括处理器101以及存储器102。
处理器101执行存储器102所存放的计算机程序代码,实现上述实施例中图1至图5的垃圾回收的优化方法。
存储器102被配置为存储各种类型的数据以支持在终端设备的操作。这些数据的示例包括用于在终端设备上操作的任何应用程序或方法的指令,例如消息,图片,视频等。存储器102可能包含随机存取存储器(random access memory,简称RAM),也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。
可选地,处理器101设置在处理组件100中。该终端设备还可以包括:通信组件103,电源组件104,多媒体组件105,音频组件106,输入/输出接口107和/或传感器组件108。终端设备具体所包含的组件等依据实际需求设定,本实施例对此不作限定。
处理组件100通常控制终端设备的整体操作。处理组件100可以包括一个或多个处理器101来执行指令,以完成上述图1至图7方法的全部或部分步骤。此外,处理组件100可以包括一个或多个模块,便于处理组件100和其他组件之间的交互。例如,处理组件100可以包括多媒体模块,以方便多媒体组件105和处理组件100之间的交互。
电源组件104为终端设备的各种组件提供电力。电源组件104可以包括电源管理***,一个或多个电源,及其他与为终端设备生成、管理和分配电力相关联的组件。
多媒体组件105包括在终端设备和用户之间的提供一个输出接口的显示屏。在一些实施例中,显示屏可以包括液晶显示器(LCD)和触摸面板(TP)。如果显示屏包括触摸面板,显示屏可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。所述触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与所述触摸或滑动操作相关的持续时间和压力。
音频组件106被配置为输出和/或输入音频信号。例如,音频组件106包括一个麦克风(MIC),当终端设备处于操作模式,如语音识别模式时,麦克风被配置为接收外部音频信号。所接收的音频信号可以被进一步存储在存储器102或经由通信组件103发送。在一些实施例中,音频组件106还包括一个扬声器,用于输出音频信号。
输入/输出接口107为处理组件100和***接口模块之间提供接口,上述***接口模块可以是点击轮,按钮等。这些按钮可包括但不限于:音量按钮、启动按钮和锁定按钮。
传感器组件108包括一个或多个传感器,用于为终端设备提供各个方面的状态评估。例如,传感器组件108可以检测到终端设备的打开/关闭状态,组件的相对定位,用户与终端设备接触的存在或不存在。传感器组件108可以包括接近传感器,被配置用来在没有任何的物理接触时检测附近物体的存在,包括检测用户与终端设备间的距离。在一些实施例中,该传感器组件108还可以包括摄像头等。
通信组件103被配置为便于终端设备和其他设备之间有线或无线方式的通信。终端设备可以接入基于通信标准的无线网络,如WiFi,2G或3G,或它们的组合。在一个实施例中,该终端设备中可以包括SIM卡插槽,该SIM卡插槽用于***SIM卡,使得终端设备可以登录GPRS网络,通过互联网与服务端建立通信。
由上可知,在图10实施例中所涉及的通信组件103、音频组件106以及输入/输出接口107、传感器组件108均可以作为图9实施例中的输入设备的实现方式。
本申请实施例提供了一种终端设备,包括:一个或多个处理器;和其上存储有指令的一个或多个机器可读介质,当由所述一个或多个处理器执行时,使得所述终端设备执行如本申请实施例中一个或多个所述的方法。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本申请所提供的一种垃圾回收的优化方法、装置、终端设备及机器可读介质,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。