CN113360274A - 垃圾回收方法、装置及计算设备 - Google Patents
垃圾回收方法、装置及计算设备 Download PDFInfo
- Publication number
- CN113360274A CN113360274A CN202010145009.7A CN202010145009A CN113360274A CN 113360274 A CN113360274 A CN 113360274A CN 202010145009 A CN202010145009 A CN 202010145009A CN 113360274 A CN113360274 A CN 113360274A
- Authority
- CN
- China
- Prior art keywords
- area
- application
- application thread
- program
- region
- 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/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/485—Task life-cycle, e.g. stopping, restarting, resuming execution
-
- 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
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
技术领域
本申请实施例涉及计算机应用技术领域,尤其涉及一种垃圾回收方法、装置及计算设备。
背景技术
基于托管语言(managed language)编码获得的程序进行编译时,为了适应不同操作系统平台,通常不会直接编译为机器码,而是编译为一种中间代码,需要依靠一个中间平台来执行中间代码从而实现业务逻辑。比如,Java程序,即是通过Java虚拟机来执行Java程序的中间代码来实现业务逻辑。
由于中间平台执行程序时会创建对象并在内存区域中为之分配内存,而又由于内存区域被所有应用线程共享,空间有限,为了合理使用内存区域,中间平台会提供垃圾回收机制以回收内存区域中的对象,释放内存空间。垃圾回收时首先需要先找到对象之后再进行对象回收。
目前的一种垃圾回收算法,进行垃圾回收时需要暂停全部应用线程,对内存区域中的垃圾回收完成之后,再启动全部应用线程,但是这种方式会增加停机时间,降低吞吐量,影响垃圾回收性能。
发明内容
本申请实施例提供一种垃圾回收方法、装置、虚拟机及计算设备,用以解决现有技术中影响垃圾回收性能的技术问题。
第一方面,本申请实施例中提供了一种垃圾回收方法,包括:
暂停程序对应的至少一条应用线程,扫描所述程序的运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动所述至少一条应用线程。
第二方面,本申请实施例中提供了一种垃圾回收方法,包括:
暂停Java程序对应的至少一条应用线程,扫描所述Java程序的运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动所述至少一条应用线程。
第三方面,本申请实施例中提供了一种程序运行方法,包括:
执行Java程序编译获得的Java字节码;
响应于垃圾回收指令,暂停所述Java字节码对应的至少一条应用线程,并扫描运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动所述至少一条应用线程。
第三方面,本申请实施例中提供了一种垃圾回收装置,包括:
扫描模块,用于暂停程序对应的至少一条应用线程,扫描所述程序的运行栈确定根对象地址;
内存确定模块,用于确定内存区域划分出的第一区域及第二区域;
回收模块,用于启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
触发模块,用于启动所述至少一条应用线程。
第四方面,本申请实施例中提供了一种虚拟机,运行于物理主机中,包括:
线程控制组件;
扫描组件,用于触发线程控制组件暂停程序对应的至少一条应用线程,扫描所述程序的运行栈确定根对象地址;
内存划分组件,用于将内存区域划分出第一区域及第二区域;
垃圾回收组件,用于触发线程控制组件启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;检测所述第二区域垃圾回收结束,触发所述线程控制组件启动所述至少一条应用线程。
第五方面,本申请实施例中提供了一种计算设备,包括处理组件以及存储组件;
所述存储组件存储一个或多个计算机指令;所述一个或多个计算机指令用以被所述处理组件调用执行;
所述处理组件用于:
暂停程序对应的至少一条应用线程,扫描所述程序的运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动所述至少一条应用线程。
本申请实施例中,进行垃圾回收处理时,暂停程序对应的至少一条应用线程,扫描程序运行栈确定根对象地址;将内存区域划分出第一区域及第二区域;启动其中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;之后再启动该至少一条应用线程。使得应用线程和垃圾回收操作可以并行执行,保证了吞吐量,且减少了应用线程暂停时间内的执行工作量,使得停机时间大大缩短,因此提高了垃圾回收性能
本申请的这些方面或其他方面在以下实施例的描述中会更加简明易懂。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了本申请提供的一种垃圾回收方法一个实施例的流程图;
图2示出了本申请提供的一种垃圾回收方法又一个实施例的流程图;
图3示出了本申请实施例在一个实际应用中的垃圾回收过程中的系统架构示意图;
图4示出了本申请提供的一种垃圾回收装置一个实施例的结构示意图;
图5示出了本申请提供的一种虚拟机一个实施例的结构示意图;
图6示出了本申请提供的一种计算设备一个实施例的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。
在本申请的说明书和权利要求书及上述附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如101、102等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。
本申请实施例的技术方案适用于利用中间平台执行托管语言的程序时的垃圾回收场景中。
为了方便理解本申请的技术方案,下面首先对本申请实施例中可能涉及的技术术语进行相应解释:
托管语言:是指一类编码生成的程序不被编译为相应操作系统平台可执行的机器码,而是编译为一种中间代码,由中间平台来解释执行从而实现对应业务逻辑的编程语言。例如,Java语言、.NET语言、JavaScript语言等。
中间平台:提供托管语言的程序的运行环境,用来执行程序编译获得的中间代码,通常是指虚拟机,其屏蔽了操作系统平台相关信息,使得托管语言的程序只需在虚拟机上运行,就可以在多种操作系统平台不加修改的运行实现对应业务逻辑,实现了程序兼容性。例如,Java虚拟机即是运行Java程序的中间平台。
垃圾回收(英文:Gabage Collection,简称:GC):中间平台提供的一种内存管理机制,用来回收内存区域中不再使用的对象,以释放内存空间。
内存区域:本申请实施例中特指用于存储对象的堆(Heap)内存,被所有应用线程共享,中间平台启动时即创建。中间平台执行程序时,会创建对象并在内容区域中为对象分配一块内存,对象即保存在内存区域中。由于中间平台会不断创建对象并分配内存,而若某个对象不再被引用时即变为垃圾,需要进行垃圾回收,否则内存就会被消耗空而影响程序运行。
垃圾对象:内存区域中不再被引用的对象。
应用线程:中间平台执行程序时所运行的用来实现相应业务逻辑的线程。
垃圾回收线程:中间平台所启动的用来进行垃圾回收的线程。
运行栈(Stack):用于存储应用线程中程序方法调用的状态。一个运行栈包含多个栈帧,一个栈帧用来存储局部变量表、操作数栈、动态链接、方法出口等信息。当应用线程调用一个方法时,会压入一个新的栈帧到该应用线程的运行栈中,当该方法执行完成,这个栈帧就从运行栈中弹出。
根对象:GC root对象,可以作为根对象的包括:运行栈中的引用的对象(即正在执行的方法中引用的对象)、本地方法栈中引用的对象、静态变量引用的对象,以及常量引用的对象等。从根对象出发可以访问到的每个对象即为存活对象,而若一个对象到根对象没有任何引用相连接,该对象即为垃圾对象。
由于垃圾回收会贯穿整个程序的生命周期,因此垃圾回收性能对业务影响很大,目前垃圾回收性能主要体现在两个方面:一为吞吐量,吞吐量是指程序执行时间与系统运行总时间的比例,吞吐量越高越好。二是停机时间,即应用线程暂停时间,停机时间越短越好。目前虽然实现垃圾回收有很多方式,但是通常需要在执行垃圾回收动作时,暂停全部应用线程直至垃圾回收结束,如背景技术中所述的一种垃圾回收方法,垃圾回收线程运行时,暂停全部应用线程,直至垃圾回收线程将内存区域中的垃圾对象全部回收完毕。这就导致停机时间过长,从而影响整体响应时间,影响吞吐量,而影响垃圾性能。
为了提高系统性能,发明人经过一系列研究提出了本申请的技术方案,内存区域划分出第一区域及第二区域,首先暂停程序对应的至少一条应用线程查找根对象地址,之后即可以启动其中的部分应用线程来访问第一区域,并基于根对象地址对第二区域进行垃圾回收,使得应用线程和垃圾回收操作可以并行执行,保证了吞吐量,且减少了应用线程暂停时间的执行工作量,使得停机时间大大缩短,因此提高了垃圾回收性能。
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图1为本申请实施例提供的一种垃圾回收方法一个实施例的流程图,本实施例由中间平台执行,具体的可以由中间平台创建的垃圾回收线程执行。该方法可以包括以下几个步骤:
101:暂停程序对应的至少一条应用线程,扫描程序运行栈确定根对象地址。
其中,程序对应的至少一条应用线程可以是指程序执行所需的至少一条应用线程,也即中间平台执行程序时所运行的至少一条应用线程,该至少一条应用线程可以包括中间平台执行程序时所运行的全部应用线程。
对内存区域执行垃圾回收处理操作时,首先暂停该至少一条应用线程,之后扫描运行栈即可以寻找获得根对象地址,进行初始标记。
本申请实施例中,程序是指基于托管语言编程获得的业务程序,其可以作为前端应用程序或者后端服务程序,以实现相应业务处理。中间平台执行程序具体是执行的程序编译获得的中间代码,例如Java程序,即执行的为Java程序编译获得Java字节码。
基于确定的根对象地址可以从内存区域中查找对应的根对象,从而基于根对象即可以找到内存区域中的存活对象及垃圾对象。
实际应用中,可以是响应于垃圾回收指令而执行步骤101的操作。垃圾回收指令一种可选方式可以是检测内存区域的存储空间满足回收条件时生成;该回收条件例如可以是存储空间存满或者剩余空间小于一定阈值等;作为另一种可选方式也可以是采用手动触发方式,也即基于用户触发操作而生成;作为又一种可选方式检测垃圾回收线程处于运行状态时而生成等。
其中,中间平台执行程序可以运行多条应用线程,进行垃圾回收时也可以运行多条垃圾回收线程,多条垃圾回收线程可以并发执行。
102:确定内存区域划分出的第一区域及第二区域。
103:启动该至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收。
第一区域可以由至少一个第一内存区块构成,第二区域可以由至少一个第二内存区块构成,每一个第一内存区块以及每一个第二内存区块均为连续存储空间,而至少一个第一内存区块不要求空间上连续,至少一个第二内存区域也不要求空间上连续。
其中,第二区域为需要执行垃圾回收处理的目标区域,第一区域为暂不执行垃圾回收处理的区域。
扫描获得根对象地址之后,可以启动部分应用线程以可以正常访问第一区域,对于第二区域则可以同时执行垃圾回收处理,以进行对象回收。
其中,内存区域的的划分可以预先执行,此外,也可以在执行垃圾回收操作时执行,因此在某些实施例中,步骤103之前,所述方法还可以包括:
将内存区域划分出第一区域及第二区域。
而将内存区域划分出第一区域及第二区域,一种可选方式可以是基于预先配置的划分方式,将内存区域划分出第一区域及第二区域。该划分方式可以是中间平台在每一次执行垃圾回收处理时由用户指定,该划分方式中规定了哪一部分内存空间为第一区域,哪一部分内存空间为第二区域,按照预配置要求,即可以划分出第一区域以及第二区域。
当然,作为另一种可选方式,也可以是中间平台在每一次执行垃圾回收处理时进行动态划分,可以结合对垃圾回收的性能要求来进行动态划分。其中,性能要求例如可以包括吞吐量要求等,吞吐量要求越高,该第一区域可以划分的越大等。
其中,该部分应用线程可以是指仅访问第一区域的应用线程,而不会对第二区域发起访问,以保证第二区域进行垃圾回收时,程序可以正常执行,不受影响。
作为一种可选方式,部分应用线程可以由用户指定,结合不同应用线程对内存区域的访问情况而指定仅访问第一区域的应用线程为该部分应用线程。因此,可选地,可以是启动预先指定的部分应用线程访问所述第一区域。
此外,作为另一种可选方式,也可以首先将该至少一条应用线程全部重新启动,并检测访问第二区域的应用线程,然后再将访问第二区域的应用线程暂停,只留下访问第一区域的应用线程运行。因此,可选地,启动该至少一条应用线程中的部分应用线程以访问第一区域可以包括:
启动该至少一条应用线程;
暂停访问第二区域的应用线程。
为了实现第二区域不可访问,可选地,将内存区域划分出第一区域及第二区域之后,还可以:
标记第二区域为不可访问区域。
其中,可以采用硬件机制标记第二区域为不可访问区域,例如对于Intel(英特尔)处理器,可以采用MPK(memory protection keys,内存保护关键字)的页面保护机制,让访问第二区域的应用线程处理暂停状态。
此外,也可以采用软件机制,为第二区域是指特定标记符号,应用线程检测该第二区域具备该特定标记符号,即切换至暂停状态。
而应用线程的启动可以采用(lock)技术实现,来唤醒处于暂停状态的应用线程。
104:启动该至少一条应用线程。
对第二区域进行垃圾回收结束之后,即可以全部启动该至少一条应用线程以进行对内存区域的正常访问,直至下一次需要执行垃圾处理操作,重复执行步骤101~步骤104的操作。
本实施例中,内存区域划分出第一区域及第二区域,首先暂停程序对应的至少一条应用线程来查找根对象地址,之后即可以启动其中部分应用线程来访问第一区域,并基于根对象地址对第二区域进行垃圾回收,使得应用线程垃圾回收操作可以并行执行,保证了吞吐量,且减少了应用线程暂停时间的执行工作量,使得停机时间大大缩短,因此提高了垃圾回收性能。
其中,基于根对象地址对第二区域进行对象回收可以采用Mark-Compact(标记-压缩)方式实现。如图2中所示,为本申请实施例提供的一种垃圾回收方法又一个实施例的流程图,该方法可以包括以下几个步骤:
201:暂停程序对应的至少一条应用线程,扫描程序的运行栈确定根对象地址。
202:确定内存区域划分出的第一区域及第二区域。
203:启动该至少一条应用线程中的部分应用线程访问第一区域。
204:基于根对象地址寻找存活对象。
205:确定存活对象的移动地址。
206:将存活对象移动至该移动地址。
207:暂停该至少一条应用线程,更新对存活对象的引用关系。
208:启动该至少一条应用线程。
其中,步骤201~步骤203以及步骤208的操作可以详见图1中所示实施例,在此不再赘述。
其中,基于根对象地址可以确定根对象,从而遍历根对象及其引用的对象,从根对象出发,开始搜索,对可以访问到的对象即可以标记为存活对象,之后为了充分利用内存空间,可以重新确定存活对象的移动地址,然后再将存活对象移动至该移动地址,使得存活对象都挨在一起存放在内存区域的一侧,空闲空间位于内存区域的另一侧,实现压缩目的。
将存活对象移动至该移动地址可以是指将存活对象写入对应的移动地址。存活对象的移动地址可以基于垃圾对象的存储地址确定,将存活对象写入移动地址,也即自动清除了该移动地址中存储的垃圾对象,实现了垃圾对象回收的目的。
而由于存活对象存在引用关系,为了保证程序正常运行,此时需要全部暂停该至少一条应用线程,更新对存活对象的引用关系,完成对象回收,之后再全部启动该至少一条应用线程。
其中,更新存活对象的引用关系可以是指由于存活对象的存储地址发生变化,引用存活对象的其它对象就需要更新存活对象的存储地址,例如A对象为存活对象,存在B对象引用A对象,由于B对象引用的是A对象的源地址,A对象的存储地址更新之后,就需要更新B对象引用的A对象的地址,以可以保证B对象可以正常引用A对象,使得程序可以正常执行。之所以需要全部暂停该至少一条应用线程,是为了避免更新对存活对象引用关系的之前,发生对存活对象的引用,而此时由于存活对象的存储地址已发生变化,导致程序无法执行。
由上述描述可知,本实施例中可以仅在寻找根对象地址以及更新对存活对象的引用关系时,暂停该至少一条应用线程,且停机时间内,仅执行了找根对象地址以及更新对存活对象的引用关系两种,降低了工作量,使得停机时间大大缩短,有助于提高垃圾回收性能。
另外,基于所述根对象地址对所述第二区域进行对象回收也可以采用Mark--Sweep(标记-清除)方式实现。因此,在某些实施例中,所述基于所述根对象地址对所述第二区域进行对象回收包括:
基于所述根对象地址寻找垃圾对象;
从所述第二区域中清除所述垃圾对象。
基于根对象地址可以确定根对象,从而遍历根对象及其引用的对象,从根对象出发,开始搜索,对与根对象没有任何引用相连接的对象,即可以标记为垃圾对象,从而可以将垃圾对象从第二区域中清除。虽然直接将垃圾对象从第二区域中清除会造成内存碎片产生,但是可以进一步保证降低停机时间,提高吞吐量,保证垃圾回收性能。
当然,也可以采用其它方式进行对象回收,比如复制方法等。
此外,实际应用中,通常对于多条线程情况需要多个处理器内核支持,处理器内核例如可以是指CPU(central processing unit,中央处理器)内核,中间平台可以基于处理器的虚拟化技术,因此,在某些实施例中,所述启动至少一条应用线程中的部分应用线程以访问第一区域,并基于根对象地址对第二区域进行垃圾回收包括:
确定多个处理器内核划分为的第一组内核以及第二组内核;
利用第一组内核运行部分应用线程以访问所述第一区域;
利用第二组内核运行至少一条垃圾回收线程以基于所述根对象地址对所述第二区域进行垃圾回收。
其中,第一组内核中的内核数与第二组内核中的内核数可以相同或者不同,其可以由用户指定,当然也可以动态确定。
可选地,多个处理器内核的划分可以预先执行,也可以在执行垃圾处理操作时执行,因此,在某些实施例中,该方法还可以包括:
将多个处理器内核划分为第一组内核以及第二组内核;
其中,作为一种可选方式,将多个处理器内核划分为第一组内核以及第二组内核可以包括:
按照预先配置的内核划分数量,将多个处理器内核划分为第一组内核以及第二组内核。
可以是在每一次执行垃圾回收处理操作时,预先配置该内核划分数量。当然,也可以固定内核划分数量,每一次执行垃圾回收处理操作均按照该内核划分数量进行划分。
该内核划分数量规定了第一组内核中的内核数量与第二组内核中的内核数量。
因此,可以具体是确定按照预先配置的内核划分数量,将多个处理器内核划分为的第一组内核以及第二组内核。
作为另一种可选方式,将多个处理器内核划分为第一组内核以及第二组内核可以包括:
基于对垃圾回收的时间要求和/或内存使用压力情况,将多个处理器内核划分为第一组内核以及第二组内核。
因此,可以具体是确定基于对垃圾回收的时间要求和/或内存使用压力情况,将多个处理器内核划分为第一组内核以及第二组内核。
其中,对垃圾回收的时间要求可以包括GC间隔时间或每次GC的持续时间等。内存使用压力情况包括对象创建效率或对象存活时间等。
例如,对象创建效率越快,垃圾对象产出量可能越多,GC间隔时间需要越短,而若要求GC持续时间越短,GC线程的工作量就会很大,此时可以划分较多数量的处理器内核至第二组内核等。
而若对象存活时间较长,要求GC持续时间越长,可以分配较少数量的处理器内核至第二组内核等。
因此,基于对垃圾回收的时间要求和/或内存使用压力情况,可以确定第一组内核中内核数量以及第二组内核中的内核数量,进而实现划分。
当然,上述仅是举例说明,可以结合实际需求来设定具体划分规则等。
在一个实际应用中,本申请实施例的技术方案可以适用于Java虚拟机的垃圾回收场景中,Java程序通过JVM(Java Virtual Machine,Java虚拟机)翻译执行而实现相应的业务逻辑,通过JVM使得Java程序只需编译为可以由JVM执行的字节码,即可以在多种操作系统平台上不加修改的运行。
因此,本申请实施例还提供了一种垃圾回收方法,可以包括:
暂停Java程序对应的至少一条应用线程,扫描Java程序的运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动该至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动该至少一条应用线程。与前文所述各实施例不同之处,本实施例中,程序具体是指Java程序,中间平台为JVM,其它相同或相似步骤可以参见前文各个实施例中所述,在此将不再重复赘述。
其中,Java程序可以作为前端应用程序或者后端服务程序,利用JVM实现相应的业务处理。
此外,本申请实施例还提供了一种程序运行方法,可以包括:
执行程序编译获得的中间代码;
响应于垃圾回收指令,暂停程序对应的至少一个应用线程,扫描程序的运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动所述至少一个应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动所述至少一个应用线程。
其中,垃圾回收指令可以参见前文所述。例如,可以是在检测内存区域的存储空间满足回收条件时,生成该垃圾回收指令;或者基于用户触发操作而生成该垃圾回收指令等。
而对于Java程序,中间代码具体即为Java程序编译获得的Java字节码,因此,本申请实施例还提供了一种程序运行方法,可以包括:
执行Java程序编译获得的Java字节码;
响应于垃圾回收指令,暂停Java字节码对应的至少一个应用线程,并扫描运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动所述至少一个应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动所述至少一个应用线程。
为了方便理解本申请技术方案,如图3所示的垃圾回收架构图中,中间平台可以是指运行在物理主机中的虚拟机30,程序作为后端服务程序时,虚拟机30即为虚拟服务器,在执行垃圾回收处理时,虚拟机30将处理器内核(CPU内核)300划分为第一组内核301以及第二组内核302,第一组内核301运行部分应用线程303,第二组内核302运行至少一条垃圾回收线程304。其中,该部分应用线程可以包括多条应用线程,垃圾回收线程也可以包括多条,通常一个处理器内核可以运行一个线程,当然也可以运行两个或多个。
内存区域划分出第一区域305以及第二区域306,需要说明的是,图3中第二区域306虽然为地址连续存储空间,可以理解的是,第二区域306可以由多个第二区块构成,多个第二区块的地址不一定是连续,同样,对于第一区域305,也可以由多个第一区块构成,多个第一区块的地址也不一定是连续的。
进行垃圾回收处理时,第一组内核301运行的应用线程仅可以访问第一区域305,第二区域306可以标记为对第一组内核301运行的应用线程303不可访问,也即不可读写,使得第一组内核301运行的应用线程访问第二区域306时,会陷入暂停状态直接该第二区域垃圾回收完毕。从而第二组内核302运行的至少一条垃圾回收线程可以对第二区域306进行垃圾回收处理,回收垃圾对象。
图4为本申请实施例提供的一种垃圾回收装置一个实施例的结构示意图,该装置在实际应用中可以实现为虚拟机的功能组件,该装置可以包括:
扫描模块401,用于暂停程序对应的至少一条应用线程,扫描程序的运行栈确定根对象地址;
内存确定模块402,用于确定内存区域划分出的第一区域及第二区域;
回收模块403,用于启动该至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
触发模块404,用于启动该至少一条应用线程。
在某些实施例中,该回收模块启动部分应用线程以访问所述第一区域包括:
启动该至少一条应用线程;
暂停该至少一条应用线程中访问所述第二区域的应用线程。
在某些实施例中,该装置还可以包括:
内存划分模块,用于将内存区域划分出第一区域及第二区域;
标记模块,标记所述第二区域为不可访问区域。
在某些实施例中,该回收模块启动该至少一条应用线程中的部分应用线程以访问所述第一区域包括:
启动该至少一条应用线程中预先指定的部分应用线程以访问所述第一区域。
在某些实施例中,该回收模块基于所述根对象地址对所述第二区域进行对象回收包括:
基于所述根对象地址寻找存活对象;
确定所述存活对象的移动地址;
将所述存活对象移动至所述移动地址;
暂停该至少一条应用线程,更新对所述存活对象的引用关系。
在某些实施例中,该回收模块基于所述根对象地址对所述第二区域进行对象回收包括:
基于所述根对象地址寻找垃圾对象;
从所述第二区域中清除所述垃圾对象。
在某些实施例中,该内存确定模块具体用于确定按照预先配置的划分方式,将内存区域划分出的第一区域及第二区域。
在某些实施例中,该内存确定模块具体用于确定基于对垃圾回收的性能要求,将内存区域划分出的第一区域及第二区域。
在某些实施例中,该回收模块具体用于确定多个处理器内核划分为的第一组内核以及第二组内核;
利用第一组内核运行部分应用线程以访问所述第一区域;
利用第二组内核运行至少一条垃圾回收线程以基于所述根对象地址对所述第二区域进行垃圾回收。
在某些实施例中,该回收模块确定多个处理器内核划分为的第一组内核以及第二组内核包括:
确定按照预先配置的内核划分数量,将多个处理器内核划分为的第一组内核以及第二组内核。
在某些实施例中,该内回收模块确定多个处理器内核划分为的第一组内核以及第二组内核包括:
确定基于对垃圾回收的时间要求和/或内存使用压力情况,将多个处理器内核划分为的第一组内核以及第二组内核。
在某些实施例中,该扫描模块具体用于响应于垃圾回收指令,暂停程序对应的至少一条应用线程,扫描程序的运行栈确定根对象地址。
在某些实施例中,该装置还可以包括:
指令生成模块,用于检测所述内存区域的存储空间满足回收条件时,生成所述垃圾回收指令。
图4所述的垃圾回收装置可以执行图1所示实施例所述的垃圾回收方法,其实现原理和技术效果不再赘述。对于上述实施例中的垃圾回收装置其中各个模块、单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
此外,本申请实施例还提供了一种虚拟机,其运行于物理主机中,如图5中所示,可以包括:
线程控制组件501;
扫描组件502,用于触发线程控制组件501暂停程序对应的至少一条应用线程,扫描程序的运行栈确定根对象地址;
内存划分组件503,用于将内存区域划分出第一区域及第二区域;
垃圾回收组件504,用于触发线程控制组件启动该至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;检测所述第二区域垃圾回收结束,触发所述线程控制组件501全部启动该至少一条应用线程。
图5所示的虚拟机可以执行图1所示实施例所述的垃圾回收方法,其实现原理和技术效果不再赘述。
在一个可能的设计中,本申请实施例还提供了一种计算设备,该计算设备可以为运行中间平台的物理主机,如图6所示,该计算设备可以包括存储组件601以及处理组件602;
所述存储组件601存储一条或多条计算机指令,其中,所述一条或多条计算机指令供所述处理组件602调用执行。
所述处理组件602用于:
暂停程序对应的至少一条应用线程,扫描程序的运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动该至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动该至少一条应用线程。
其中,处理组件602可以包括一个或多个处理器来执行计算机指令,以完成上述的方法中的全部或部分步骤。处理器可以为多核处理器以运行多个线程。当然处理组件也可以为一个或多个应用专用集成电路(ASIC)、数字信号处理器(DSP)、数字信号处理设备(DSPD)、可编程逻辑器件(PLD)、现场可编程门阵列(FPGA)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述方法。
存储组件601被配置为存储各种类型的数据以支持在终端的操作。存储组件可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。
当然,计算设备必然还可以包括其他部件,例如输入/输出接口、通信组件等。
输入/输出接口为处理组件和外围接口模块之间提供接口,上述外围接口模块可以是输出设备、输入设备等。
通信组件被配置为便于计算设备和其他设备之间有线或无线方式的通信等。
本申请实施例还提供了一种计算机可读存储介质,存储有计算机程序,所述计算机程序被计算机执行时可以实现上述图1所示实施例的垃圾回收方法。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。
Claims (18)
1.一种垃圾回收方法,其特征在于,包括:
暂停程序对应的至少一条应用线程,扫描所述程序的运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动所述至少一条应用线程。
2.根据权利要求1所述的方法,其特征在于,所述启动所述至少一条应用线程中的部分应用线程以访问所述第一区域包括:
启动所述至少一条应用线程;
暂停所述至少一条应用线程中访问所述第二区域的应用线程。
3.根据权利要求2所述的方法,其特征在于,所述方法还包括:
将内存区域划分出第一区域及第二区域;
标记所述第二区域为不可访问区域。
4.根据权利要求1所述的方法,其特征在于,所述启动所述至少一条应用线程中的部分应用线程以访问所述第一区域包括:
启动所述至少一条应用线程中预先指定的部分应用线程以访问所述第一区域。
5.根据权利要求1所述的方法,其特征在于,所述基于所述根对象地址对所述第二区域进行对象回收包括:
基于所述根对象地址寻找存活对象;
确定所述存活对象的移动地址;
将所述存活对象移动至所述移动地址;
暂停所述至少一条应用线程,更新对所述存活对象的引用关系。
6.根据权利要求1所述的方法,其特征在于,所述基于所述根对象地址对所述第二区域进行对象回收包括:
基于所述根对象地址寻找垃圾对象;
从所述第二区域中清除所述垃圾对象。
7.根据权利要求1所述的方法,其特征在于,所述确定内存区域划分出的第一区域及第二区域包括:
确定按照预先配置的划分方式,将内存区域划分出的第一区域及第二区域。
8.根据权利要求1所述的方法,其特征在于,所述确定内存区域划分出的第一区域及第二区域包括:
确定基于对垃圾回收的性能要求,将内存区域划分出的第一区域及第二区域。
9.根据权利要求1所述的方法,其特征在于,所述启动所述至少一条应用线程中的部分应用线程以访问所述第一区域,并基于所述根对象地址对所述第二区域进行垃圾回收包括:
确定多个处理器内核划分为的第一组内核以及第二组内核;
利用第一组内核运行部分应用线程以访问所述第一区域;
利用第二组内核运行至少一条垃圾回收线程以基于所述根对象地址对所述第二区域进行垃圾回收。
10.根据权利要求8所述的方法,其特征在于,所述确定多个处理器内核划分为的第一组内核以及第二组内核包括:
确定按照预先配置的内核划分数量,将多个处理器内核划分为的第一组内核以及第二组内核。
11.根据权利要求8所述的方法,其特征在于,所述确定多个处理器内核划分为的第一组内核以及第二组内核包括:
确定基于对垃圾回收的时间要求和/或内存使用压力情况,将多个处理器内核划分为第一组内核以及第二组内核。
12.根据权利要求1所述的方法,其特征在于,所述暂停程序对应的至少一条应用线程,扫描所述程序的运行栈确定根对象地址包括:
响应于垃圾回收指令,暂停程序对应的至少一条应用线程,扫描所述程序的运行栈确定根对象地址。
13.根据权利要求10所述的方法,其特征在于,还包括:
检测所述内存区域的存储空间满足回收条件时,生成所述垃圾回收指令。
14.一种垃圾回收方法,其特征在于,包括:
暂停Java程序对应的至少一条应用线程,扫描所述Java程序的运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动所述至少一条应用线程。
15.一种程序运行方法,其特征在于,包括:
执行Java程序编译获得的Java字节码;
响应于垃圾回收指令,暂停所述Java字节码对应的至少一条应用线程,并扫描运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动所述至少一条应用线程。
16.一种垃圾回收装置,其特征在于,包括:
扫描模块,用于暂停程序对应的至少一条应用线程,扫描所述程序的运行栈确定根对象地址;
内存确定模块,用于确定内存区域划分出的第一区域及第二区域;
回收模块,用于启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
触发模块,用于启动所述至少一条应用线程。
17.一种虚拟机,其特征在于,运行于物理主机中,包括:
线程控制组件;
扫描组件,用于触发线程控制组件暂停程序对应的至少一条应用线程,扫描所述程序的运行栈确定根对象地址;
内存划分组件,用于将内存区域划分出第一区域及第二区域;
垃圾回收组件,用于触发线程控制组件启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;检测所述第二区域垃圾回收结束,触发所述线程控制组件启动所述至少一条应用线程。
18.一种计算设备,其特征在于,包括处理组件以及存储组件;
所述存储组件存储一个或多个计算机指令;所述一个或多个计算机指令用以被所述处理组件调用执行;
所述处理组件用于:
暂停程序对应的至少一条应用线程,扫描所述程序的运行栈确定根对象地址;
确定内存区域划分出的第一区域及第二区域;
启动所述至少一条应用线程中的部分应用线程访问所述第一区域,并基于所述根对象地址对所述第二区域进行对象回收;
启动所述至少一条应用线程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010145009.7A CN113360274A (zh) | 2020-03-04 | 2020-03-04 | 垃圾回收方法、装置及计算设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010145009.7A CN113360274A (zh) | 2020-03-04 | 2020-03-04 | 垃圾回收方法、装置及计算设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113360274A true CN113360274A (zh) | 2021-09-07 |
Family
ID=77523441
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010145009.7A Pending CN113360274A (zh) | 2020-03-04 | 2020-03-04 | 垃圾回收方法、装置及计算设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113360274A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113900743A (zh) * | 2021-09-24 | 2022-01-07 | 阿里云计算有限公司 | 一种Java对象访问的方法和装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102023891A (zh) * | 2010-12-20 | 2011-04-20 | 复旦大学 | 基于Java虚拟机的并发垃圾收集器框架 |
CN102722415A (zh) * | 2012-05-22 | 2012-10-10 | 广州晶锐信息技术有限公司 | 基于堆栈体系结构Java SoC系统的垃圾收集方法 |
CN108459898A (zh) * | 2017-02-20 | 2018-08-28 | 阿里巴巴集团控股有限公司 | 一种资源回收方法及装置 |
CN110795248A (zh) * | 2019-10-29 | 2020-02-14 | 焦点科技股份有限公司 | 一种处理搜索系统Java实例垃圾回收的方法 |
-
2020
- 2020-03-04 CN CN202010145009.7A patent/CN113360274A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102023891A (zh) * | 2010-12-20 | 2011-04-20 | 复旦大学 | 基于Java虚拟机的并发垃圾收集器框架 |
CN102722415A (zh) * | 2012-05-22 | 2012-10-10 | 广州晶锐信息技术有限公司 | 基于堆栈体系结构Java SoC系统的垃圾收集方法 |
CN108459898A (zh) * | 2017-02-20 | 2018-08-28 | 阿里巴巴集团控股有限公司 | 一种资源回收方法及装置 |
CN110795248A (zh) * | 2019-10-29 | 2020-02-14 | 焦点科技股份有限公司 | 一种处理搜索系统Java实例垃圾回收的方法 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113900743A (zh) * | 2021-09-24 | 2022-01-07 | 阿里云计算有限公司 | 一种Java对象访问的方法和装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Kim et al. | Fully automatic stream management for {Multi-Streamed}{SSDs} using program contexts | |
CN107481762B (zh) | 一种固态硬盘的trim处理方法及装置 | |
KR100384905B1 (ko) | 컴퓨터 메모리에서 데이터 관리 방법, 장치 및 기록매체 | |
US10496534B2 (en) | Manual memory management using lazy patching | |
US8453132B2 (en) | System and method for recompiling code based on locality domain and thread affinity in NUMA computer systems | |
CN101814049A (zh) | 一种内存泄漏探测方法 | |
CN109154908B (zh) | 具有精确垃圾收集报告的动态大小的局部 | |
CN1233797A (zh) | 在面向对象的系统中的位置特定的信息分配 | |
KR20140034246A (ko) | 새로운 애플리케이션을 위한 메모리 관리 모델 및 인터페이스 | |
KR20140033448A (ko) | 수정되지 않은 애플리케이션을 위한 메모리 관리 모델 및 인터페이스 | |
CN113688062B (zh) | 用于存储数据的方法和相关产品 | |
JP5896952B2 (ja) | メモリを管理する方法、装置およびコンピュータ・プログラム | |
CN111078279A (zh) | 字节码文件的处理方法、装置、设备及存储介质 | |
CN114327917A (zh) | 内存管理方法、计算设备及可读存储介质 | |
US8176286B2 (en) | Memory recycling in computer systems | |
CN113360274A (zh) | 垃圾回收方法、装置及计算设备 | |
US9870400B2 (en) | Managed runtime cache analysis | |
US11474832B2 (en) | Intelligently determining a virtual machine configuration during runtime based on garbage collection characteristics | |
CN108121602B (zh) | 一种确定垃圾收集触发点的方法、电子设备及存储介质 | |
KR101950759B1 (ko) | 저장 장치의 메모리 컨트롤러가 수행하는 가비지 컬렉션 방법 및 메모리 컨트롤러 | |
WO2001057649A2 (en) | Global constant pool to allow deletion of constant pool entries | |
CN109923527B (zh) | 可变类型建立器 | |
CN110851181B (zh) | 数据处理方法、装置及计算设备 | |
CN113568581A (zh) | 一种嵌入式设备的多应用资源回收方法及系统 | |
CN102693325B (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 | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20210907 |