一种Java虚拟机分代垃圾快速回收方法
【专利摘要】本发明公开了一种Java虚拟机分代垃圾快速回收方法,采用虚拟表构建用于回收并且整理内存空间的垃圾回收器;将内存划分为多个大小相等的内存块,每个内存块属于不同的内存集,内存集是包括若干内存块的集合;对于等待被回收处理的内存空间内的多个内存集,分别扫描每个内存集内的内存块;内存集按照先后顺序,在先的内存集先被扫描会回收,在后的内存集后被扫描回收,如同代际更替;如果某个内存集J内的内存块中的对象均未被其他内存集内的内存块中的对象引用,则该内存集J为垃圾内存,被回收。本发明针对机顶盒硬件运算能力不高、存储有限、实时性强的特点,提高了运算速度和响应时间,很好地满足了数字电视机顶盒的实时性要求。
【专利说明】一种Java虚拟机分代垃圾快速回收方法
【技术领域】
[0001]本发明属于数字电视中间件【技术领域】,特别涉及一种Java虚拟机分代垃圾快速回收方法。
【背景技术】
[0002]数字电视中间件技术为广电运营商的业务提供一个相对统一的平台,使得跨域的业务互通变得更加简单。中间件技术通过对底层硬件资源的抽象,提供对上层各种应用的支持,其中间件平台负责屏蔽底层硬件差异性,并将底层资源模块抽象为上层API接口供第三方业务模块调用,通过终端平台来进行解析和呈现。在中间件平台里,终端平台在负责完成基本的音视频播放的同时,也负责接收前端广播的应用,并根据用户的操作运行这些应用,使得跨平台、海量信息业务的开展成为可能。
[0003]对于数字电视中间件软件平台,中国数字电视中间件标准规定了必需支持Java应用。要实现支持Java的功能,通常包含一个Java虚拟机,用来执行运行在数字电视机顶盒上的Java应用程序,通过独特的结构及跨平台设计,将应用程序和中间件标准,底层操作系统、硬件驱动隔离开,使上层的数字电视的服务应用不必考虑过多的平台细节,实现跨平台与硬件无关性。
[0004]在数字电视中间件技术架构下,Java虚拟机采用紧凑对象布局设计,统一资源管理的模式,使内存布局尽可能紧凑,为了保证系统的运行速度。在Java虚拟机中,不仅要分配对象所用的内存资源,还需要跟踪资源的使用情况,定期检查出不再使用的内存,由系统自动回收并做再次分配,这被称为垃圾回收机制。在这种方式下,Java程序必须考虑内存释放问题,影响了机顶盒的实时性要求。
【发明内容】
[0005]本发明的目的是提供一种Java虚拟机分代垃圾快速回收方法,使得Java程序中将不用考虑内存的释放问题,为提高系统程序的安全性,满足机顶盒的实时性要求。
[0006]本发明的技术方案是,一种Java虚拟机分代垃圾快速回收方法,包括步骤:
[0007]采用虚拟表构建用于回收并且整理内存空间的垃圾回收器;
[0008]将内存划分为多个大小相等的内存块,每个内存块属于不同的内存集,内存集是包括若干内存块的集合;
[0009]对于等待被回收处理的内存空间内的多个内存集,分别扫描每个内存集内的内存块;
[0010]内存集按照先后顺序,在先的内存集先被扫描会回收,在后的内存集后被扫描回收,如同代际更替;
[0011]如果某个内存集J内的内存块中的对象均未被其他内存集内的内存块中的对象引用,则该内存集J为垃圾内存,被回收。
[0012]还包括步骤:[0013]若某内存集J的内存块中的对象A被其他内存集的内存块C中对象B引用,则将对象A以及与对象A有引用关系的与对象A同处内存集J的其他对象转移至内存块C内;
[0014]若内存块C已满,则在内存块所处的内存集的尾部开辟新的内存块一次存放。
[0015]还包括步骤:
[0016]内存集J中未被其他内存集引用的对象被转移至内存集J的尾部,当扫描至内存集J尾部,所述的被转移至内存集J尾部的对象仍然未被处于其他内存集的外部对象引用,则内存集J被回收。
[0017]所述的Java虚拟机分代垃圾快速回收,还包括对I/O和信号量的系统资源回收。
[0018]现有技术中的Java虚拟机采用了火车算法,其每次只回收一个车次的策略使Java虚拟机垃圾回收的运行时间在可控制范围内,但不能保证垃圾回收何时运行。而根据测试,在数字电视中间件技术架构下,Java虚拟机在低负载情况下运行垃圾回收会更少占用系统资源,因此考虑优化目前垃圾回收器采用火车算法。
[0019]本发明的具体采用的策略大致如下:数字电视中间件技术架构下,在Java虚拟机采用紧凑对象布局设计,统一资源管理的模式,使内存布局尽可能紧凑,不仅要分配对象所用的内存资源,还需要跟踪资源的使用情况,定期检查出不再使用的内存,由系统自动回收并做再次分配,这被称为垃圾回收机制。内部创建一个系统资源使用信息表,该表记录了系统资源和相关方法的调用情况,通过对系统资源信息表的统计和分析,采用异步方式通知垃圾回收器运行在系统负载比较小的状态中,通过分代垃圾回收的火车算法,对每次只回收一列火车的策略,使Java虚拟机垃圾回收的空间控制在一定范围内,很大程度上满足数字电视实时性需求从而达到系统负载尽可能平衡,提升系统整体性能。
[0020]本发明采用独特的虚拟表技术,提高Java虚拟机分代垃圾回收的快速收集方法,主要针对机顶盒硬件运算能力不高、存储有限、实时性强的特点,突破了传统的Java虚拟机分代垃圾回收方法,采用新的设计和优化算法,提高了运算速度和响应时间,很好地满足了数字电视机顶盒的实时性要求。
【专利附图】
【附图说明】
[0021]图1本发明涉及的数字电视Java虚拟机框架图。
[0022]图2本发明的数字电视中间件结构示意图。
[0023]图3是本发明实施例中算法之一示意图
[0024]图4是本发明实施例中算法之一示意图
[0025]图5是本发明实施例中算法之一示意图
【具体实施方式】
[0026]在Java虚拟机的实现中,垃圾回收器处于最重要的位置之一。垃圾回收器设计的好坏直接影响Java虚拟机执行性能和内存消耗。
[0027]垃圾回收器的功能是回收不再使用的内存对象,同时对不连续的堆碎片进行整理。在机顶盒上运行Java程序,性能很重要,不希望在运行Java程序时候,垃圾回收器占用太长的时间,以至让Java程序运行缓慢。所以必须保证垃圾回收器运行时不能超过一个最大时间。[0028]本次发明是经过大量算法和数据研究,在Java虚拟机中实现垃圾回收器采用了火车算法。该算法采用渐进式收集垃圾,并不是一次收集所有的垃圾,这样保证了收集时间不会太长。火车算法是在成熟对象空间中提供限定时间的渐进收集。在火车算法中,内存被分为块,多个块组成一个集合。为了形象化,一节车厢代表一个块,一列火车代表一个集合,见图3。
[0029]注意每个车厢大小相等,但每个火车包含的车厢数不一定相等。垃圾收集以车厢为单位,收集顺序依次为1.1,1.2,1.3,1.4,2.1,2.2,2.3,3.1,3.2,3.3……。这个顺序也是块被创建的先后顺序。
[0030]如图3所示,垃圾收集器先从块1.1开始扫描直到1.4。如果火车I的四个块中的所有对象没有被火车2和火车3的对象引用,而只有火车I内部的对象相互引用,则整个火车I都是垃圾,可以被回收。
[0031]如图4所示,车厢1.1中有对象A和对象B,1.3中有对象C,1.4中有对象D,车厢
2.2中有对象E,车厢3.3中有对象F。在火车I中,对象C引用对象A,对象B引用对象D,可见,火车2和火车3没有引用火车I的对象,则整个火车I都是垃圾。
[0032]火车I中有对象被其它火车引用,见图5,扫描车厢1.1时发现对象A被火车2中的E引用,则将对象A从车厢1.1转移到车厢2.2,然后扫描A引用的对象D,把D也转移到车厢2.2,然后扫描D,看D是否引用其它对象,如果引用了其它对象则也要转移,依次类推。扫描完火车I的所有对象后,剩下的没有转移的对象都是垃圾,可以把整个火车I都作为垃圾回收。注意如果在转移时,如果车厢2.2空间满了,则要在火车2末尾开辟新的车厢2.4,将新转移的对象都放到2.4,即火车的尾部)
[0033]补充说明:垃圾回收器一次只扫描一个车厢。图5中的对象B与C并不是立即被回收,而是先会被转移到火车I的尾部车厢。即扫描完1.1后,B被转移到火车I尾部,扫描完1.3后,C被转移到车尾。等垃圾收集器扫描到火车I尾部时,如果仍然没有外部对象引用它们,则B和C会被收集。火车算法最大的好处是它可以保证大的循环结构可以被完全收集。因为成为垃圾的循环结构中的对象,无论多大,都会被移入同一列火车,最终一起被收集。
[0034]当Java虚拟机运行后不久,在垃圾回收过程中会遇到一些可能不再使用的系统资源,如内存、I/O、信号量等等。但随着时间的推移,各种资源的生命周期不一样。有些资源会被频繁的回收,而有些资源会很长时间才回收。基于这样的一个情况,采用分代来管理这些会被回收的资源。又由于嵌入式硬件资源的条件限制和实时性,需要把垃圾回收的时间确定到某一段时间内,不能大于这个时间,否则会影响整个系统的性能。因此本才发明采用了分代回收的火车算法。在Java虚拟机中,分代是用每列火车来表示的。
[0035]每列火车大小固定,第一列火车代表了第一代可回收的系统资源,第二列火车代表了第二代可回收资源,以此类推。最先回收的垃圾总是在第一列火车中寻找,随着时间的推移,当分配的系统资源占满了第一列火车的时候,我们依此扫描第一列火车的每个车箱,把还不能回收的资源移动到第二列火车中,形成第二代。由于第一列火车的大小固定,那么我们总能在规定时间内扫描完整列火车,当第一列火车全空的时候我就释放整个火车,这样第二列火车就变成第一列,依此类推。由于一般情况大部分资源都是快速回收的资源,所以本算法性能很好。
【权利要求】
1.一种Java虚拟机分代垃圾快速回收方法,其特征在于,包括步骤: 采用虚拟表构建用于回收并且整理内存空间的垃圾回收器; 将内存划分为多个大小相等的内存块,每个内存块属于不同的内存集,内存集是包括若干内存块的集合; 对于等待被回收处理的内存空间内的多个内存集,分别扫描每个内存集内的内存块;内存集按照先后顺序,在先的内存集先被扫描会回收,在后的内存集后被扫描回收,如同代际更替; 如果某个内存集J内的内存块中的对象均未被其他内存集内的内存块中的对象引用,则该内存集J为垃圾内存,被回收。
2.如权利要求1所述的Java虚拟机分代垃圾快速回收方法,其特征在于,包括步骤: 若某内存集J的内存块中的对象A被其他内存集的内存块C中对象B引用,则将对象A以及与对象A有引用关系的与对象A同处内存集J的其他对象转移至内存块C内; 若内存块C已满,则在内存块所处的内存集的尾部开辟新的内存块一次存放。
3.如权利要求2所述的Java虚拟机分代垃圾快速回收方法,其特征在于,包括步骤: 内存集J中未被其他内存集引用的对象被转移至内存集J的尾部,当扫描至内存集J尾部,所述的被转移至内存集J尾部的对象仍然未被处于其他内存集的外部对象引用,则内存集J被回收。
4.如权利要求1所述的Java虚拟机分代垃圾快速回收方法,其特征在于,所述的Java虚拟机分代垃圾快速回收,还包括对I/O和信号量的系统资源回收。
【文档编号】G06F9/46GK103995741SQ201410236367
【公开日】2014年8月20日 申请日期:2014年5月29日 优先权日:2014年5月29日
【发明者】许海华, 沈江涛, 何明, 杜平, 许哲维 申请人:无锡商埃曲信息科技有限公司