CN116149845A - 内存垃圾的回收方法、装置、电子设备和存储介质 - Google Patents
内存垃圾的回收方法、装置、电子设备和存储介质 Download PDFInfo
- Publication number
- CN116149845A CN116149845A CN202211536032.4A CN202211536032A CN116149845A CN 116149845 A CN116149845 A CN 116149845A CN 202211536032 A CN202211536032 A CN 202211536032A CN 116149845 A CN116149845 A CN 116149845A
- Authority
- CN
- China
- Prior art keywords
- current frame
- garbage
- mutual exclusion
- interpreter
- exclusion lock
- 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.)
- Pending
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/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/5022—Mechanisms to release resources
-
- 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/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
Abstract
本发明提供了一种内存垃圾的回收方法、装置、电子设备和存储介质;其中,该方法包括:响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除,互斥锁用于独占线程;响应于当前帧的解释器执行完成,释放互斥锁,并确定解释器在当前帧的执行过程中是否触发垃圾回收;若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集。该方法能够减少内存垃圾回收导致的应用程序运行卡顿现象。
Description
技术领域
本发明涉及内存垃圾回收技术领域,尤其是涉及一种内存垃圾的回收方法、装置、电子设备和存储介质。
背景技术
混合开发是常见的开发模式,混合开发是指同一应用程序中包含至少两种类型的开发语言,常见的是包含解释型的开发语言(如PHP/Python)和编译型的开发语言(如C/C++)。
在按帧运行的混合开发应用程序中,由于解释型语言自身的局限性,解释性语言开发的部分无法并行执行,使得现有的垃圾回收技术通常在主线程中进行内存垃圾回收,导致应用程序的运行出现卡顿现象。
发明内容
有鉴于此,本发明的目的在于提供一种内存垃圾的回收方法、装置、电子设备和存储介质,以减少内存垃圾回收导致的应用程序运行卡顿现象。
第一方面,本发明实施例提供了一种内存垃圾的回收方法,方法包括:响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取所述互斥锁的主线程对上一帧收集的内存垃圾进行清除,所述互斥锁用于独占线程;响应于所述当前帧的解释器执行完成,释放所述互斥锁,并确定所述解释器在当前帧的执行过程中是否触发垃圾回收;若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集。
第二方面,本发明实施例提供了一种内存垃圾的回收装置,装置包括:清除模块,用于响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取所述互斥锁的主线程对上一帧收集的内存垃圾进行清除,所述互斥锁用于独占线程;释放模块,用于响应于所述当前帧的解释器执行完成,释放所述互斥锁,并确定所述解释器在当前帧的执行过程中是否触发垃圾回收;收集模块,用于若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集。
第三方面,本发明实施例提供了一种电子设备,包括处理器和存储器,存储器存储有能够被处理器执行的机器可执行指令,处理器执行机器可执行指令以实现上述内存垃圾的回收方法。
第四方面,本发明实施例提供了一种机器可读存储介质,计算机可读存储介质存储有机器可执行指令,机器可执行指令在被处理器调用和执行时,机器可执行指令促使处理器实现上述内存垃圾的回收方法。
本发明实施例带来了以下有益效果:
上述内存垃圾的回收方法、装置、电子设备和存储介质,响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取所述互斥锁的主线程对上一帧收集的内存垃圾进行清除,所述互斥锁用于独占线程;响应于所述当前帧的解释器执行完成,释放所述互斥锁,并确定所述解释器在当前帧的执行过程中是否触发垃圾回收;若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集。该方式中,为了避免在主线程中进行垃圾回收造成对应用程序运行速度的影响,将垃圾回收拆分为垃圾清除和垃圾收集,并且将快速的垃圾清除操作在主线程中执行,将需要较长时间执行的垃圾收集在异步线程中执行,使得解释器需要独占线程的情况下,在主线程释放互斥锁之后,也就是解释器执行完成之后,异步线程无需抢占主线程的互斥锁,即可锁定异步线程进行内存垃圾收集,从而避免互斥锁的抢占对应用程序运行速度产生负向影响,进而提高应用程序的运行效率,减少卡顿现象的发生。
本发明的其他特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。
为使本发明的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例中内存垃圾的回收方法的一个实施例流程图;
图2为本发明实施例中内存垃圾的回收方法的另一个实施例流程图;
图3为本发明实施例提供的一种内存垃圾的回收装置的示意图;
图4为本发明实施例提供的一种电子设备的示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”或“具有”及其任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
为便于理解,下面对本发明实施例的具体流程进行描述,请参阅图1,本发明实施例中内存垃圾的回收方法的一个实施例包括:
步骤S10、响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除,互斥锁用于独占线程;
需要说明的是,本发明实施例用于对按帧运行的应用程序进行内存垃圾清除,如按帧渲染的虚拟游戏程序、动画程序等,具体此处不做限定。在一种实施方式中,本发明实施例可以应用于混合开发的应用程序中,也可以应用于解释型语言开发的应用程序中,其中,混合开发的应用程序包括至少一种解释型语言开发的程序,如Python、PHP、JavaScript等,混合开发的应用程序还可以包括至少一种编译型语言开发的程序,如C语言、C++等,具体此处不做限定。
可以理解的是,在混合开发的应用程序中,解释器用于将解释型代码翻译为机器执行的字节码,编译器用于将编译型代码编译为机器执行的字节码。由于解释型语言具有开发便捷性和可跨平台等优点,而编译型语言具有运行高效性的优点,因此,混合开发模式能够结合二者的优点,实现开发和运行的高效结合。在混合开发的应用程序中,解释器用于运行混合开发应用程序中解释型语言开发的程序,而编译器则用于运行混合开发应用程序中编译型语言开发的程序。通常情况下,在混合开发的应用程序中,解释型语言开发的程序和编译型语言开发的程序可以穿插执行或并行执行,但是,对于一些独占线程的解释型语言,解释器需要独占线程执行,以避免数据和线程的安全性问题。例如,Python是一种解释型语言,CPython是该语言的解释器,由于Python自身的局限性,使得其实现的程序存在大量的全局变量和状态机模型,以至于其解释器在执行时,需要独占线程,才能避免数据和线程的安全性问题发生。
在一种实施方式中,由于应用程序中的解释型程序通常用于配置编译型程序的相关运行属性,或导出编译型程序所需的接口,因此,应用程序中的解释型程序通常先于编译型程序执行。基于此,本步骤中,应用程序在运行当前帧时,先通过解释器执行解释型程序,再通过编译器执行编译型程序,而由于解释型程序需要独占线程,因此,当前帧的解释器执行当前帧的解释型程序时,通过主线程获取互斥锁(Mutual exclusion,Mutex),以使得主线程独占解释器。其中,当前帧是指当前时刻正在渲染的数据帧/动画帧,互斥锁可以是任意用于防止其它线程同时读写同一内存区域的互斥量,例如,垃圾回收(GarbageCollection,GC)锁、全局解释器锁(Global Interpreter Lock,GIL)、自旋锁、读写锁、悲观锁、乐观锁等。进一步的,互斥锁为全局解释器锁,用于独占线程中的解释器。
作为示例而非限定的是,终端应用程序(如游戏客户端)的运行逻辑是这样的,每帧先获取Python的GIL锁,然后执行游戏开发引擎自定义的python函数入口,所有的python逻辑都写在里面,执行完毕python逻辑之后,释放GIL锁。然后开始执行引擎的c++逻辑,执行完毕c++逻辑后,这一帧宣告结束,开始下一帧的逻辑。在一种实施方式中,当前帧的解释器执行实际是当前帧python逻辑的执行。
本实施方式中,为了降低垃圾回收程序对应用程序运行的阻塞,导致出现卡顿现象,在当前帧开始执行时,先通过主线程获取互斥锁,以锁住主线程中的解释器,用于执行当前帧的解释型程序。接着,在主线程中将上一帧收集的内存垃圾清除。由于内存垃圾清除的操作是最基础的删除操作,执行效率快速,因此不会对主线程造成过大程度的阻塞,并且由于主线程已获取互斥锁,待内存垃圾清除操作完成之后,可以立即执行解释器,从而提高解释型程序的执行效率。
步骤S20、响应于当前帧的解释器执行完成,释放互斥锁,并确定解释器在当前帧的执行过程中是否触发垃圾回收;
本实施方式中,内存垃圾清除操作完成之后,立即执行解释器,解释器执行完成之后,即可释放主线程的互斥锁,以解锁主线程,用于执行其它解释型程序或编译型程序,具体此处不做限定。在一种实施方式中,在解释器执行完成之后,通过预设的垃圾回收触发条件判断解释器是否触发垃圾回收,其中,垃圾回收触发条件可以是基于解释器执行解释性程序过程中产生的内存垃圾数量的判断条件,也可以是基于垃圾回收的历史触发次数和历史回收范围的判断条件,具体此处不做限定。
本实施方式中,为了避免后续异步线程抢占互斥锁失败,在当前帧的解释器执行完成之后,立即释放互斥锁,以使得其它线程可以获取互斥锁,用于独占线程中的解释器。
在一种实施方式中,如果解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集;响应于下一帧的解释器执行,通过主线程获取互斥锁,并通过获取所述互斥锁的主线程对上一帧收集的内存垃圾进行清除。触发垃圾回收是指触发在主线程进行内存垃圾清除,在异步线程进行垃圾回收的两部分程序。在一种实施方式中,当前帧的解释器执行完成实际是在当前帧的python逻辑执行完成。
步骤S30、若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集。
本实施方式中,如果解释器在当前帧的执行过程中触发垃圾回收机制,则发起异步任务,通过异步线程获取互斥锁,以锁定异步线程的解释器。接着,通过锁定之后的异步线程搜集当前帧的内存垃圾,并将收集到的内存垃圾存储至全局内存空间,留待下一帧的解释器执行时,通过主线程清除当前帧收集的内存垃圾。在一种实施方式中,在当前帧的执行过程中实际是在当前帧的python逻辑执行过程中。可以理解的是,由于内存垃圾的收集是在异步线程中执行,因此不影响主线程运行应用程序,而由于需要独占线程的解释器已经执行完成,异步线程对互斥锁的占用也不会影响主线程执行解释器,从而极大程度地降低内存垃圾回收程序对应用程序运行的影响,减少了应用程序的卡顿现象。
在一种实施方式中,在通过异步线程获取互斥锁时,先判断互斥锁是否被占用,如果互斥锁被占用,则等待互斥锁的释放指令,并对互斥锁的释放状态进行轮询,当查询到互斥锁的释放指令时,通过异步线程获取互斥锁,以锁定异步线程的解释器。
在一种实施方式中,通过获取互斥锁的异步线程收集到的当前帧的内存垃圾存储于主线程可以读写的全局内存空间中,在响应于下一帧的解释器执行时,通过获取互斥锁的主线程对全局内存空间中的内存垃圾进行清除,从而提高内存垃圾清除的效率。
在一种实施方式中,在确定解释器触发垃圾回收机制之后,还可以进一步确定当前帧的垃圾回收范围,具体的,上述通过获取互斥锁的异步线程对当前帧进行内存垃圾收集,包括:根据垃圾回收机制的历史触发次数和历史帧的垃圾回收范围,确定当前帧的垃圾回收范围,并通过获取互斥锁的异步线程对当前帧进行当前帧的垃圾回收范围的内存垃圾收集。本实施方式中,在进行当前帧的内存垃圾收集时,根据垃圾回收机制的历史触发次数和历史帧的垃圾回收范围,确定当前帧的垃圾回收范围。在一种实施方式中,垃圾回收范围用于指示增量回收范围或全量回收范围。例如,假设在当前帧进行内存垃圾收集时,历史帧已经触发了5次增量回收范围的垃圾回收机制,由于预设的增量回收次数阈值为5,也就是累计5次增量回收,则触发一次全量回收,那么,当前帧在进行内存垃圾收集时,垃圾回收范围为全量回收范围,具体此处不做限定。在另一种实施方式中,垃圾回收范围还可以用于指示多个不同大小等级的范围,例如浅层回收范围、中层回收范围、深层回收范围等,具体此处不做限定。同样的,垃圾回收机制的历史触发次数和每次触发对应的垃圾回收范围,决定当前帧的垃圾回收范围,例如,历史帧累计触发5次浅层回收范围的垃圾回收机制后,当前帧可以触发1次中层回收范围的垃圾回收机制,历史帧累计触发5次中层回收范围的垃圾回收机制后,可以触发1次深层垃圾回收范围的揽件回收机制,具体此处不做限定。可以理解的是,历史帧是指当前帧之前的数据帧,如上1帧、上2帧、上n帧等,具体此处不做限定。
在一种实施方式中,若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集,包括:若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集,以及通过主线程执行当前帧的编译器。其中,执行当前帧的编译器是指执行当前帧的C++逻辑。本实施方式中,当主线程释放互斥锁之后,可以立即通过主线程执行当前帧的编译器,也可以在确定解释器在当前帧的执行过程中是否触发垃圾回收之后,同时确定是否发起异步任务和通过主线程执行当前帧的编译器,还可以在确定解释器触发垃圾回收机制之后,同时发起异步任务和通过主线程执行当前帧的编译器。需要说明的是,只要主线程未被互斥锁锁定,则可以立即通过主线程执行当前帧的编译器,以使得应用程序的编译语言程序能够快速执行,从而降低垃圾回收程序对应用程序运行的影响,减少卡顿现象的发生。
上述实施方式提供的内存垃圾的回收方法,为了避免在主线程中进行垃圾回收造成对应用程序运行速度的影响,将垃圾回收拆分为垃圾清除和垃圾收集,并且将快速的垃圾清除操作在主线程中执行,将需要较长时间执行的垃圾收集在异步线程中执行,使得解释器需要独占线程的情况下,在主线程释放互斥锁之后,也就是解释器执行完成之后,异步线程无需抢占主线程的互斥锁,即可获取空闲状态的互斥锁,并锁定异步线程进行内存垃圾收集,从而避免互斥锁的抢占对应用程序运行速度产生负向影响,进而提高应用程序的运行效率,减少卡顿现象的发生。
请参阅图2,本发明实施例中内存垃圾的回收方法的另一个实施例包括:
步骤S201、响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除,互斥锁用于独占线程;
在一种实施方式中,通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除,包括:通过获取互斥锁的主线程判断预设全局垃圾列表中是否包含至少一个不可达对象,预设全局垃圾列表包含上一帧收集的内存垃圾;若预设全局垃圾列表中包含至少一个不可达对象,则通过所述主线程删除预设全局垃圾列表中的所有对象数据。本实施方式中,主线程在清除上一帧收集的内存垃圾时,由于上一帧收集的内存垃圾存储于全局垃圾列表中,因此,主线程实际是清除全局垃圾列表中的对象数据。本实施方式中,首先通过被互斥锁锁定的主线程判断预设全局垃圾列表中是否包含至少一个不可达对象,如果预设全局垃圾列表中包含至少一个不可达对象,则说明上一帧收集到至少一个对象垃圾,那么,则将预设全局垃圾列表中的所有对象数据删除,即可清除上一帧收集的内存垃圾。需要说明的是,预设全局垃圾列表中的所有对象数据是应用程序运行过程中创建的变量,需要占用内存,属于内存垃圾清除的目标。在一种实施方式中,预设全局垃圾列表中的所有对象数据均为不可达(Unreachable)对象,即不再被任何强引用所持有的对象。
在一种实施方式中,删除预设全局垃圾列表中的所有对象数据,包括:对预设全局垃圾列表中的所有对象数据进行析构操作,并在析构操作过程中,通过对象死亡回调函数对各对象数据进行弱引用注册;将弱引用注册成功的对象数据移出预设全局垃圾列表,得到移出后的预设全局垃圾列表,并删除移出后的预设全局垃圾列表中的所有对象数据。需要说明的是,析构操作是一个对象的成员函数,在该对象离开作用域或通过delete操作明确的销毁时,被自动调用。预设全局垃圾列表中的所有对象数据包括所有不可达对象,本实施方式中,为了避免误删预设全局垃圾列表中被弱引用持有的对象,在删除预设全局垃圾列表中的所有对象数据时,对预设全局垃圾列表中的所有对象数据进行析构操作,并在析构操作过程中,通过对象死亡回调函数对各对象数据进行弱引用注册,如果一个对象的弱引用注册成功,则说明该对象是被弱引用持有的对象,则将其移出预设全局垃圾列表,放回正常对象列表中。将所有被弱引用持有的对象移出预设全局垃圾列表之后,再将预设全局垃圾列表中的所有对象数据删除,从而避免误删预设全局垃圾列表中被弱引用持有的对象。可以理解的是,对象死亡回调函数在对象死亡之前调用,此时在对象死亡回调函数中为对象数据进行弱引用注册,该对象即可在弱引用注册成功之后复活,因此,本实施方式能够提高弱引用注册对象收集的正确率。
在一种实施方式中,响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除,包括:响应于当前帧的解释器执行,获取预设的异步垃圾回收开关标识;若异步垃圾回收开关标识指示开启异步垃圾回收程序,则通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除。本实施方式中,解释器还封装有异步垃圾回收的开关接口,在执行当前帧的解释器时,首先通过该开关接口获取异步垃圾回收开关标识,该异步垃圾回收开关标识用于指示是否开启异步垃圾回收程序,如果异步垃圾回收开关标识指示开启异步垃圾回收程序,则执行本发明实施例提供的内存垃圾的回收方法,如果异步垃圾回收开关标识指示关闭异步垃圾回收程序,则仍然按照原始的同步阻塞主线程的方式进行垃圾回收,从而保证万一出现外放事故时,能够快速切换垃圾回收方式,提高应用程序运行的安全性。
步骤S202、响应于当前帧的解释器执行完成,释放互斥锁,并确定解释器在当前帧的执行过程中是否触发垃圾回收;
在一种实施方式中,确定解释器在当前帧的执行过程中是否触发垃圾回收,包括:根据解释器执行过程中创建的对象数量是否大于预设对象数量阈值,确定解释器在当前帧的执行过程中是否触发垃圾回收。本实施方式中,是否触发垃圾回收机制由解释器执行过程中创建的对象数量决定,例如,解释器执行过程中创建有700个新对象,而预设对象数量阈值为600,那么,则触发垃圾回收机制,进行后续的垃圾收集,如果执行器执行过程中创建的新对象小于600个,则确定解释器未触发垃圾回收机制,不进行后续的垃圾收集,具体此处不做限定。
步骤S203、若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程进行待判别对象遍历,得到待判别对象列表;
本步骤中,如果解释器触发垃圾回收机制,则发起异步任务,并通过获取互斥锁的异步线程对垃圾回收范围内的所有对象进行遍历,得到待判别对象列表。例如,假设当前帧触发的是增量回收范围的垃圾回收机制,那么,异步线程则对上一帧触发器创建的新对象进行遍历,即可得到待判别对象列表,其中,待判别对象列表中包含上一帧触发器创建的所有新对象,而假设当前帧触发的是全量回收范围的垃圾回收机制,那么,异步线程则对内存中的所有对象进行遍历,并将内存中的所有对象存入待判别对象列表中,从而获取不同回收范围的待判别对象,具体此处不做限定。
步骤S204、确定待判别对象列表中的所有不可达对象,并将待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾。
可以理解的是,一个对象(包括待判别对象)的生命周期可以由从强到弱不同程度的引用反映,在一种实施方式中,对象的引用可以分为强引用和弱引用,如果一个对象只被弱引用,而没有被强引用,那么,该对象则可以确定为不可达对象,否则为可达对象。因此,在一种实施方式中,确定待判别对象列表中的所有不可达对象时,通过判断待判别对象列表中的每个待判别对象是否被强引用,如果待判别对象未被强引用,则确定该待判别对象为不可达对象;如果待判别对象被强引用,则确定该待判别对象为可达对象,从而确定待判别对象列表中的所有不可达对象,即未被强引用的对象。作为示例而非限定的是,在python逻辑中,可以通过调用weakref模块的ref(obj)创建一个弱引用,obj是被弱引用的对象,例如:x=weakref.ref(a),即是一个对a对象的弱引用;而通过变量赋值即可创建一个强引用,例如,y=a,即是一个对a对象的强引用,具体此处不做限定。
进一步的,在确定待判别对象列表中的所有不可达对象时,还可以通过预设的引用计数算法、可达性算法或根搜索算法等方式确定待判别对象列表中的所有不可达对象,具体此处不做限定。
本步骤中,由于待判别对象是否为需要被删除的对象仍未确定,因此,本步骤首先确定待判别对象列表中的所有不可达对象,再将不可达对象放入预设全局垃圾列表中,预设全局垃圾列表即为当前帧收集的内存垃圾。需要说明的是,不可达对象的确定方式可以是任意强引用的筛选方式,具体此处不做限定。
在一种实施方式中,通过引用计数算法确定待判别对象列表中的所有不可达对象,具体的,确定待判别对象列表中的所有不可达对象,包括:对待判别对象列表中的所有待判别对象进行引用计数更新,得到每个待判别对象对应的引用计数信息;根据所有待判别对象分别对应的引用计数信息,确定待判别对象列表中的所有不可达对象。其中,引用计数信息用于指示待判别对象的强引用次数。本实施方式中,由于对待判别对象的弱引用不会计入引用计数信息,对待判别对象列表中的所有待判别对象进行引用计数更新实际是统计每个待判别对象的强引用次数,在引用计数更新过程中,如果识别到一个待判别对象被强引用一次,则该待判别对象对应的引用计数信息则加1,如果识别到一个待判别对象被弱引用一次,则该待判别对象对应的引用计数信息不变,以此类推。最终判断每个待判别对象对应的引用计数信息是否大于0,即可确定所述待判别对象列表中的所有不可达对象,如果待判别对象对应的引用计数信息大于0,则确定该待判别对象为可达对象,如果待判别对象对应的引用计数信息小于或等于0,则确定该待判别对象为不可达对象。
上述实施方式提供的内存垃圾的回收方法,为了避免在主线程中进行垃圾回收造成对应用程序运行速度的影响,将垃圾回收拆分为垃圾清除和垃圾收集,并且将快速的垃圾清除操作在主线程中执行,将需要较长时间执行的垃圾收集在异步线程中执行,使得解释器需要独占线程的情况下,在主线程释放互斥锁之后,也就是解释器执行完成之后,异步线程无需抢占主线程的互斥锁,即可获取空闲状态的互斥锁,并锁定异步线程进行内
存垃圾收集,从而避免互斥锁的抢占对应用程序运行速度产生负向影响,5进而提高应用程序的运行效率,减少卡顿现象的发生。
对应于上述方法实施例,参见图3所示的一种内存垃圾的回收装置的示意图,该装置包括:清除模块30,用于响应于当前帧的解释器执行,通
过主线程获取互斥锁,并通过获取所述互斥锁的主线程对上一帧收集的内0存垃圾进行清除,所述互斥锁用于独占线程;释放模块32,用于响应于所述当前帧的解释器执行完成,释放所述互斥锁,并确定所述解释器在当前帧的执行过程中是否触发垃圾回收;收集模块34,用于若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集。
5上述内存垃圾的回收装置,为了避免在主线程中进行垃圾回收造成对应用程序运行速度的影响,将垃圾回收拆分为垃圾清除和垃圾收集,并且将快速的垃圾清除操作在主线程中执行,将需要较长时间执行的垃圾收集在异步线程中执行,使得解释器需要独占线程的情况下,在主线程释放互
斥锁之后,也就是解释器执行完成之后,异步线程无需抢占主线程的互斥0锁,即可获取空闲状态的互斥锁,并锁定异步线程进行内存垃圾收集,从而避免互斥锁的抢占对应用程序运行速度产生负向影响,进而提高应用程序的运行效率,减少卡顿现象的发生。
可选的,上述收集模块,包括:遍历单元,用于若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并通过5获取互斥锁的异步线程进行待判别对象遍历,得到待判别对象列表;确定单元,用于确定所述待判别对象列表中的所有不可达对象,并将所述待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾。
可选的,上述确定单元,还用于:对所述待判别对象列表中的所有待判别对象进行引用计数更新,得到每个待判别对象对应的引用计数信息;根据所有待判别对象分别对应的引用计数信息,确定所述待判别对象列表中的所有不可达对象;将所述待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾。
可选的,上述清除模块,包括:判断单元,用于响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取所述互斥锁的主线程判断预设全局垃圾列表中是否包含至少一个不可达对象,所述预设全局垃圾列表包含上一帧收集的内存垃圾;删除单元,用于若预设全局垃圾列表中包含至少一个不可达对象,则通过所述主线程删除所述预设全局垃圾列表中的所有对象数据。
可选的,上述删除单元,还用于:若预设全局垃圾列表中包含至少一个不可达对象,则对所述预设全局垃圾列表中的所有对象数据进行析构操作,并在析构操作过程中,通过对象死亡回调函数对各对象数据进行弱引用注册;将弱引用注册成功的对象数据移出所述预设全局垃圾列表,得到移出后的预设全局垃圾列表,并删除所述移出后的预设全局垃圾列表中的所有对象数据。
可选的,上述释放模块,还用于:响应于所述当前帧的解释器执行完成,释放所述互斥锁,并根据所述解释器执行过程中创建的对象数量是否大于预设对象数量阈值,确定所述解释器在当前帧的执行过程中是否触发垃圾回收。
可选的,上述收集模块,还用于:若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并根据所述垃圾回收机制的历史触发次数和历史帧的垃圾回收范围,确定当前帧的垃圾回收范围;通过获取互斥锁的异步线程对当前帧进行所述当前帧的垃圾回收范围的内存垃圾收集。
可选的,上述装置包括:编译模块,用于通过所述主线程执行当前帧的编译器,以运行编译型程序。
可选的,上述清除模块,还用于:响应于当前帧的解释器执行,获取预设的异步垃圾回收开关标识;若所述异步垃圾回收开关标识指示开启异步垃圾回收程序,则通过主线程获取互斥锁,并通过获取所述互斥锁的主线程对上一帧收集的内存垃圾进行清除。
本实施例还提供一种电子设备,包括处理器和存储器,存储器存储有能够被处理器执行的机器可执行指令,处理器执行机器可执行指令以实现上述内存垃圾的回收方法。该电子设备可以是服务器,也可以是终端设备。
参见图4所示,该电子设备包括处理器100和存储器101,该存储器101存储有能够被处理器100执行的机器可执行指令,该处理器100执行机器可执行指令以实现上述内存垃圾的回收方法。
进一步地,图4所示的电子设备还包括总线102和通信接口103,处理器100、通信接口103和存储器101通过总线102连接。
其中,存储器101可能包含高速随机存取存储器(RAM,Random Access Memory),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。通过至少一个通信接口103(可以是有线或者无线)实现该系统网元与至少一个其他网元之间的通信连接,可以使用互联网,广域网,本地网,城域网等。总线102可以是ISA总线、PCI总线或EISA总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图4中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
处理器100可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器100中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器100可以是通用处理器,包括中央处理器(Central Processing Unit,简称CPU)、网络处理器(Network Processor,简称NP)等;还可以是数字信号处理器(DigitalSignal Processor,简称DSP)、专用集成电路(Application Specific IntegratedCircuit,简称ASIC)、现场可编程门阵列(Field-Programmable Gate Array,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器101,处理器100读取存储器101中的信息,结合其硬件完成前述实施例的方法的步骤,例如:
响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除,互斥锁用于独占线程;响应于当前帧的解释器执行完成,释放互斥锁,并确定解释器在当前帧的执行过程中是否触发垃圾回收;若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集。
该方式中,为了避免在主线程中进行垃圾回收造成对应用程序运行速度的影响,将垃圾回收拆分为垃圾清除和垃圾收集,并且将快速的垃圾清除操作在主线程中执行,将需要较长时间执行的垃圾收集在异步线程中执行,使得解释器需要独占线程的情况下,在主线程释放互斥锁之后,也就是解释器执行完成之后,异步线程无需抢占主线程的互斥锁,即可锁定异步线程进行内存垃圾收集,从而避免互斥锁的抢占对应用程序运行速度产生负向影响,进而提高应用程序的运行效率,减少卡顿现象的发生。
上述若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集,包括:若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程进行待判别对象遍历,得到待判别对象列表;确定待判别对象列表中的所有不可达对象,并将待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾。
上述确定待判别对象列表中的所有不可达对象,并将待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾,包括:对待判别对象列表中的所有待判别对象进行引用计数更新,得到每个待判别对象对应的引用计数信息;根据所有待判别对象分别对应的引用计数信息,确定待判别对象列表中的所有不可达对象;将待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾。
上述响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除,包括:响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程判断预设全局垃圾列表中是否包含至少一个不可达对象,预设全局垃圾列表包含上一帧收集的内存垃圾;若预设全局垃圾列表中包含至少一个不可达对象,则通过所述主线程删除预设全局垃圾列表中的所有对象数据。
上述若预设全局垃圾列表中包含至少一个不可达对象,则通过所述主线程删除预设全局垃圾列表中的所有对象数据,包括:若预设全局垃圾列表中包含至少一个不可达对象,则对预设全局垃圾列表中的所有对象数据进行析构操作,并在析构操作过程中,通过对象死亡回调函数对各对象数据进行弱引用注册;将弱引用注册成功的对象数据移出预设全局垃圾列表,得到移出后的预设全局垃圾列表,并删除移出后的预设全局垃圾列表中的所有对象数据。
上述响应于当前帧的解释器执行完成,释放互斥锁,并确定解释器在当前帧的执行过程中是否触发垃圾回收,包括:响应于当前帧的解释器执行完成,释放互斥锁,并根据解释器执行过程中创建的对象数量是否大于预设对象数量阈值,确定解释器在当前帧的执行过程中是否触发垃圾回收。
上述若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集,包括:若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并根据垃圾回收机制的历史触发次数和历史帧的垃圾回收范围,确定当前帧的垃圾回收范围;通过获取互斥锁的异步线程对当前帧进行当前帧的垃圾回收范围的内存垃圾收集。
在上述响应于当前帧的解释器执行完成,释放互斥锁,并确定解释器在当前帧的执行过程中是否触发垃圾回收之后,还包括:通过主线程执行当前帧的编译器,以运行编译型程序。
上述响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除,包括:响应于当前帧的解释器执行,获取预设的异步垃圾回收开关标识;若异步垃圾回收开关标识指示开启异步垃圾回收程序,则通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除。
本实施例还提供一种机器可读存储介质,计算机可读存储介质存储有机器可执行指令,机器可执行指令在被处理器调用和执行时,机器可执行指令促使处理器实现上述内存垃圾的回收方法,例如:
响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除,互斥锁用于独占线程;响应于当前帧的解释器执行完成,释放互斥锁,并确定解释器在当前帧的执行过程中是否触发垃圾回收;若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集。
该方式中,为了避免在主线程中进行垃圾回收造成对应用程序运行速度的影响,将垃圾回收拆分为垃圾清除和垃圾收集,并且将快速的垃圾清除操作在主线程中执行,将需要较长时间执行的垃圾收集在异步线程中执行,使得解释器需要独占线程的情况下,在主线程释放互斥锁之后,也就是解释器执行完成之后,异步线程无需抢占主线程的互斥锁,即可锁定异步线程进行内存垃圾收集,从而避免互斥锁的抢占对应用程序运行速度产生负向影响,进而提高应用程序的运行效率,减少卡顿现象的发生。
上述若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集,包括:若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程进行待判别对象遍历,得到待判别对象列表;确定待判别对象列表中的所有不可达对象,并将待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾。
上述确定待判别对象列表中的所有不可达对象,并将待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾,包括:对待判别对象列表中的所有待判别对象进行引用计数更新,得到每个待判别对象对应的引用计数信息;根据所有待判别对象分别对应的引用计数信息,确定待判别对象列表中的所有不可达对象;将待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾。
上述响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除,包括:响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程判断预设全局垃圾列表中是否包含至少一个不可达对象,预设全局垃圾列表包含上一帧收集的内存垃圾;若预设全局垃圾列表中包含至少一个不可达对象,则通过所述主线程删除预设全局垃圾列表中的所有对象数据。
上述若预设全局垃圾列表中包含至少一个不可达对象,则通过所述主线程删除预设全局垃圾列表中的所有对象数据,包括:若预设全局垃圾列表中包含至少一个不可达对象,则对预设全局垃圾列表中的所有对象数据进行析构操作,并在析构操作过程中,通过对象死亡回调函数对各对象数据进行弱引用注册;将弱引用注册成功的对象数据移出预设全局垃圾列表,得到移出后的预设全局垃圾列表,并删除移出后的预设全局垃圾列表中的所有对象数据。
上述响应于当前帧的解释器执行完成,释放互斥锁,并确定解释器在当前帧的执行过程中是否触发垃圾回收,包括:响应于当前帧的解释器执行完成,释放互斥锁,并根据解释器执行过程中创建的对象数量是否大于预设对象数量阈值,确定解释器在当前帧的执行过程中是否触发垃圾回收。
上述若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集,包括:若解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取互斥锁,并根据垃圾回收机制的历史触发次数和历史帧的垃圾回收范围,确定当前帧的垃圾回收范围;通过获取互斥锁的异步线程对当前帧进行当前帧的垃圾回收范围的内存垃圾收集。
在上述响应于当前帧的解释器执行完成,释放互斥锁,并确定解释器在当前帧的执行过程中是否触发垃圾回收之后,还包括:通过主线程执行当前帧的编译器,以运行编译型程序。
上述响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除,包括:响应于当前帧的解释器执行,获取预设的异步垃圾回收开关标识;若异步垃圾回收开关标识指示开启异步垃圾回收程序,则通过主线程获取互斥锁,并通过获取互斥锁的主线程对上一帧收集的内存垃圾进行清除。
本发明实施例所提供的内存垃圾的回收方法、装置、电子设备及存储介质的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行前面方法实施例中所述的方法,具体实现可参见方法实施例,在此不再赘述。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
另外,在本发明实施例的描述中,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
在本发明的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
最后应说明的是:以上实施例,仅为本发明的具体实施方式,用以说明本发明的技术方案,而非对其限制,本发明的保护范围并不局限于此,尽管参照前述实施例对本发明进行了详细的说明,本领域技术人员应当理解:任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
Claims (12)
1.一种内存垃圾的回收方法,其特征在于,所述方法包括:
响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取所述互斥锁的主线程对上一帧收集的内存垃圾进行清除,所述互斥锁用于独占线程;
响应于所述当前帧的解释器执行完成,释放所述互斥锁,并确定所述解释器在当前帧的执行过程中是否触发垃圾回收;
若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集。
2.根据权利要求1所述的方法,其特征在于,所述若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集,包括:
若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并通过获取互斥锁的异步线程进行待判别对象遍历,得到待判别对象列表;
确定所述待判别对象列表中的所有不可达对象,并将所述待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾。
3.根据权利要求2所述的方法,其特征在于,所述确定所述待判别对象列表中的所有不可达对象,并将所述待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾,包括:
对所述待判别对象列表中的所有待判别对象进行引用计数更新,得到每个待判别对象对应的引用计数信息;
根据所有待判别对象分别对应的引用计数信息,确定所述待判别对象列表中的所有不可达对象;
将所述待判别对象列表中的所有不可达对象加入预设全局垃圾列表中,得到当前帧收集的内存垃圾。
4.根据权利要求2所述的方法,其特征在于,所述响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取所述互斥锁的主线程对上一帧收集的内存垃圾进行清除,包括:
响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取所述互斥锁的主线程判断预设全局垃圾列表中是否包含至少一个不可达对象,所述预设全局垃圾列表包含上一帧收集的内存垃圾;
若预设全局垃圾列表中包含至少一个不可达对象,则通过所述主线程删除所述预设全局垃圾列表中的所有对象数据。
5.根据权利要求4所述的方法,其特征在于,所述若预设全局垃圾列表中包含至少一个不可达对象,则通过所述主线程删除所述预设全局垃圾列表中的所有对象数据,包括:
若预设全局垃圾列表中包含至少一个不可达对象,则对所述预设全局垃圾列表中的所有对象数据进行析构操作,并在析构操作过程中,通过对象死亡回调函数对各对象数据进行弱引用注册;
将弱引用注册成功的对象数据移出所述预设全局垃圾列表,得到移出后的预设全局垃圾列表,并删除所述移出后的预设全局垃圾列表中的所有对象数据。
6.根据权利要求1所述的方法,其特征在于,所述响应于所述当前帧的解释器执行完成,释放所述互斥锁,并确定所述解释器在当前帧的执行过程中是否触发垃圾回收,包括:
响应于所述当前帧的解释器执行完成,释放所述互斥锁,并根据所述解释器执行过程中创建的对象数量是否大于预设对象数量阈值,确定所述解释器在当前帧的执行过程中是否触发垃圾回收。
7.根据权利要求1所述的方法,其特征在于,所述若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集,包括:
若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并根据所述垃圾回收机制的历史触发次数和历史帧的垃圾回收范围,确定当前帧的垃圾回收范围;
通过获取互斥锁的异步线程对当前帧进行所述当前帧的垃圾回收范围的内存垃圾收集。
8.根据权利要求1所述的方法,其特征在于,在所述响应于所述当前帧的解释器执行完成,释放所述互斥锁,并确定所述解释器在当前帧的执行过程中是否触发垃圾回收之后,还包括:
通过所述主线程执行当前帧的编译器,以运行编译型程序。
9.根据权利要求1所述的方法,其特征在于,所述响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取所述互斥锁的主线程对上一帧收集的内存垃圾进行清除,包括:
响应于当前帧的解释器执行,获取预设的异步垃圾回收开关标识;
若所述异步垃圾回收开关标识指示开启异步垃圾回收程序,则通过主线程获取互斥锁,并通过获取所述互斥锁的主线程对上一帧收集的内存垃圾进行清除。
10.一种内存垃圾的回收装置,其特征在于,所述装置包括:
清除模块,用于响应于当前帧的解释器执行,通过主线程获取互斥锁,并通过获取所述互斥锁的主线程对上一帧收集的内存垃圾进行清除,所述互斥锁用于独占线程;
释放模块,用于响应于所述当前帧的解释器执行完成,释放所述互斥锁,并确定所述解释器在当前帧的执行过程中是否触发垃圾回收;
收集模块,用于若所述解释器在当前帧的执行过程中触发垃圾回收,则通过异步线程获取所述互斥锁,并通过获取互斥锁的异步线程对当前帧进行内存垃圾收集。
11.一种电子设备,其特征在于,包括处理器和存储器,所述存储器存储有能够被所述处理器执行的机器可执行指令,所述处理器执行所述机器可执行指令以实现权利要求1-9任一项所述的内存垃圾的回收方法。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有机器可执行指令,所述机器可执行指令在被处理器调用和执行时,所述机器可执行指令促使所述处理器实现权利要求1-9任一项所述的内存垃圾的回收方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211536032.4A CN116149845A (zh) | 2022-12-01 | 2022-12-01 | 内存垃圾的回收方法、装置、电子设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211536032.4A CN116149845A (zh) | 2022-12-01 | 2022-12-01 | 内存垃圾的回收方法、装置、电子设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116149845A true CN116149845A (zh) | 2023-05-23 |
Family
ID=86339772
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211536032.4A Pending CN116149845A (zh) | 2022-12-01 | 2022-12-01 | 内存垃圾的回收方法、装置、电子设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116149845A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116860658A (zh) * | 2023-06-21 | 2023-10-10 | 中国科学院软件研究所 | 一种面向大数据处理框架的高效半自动垃圾回收方法和系统 |
-
2022
- 2022-12-01 CN CN202211536032.4A patent/CN116149845A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116860658A (zh) * | 2023-06-21 | 2023-10-10 | 中国科学院软件研究所 | 一种面向大数据处理框架的高效半自动垃圾回收方法和系统 |
CN116860658B (zh) * | 2023-06-21 | 2024-05-28 | 中国科学院软件研究所 | 一种面向大数据处理框架的高效半自动垃圾回收方法和系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109086193B (zh) | 监控方法、装置及系统 | |
WO2018072408A1 (zh) | 一种内存分析方法、装置、系统以及计算设备 | |
KR20010043785A (ko) | 메모리 복구 방법 | |
CN116149845A (zh) | 内存垃圾的回收方法、装置、电子设备和存储介质 | |
CN109634822B (zh) | 一种函数耗时统计方法、装置、存储介质及终端设备 | |
CN114428733A (zh) | 基于静态程序分析与模糊测试的内核数据竞争检测方法 | |
CN111090593A (zh) | 确定崩溃归属的方法、装置、电子设备及存储介质 | |
CN110928778B (zh) | 死循环定位方法、装置、计算机设备和存储介质 | |
US20090006507A1 (en) | System and method for ordering reclamation of unreachable objects | |
CN111552616A (zh) | 一种内存监听方法及装置 | |
US6725363B1 (en) | Method for filtering instructions to get more precise event counts | |
CN109299132B (zh) | Sql数据处理方法、系统以及电子设备 | |
JP5024252B2 (ja) | トレース情報取得装置、トレース情報取得プログラム、および、トレース情報取得方法 | |
JP2009217617A (ja) | メモリリーク箇所の特定方法及び装置 | |
CN108536537B (zh) | 一种进程资源回收方法及装置 | |
CN106909503B (zh) | 一种Android应用自动化测试用例精简方法 | |
CN111240956A (zh) | 内存泄漏监测方法、装置、电子设备及计算机存储介质 | |
CN111459638B (zh) | 主线程等待时间确定方法及装置 | |
CN116842556A (zh) | 安卓应用指纹劫持风险检测方法、装置及电子设备 | |
CN116257355A (zh) | 内存引用关系的获取方法、装置和电子设备 | |
CN118245142A (zh) | 函数的调用方法、装置、电子设备和存储介质 | |
Travkin et al. | Towards the combination of clustering-based and pattern-based reverse engineering approaches | |
Soundararajan | A Novel Design of a Parallel Machine Learnt Generational Garbage Collector | |
JPH10111830A (ja) | 動的記憶領域管理装置 | |
CN112286803A (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 |