首页> 中国专利> 自动进行存储器泄露检测和补救的系统和方法

自动进行存储器泄露检测和补救的系统和方法

摘要

一种用于检测和补救存储器泄露的方法、系统和装置。在本发明的方法中,可为在存储器中创建的一对象实例建立一老化值,并且当所述对象实例由一执行着的进程引用时重置所述老化值。比较起来,在一遍垃圾回收期间,当所述对象实例自从前一遍垃圾回收以来没有被一执行着的进程所引用时,可递增所述老化值。重要的是,当所述老化值超过一阈值时,可把所述对象实例作为一闲荡者进行处理。所述处理步骤本身可包括清除存储器中的至少一个高速缓存,和在一日志文件中将所述对象实例作为一闲荡者报告。然而,当所述对象实例属于一指定的免除类时,可避免所述处理步骤。

著录项

  • 公开/公告号CN1604050A

    专利类型发明专利

  • 公开/公告日2005-04-06

    原文格式PDF

  • 申请/专利权人 国际商业机器公司;

    申请/专利号CN200410080375.X

  • 发明设计人 M·贝当古;D·M·帕特尔;

    申请日2004-09-29

  • 分类号G06F12/00;G06F12/16;G06F11/00;

  • 代理机构11247 北京市中咨律师事务所;

  • 代理人于静;李峥

  • 地址 美国纽约

  • 入库时间 2023-12-17 16:04:13

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2012-11-28

    未缴年费专利权终止 IPC(主分类):G06F12/00 授权公告日:20070919 终止日期:20110929 申请日:20040929

    专利权的终止

  • 2007-09-19

    授权

    授权

  • 2005-06-08

    实质审查的生效

    实质审查的生效

  • 2005-04-06

    公开

    公开

说明书

技术领域

本发明涉及存储器泄露领域,更具体地说涉及用于补救存储器泄露(memory leakage)的垃圾回收(garbage collection)。

背景技术

存储器泄露已困扰了软件开发者们几十年,造成有时是在全球分发的充满程序错误的、易于崩溃的软件应用程序。特别是对于那些允许手工分配存储器、但也要求手工释放已分配存储器的编程语言来说,存储器泄露已被证明为在软件开发阶段主要需要解决的运行时程序错误。存储器泄露问题已变得如此普遍,以至于一些仅仅用于解决存储器泄露问题的完整的软件开发工具已被开发出来和推向市场。

按照广义的定义,存储器泄露是由于未能重新分配先前已被分配但不再被使用的存储器而导致的可分配存储器的逐渐丧失。通常,可以为具有一短暂生存期的数据保留存储器。一旦该生存期结束,则应当把所述所保留的存储器返回到可分配存储器池中,以便可随后在需要时使用所述所保留的存储器。重要的是,在存储器泄露持续存在而没有进行补救的情况下,最终将没有足够的存储器来满足其他进程的需要。

认识到解决存储器泄露问题的重要性,计算机编程语言理论家们发展出了垃圾回收的概念。垃圾回收指的是自动分析已分配的存储器,以识别包含着不再为相关诸进程的运行所需要的数据的已分配存储器区域。在面向对象的编程语言例如JavaTM编程语言的情境中,当在一相应应用程序中不再访问驻留在存储器中的对象时,就可将已分配给这种“已死的”对象的存储器返回到可分配存储器池中。

在Java虚拟机(JVM)的最近版本中部署了一个著名的垃圾回收算法,“标记和清扫”(Mark and Sweep)垃圾回收算法。图1是示出了传统和著名的“标记和清扫”垃圾回收过程的流程图。由块110开始,进行到判断块120,在此可确定是否由于分配一块存储器(通常为堆)的请求而产生了一存储器分配失败。如果是这样,则在块130从所述堆中获得一第一个对象来进行分析。如果在判断块140确定该对象可从根到达,这意味着该对象已被配置为用于在一执行着的进程的一主动方面中的当前访问,则在块150可将该对象标记为活着的。

随后在块160,如果在存储器中还有更多的对象供分析,则在判断块170可从所述堆中获取下一个对象来进行分析。获取之后,可重复进行块130至块170的过程,并且可对所述堆中的所有对象继续进行该过程。在判断块160,当在所述堆对没有对象供分析时,则在块180,可清除所述堆中的所有未被标记的对象,以便可将作为基础的存储器返回到存储器池中,这样,响应于新的分配请求,可将该存储器重新分配。最后,在块190,本过程可结束。

本领域的技术人员将认识到,图1的“标记和清扫”算法依赖于这样的观念,即驻留在存储器中、但不再为一执行着的进程的一主动方面所访问的对象是应当解除分配的已成为孤儿的存储器块。然而,这种推理却忽视了这样的情况可能是有意识的编程构造的结果。而且,“标记和清扫”过程不考虑闲荡(loitering)的对象—由堆中其他活着的对象所引用但没有未来用处的那些对象。然而,在很多情况下,闲荡的对象可构成存储器泄露的基础。

发明内容

本发明试图解决本技术领域在存储器泄露检测和补救方面的缺陷,并提供了一种用于自动进行存储器泄露检测和补救的新的和非显而易见的方法、系统和装置。在本发明的一优选方面,一种自动进行存储器泄露检测和补救的系统包括与存储器相耦合的一自动垃圾回收器,该存储器被配置为存储对象实例,这些对象实例可由执行着的进程访问,并可由所述存储器中的其他对象实例引用。该系统进一步可包括被耦合到所述自动垃圾回收器的一跟踪策略。所述跟踪策略可为进行垃圾回收的遍数指定一老化阈值,在这些遍垃圾回收期间,如果所述存储器中的一对象实例没有被所述执行着的进程中的一个进程所访问,则认为所述存储器中的所述对象实例是一闲荡者。

应注意的是,所述存储器可以是通过一虚拟机管理的堆。而且,所述自动垃圾回收器可包括一标记和清扫垃圾回收器,该标记和清扫垃圾回收器已被修改以既管理与所述存储器中的对象实例相关的老化值,也将所述老化值与所述老化阈值相比较以确定闲荡者。最后,所述跟踪策略可包括对于当检测到一闲荡者时将采取的至少一动作的规定,以及免除标记对象实例为闲荡者所依据的一免除类列表。

一种用于检测和补救存储器泄露的方法包括为在存储器中创建的一对象实例建立一老化值,并且当该对象实例由一执行着的进程所引用时重置该老化值。比较起来,在一遍垃圾回收期间,如果该对象实例自从前一遍垃圾回收以来没有被一执行着的进程所引用,则可增加该老化值。重要的是,当该老化值超过一阈值时,可将该对象实例作为一闲荡者进行处理。在本发明的一优选方面,所述建立步骤包括在所述存储器中找到等价的对象实例;以及,将所述存储器中的所述等价的对象实例作为闲荡者进行处理。但是,当所述对象实例属于一指定的免除类时,可避免所述处理步骤。

所述处理步骤本身可包括清除存储器中的至少一个高速缓存,并在一日志文件中将所述对象实例报告为一闲荡者。具体地说,在前一情况下,当存储器使用接近其最大限度时,可解除引用在所述一个或多个高速缓存中的诸对象,以立即提供解救。为此,可建立诸高速缓存和诸对象池的一优先权列表,特别是在虚拟机的情况下。更具体地说,可以一属性文件的形式建立所述优先权列表。当堆使用接近其最大限度时,例如当存储器分配失败经常发生时,可基于在所述属性文件中提供的所述列表有选择地解除引用在高速缓存中的诸对象。

本发明的其他方面将部分地在以下说明中提出,并且部分地,将从该说明变得清楚起来,或者可通过实施本发明而获得了解。本发明的诸方面将通过在所附权利要求中特别指出的诸部件和组合来实现和达到。应当理解,以上一般说明和以下详细说明二者都只是示例性的和解释性的,而不是对如权利要求所主张的本发明的限制。

附图说明

纳入本说明书之中并构成其一部分的附图描绘了本发明的诸实施例,并与说明一起,用于解释本发明的原理。这里描绘的诸实施例在目前是优选的,然而应当理解,本发明并不限于所显示的精确安排和手段,其中:

图1是示出了在本技术领域中已知的“标记和清扫”垃圾回收过程的一流程图;

图2是示出了根据本发明的安排的一优选方面配置的一自动垃圾回收系统的一方框图。

图3A至3D,作为一整体,是示出了用于图2的系统的一自动垃圾回收过程的流程图。

具体实施方式

本发明是一种自动进行存储器泄露检测和补救的系统、方法和装置。根据本发明,可基于存储器中的由存储器中的其他活着的对象所引用、但没有其他用处的对象来识别存储器中的闲荡者。可根据一预定配置使对象免除补救过程。而且,一旦检测出闲荡者,可根据所述预定配置中的各条款,对它们采取可变的动作。这些动作可包括从在一堆转储(heap dump)中报告所述闲荡者到通过垃圾回收清除所述闲荡者。

图2是示出了根据本发明的安排的一优选方面配置的一自动垃圾回收系统的方框图。该系统可在其核心包括根据这里描述的本发明被编程的一自动垃圾回收过程300。所述自动垃圾回收过程300可被耦合到一跟踪策略310和存储器320(例如一虚拟机的堆)两者。所述存储器320可被配置为包括多个对象330。每个对象可与一老化值340和一存活值350相关联。所述老化值340可标明自从该对象330上次被引用以来,已发生了多少遍自动垃圾回收过程300。比较起来,所述存活值350可标明该对象330是否为存储器320中的另一个对象所引用。

所述跟踪策略310可规定由所述自动垃圾回收过程300所依赖的若干可变因素。例如,所述跟踪策略310可包括是否已启用或禁用本发明的所述泄露检测和补救过程的一指示390。例如,就本发明的过程可在虚拟机中的一应用程序的执行中产生延迟来说,当关心执行速度时,禁用所述自动垃圾回收过程可能是有利的。所述跟踪策略还可规定一再用阈值380,可认为已老化到超过该再用阈值380的一对象330是一闲荡者。

重要的是,当检测到一闲荡者时,该对象可能面临在所述跟踪策略310中规定的一系列补救动作370。所述动作370可包括从在一堆转储中报告所述闲荡者到通过从所述堆中清除所述对象来清除闲荡者。然而,并非所有闲荡者都需要面临补救动作,即使在对象已经老化到超过所述再用阈值380的情况下。具体说来,属于在所述跟踪策略中规定的一组免除类360中的一类的各对象可被免除补救动作。以这种方式,在软件开发过程中,当期望将在存储器中产生同一类的若干实例时,闲荡将不是一预先假设。

作为对图2的垃圾回收过程300的进一步描绘,图3A至3D作为一整体示出了用于图2的系统的一自动垃圾回收过程。首先从图3A开始,在通向判断块310的块305中,当已在存储器中生成一新对象实例时,可在块315重置一相关的老化值。此外,在判断块320,可确定已经存在于存储器中的其他诸对象实例是否等价于所述新对象实例。如果是这样,则在块325可将所述已经存在的诸对象实例标记为潜在的闲荡者,并根据在所述跟踪策略中推荐的动作对其按照闲荡者进行处理,然后本过程可在块330结束。

现在转向图3B,在通向判断块340的块335中,当位于存储器中的一对象实例已由一活动进程引用时,可在块345重置与所述对象实例相关的老化值,然后本过程可在块350结束。重要的是,在图3C所示出的核心垃圾回收过程中,可以查询在存储器中的每个对象实例的老化值,以识别在所述垃圾回收过程的很多运行周期中未曾被一活动进程所引用的那些对象实例。可认为那些被识别出的对象实例是闲荡者,并对其进行处理。

更具体地参照图3C,开始于块355,并进行到判断块360,在检测到一存储器分配失败后,在块365可分析堆中的第一个对象实例。具体地说,在判断块370,如果该对象实例可从根“达到”,这表明在存储器中的另一个对象实例维持着对该对象实例的一引用,则在块375,可将该对象实例标记为“活着的”。此外,在判断块380,可确定该对象实例是否是一免除类的成员,如果是这样,则不能把所述对象作为一闲荡者进行处理。如果不是,则可递增与所述对象相关的一老化值。

如果在判断块390在存储器中还有其他对象实例供分析,则在块395可获取堆中的下一个对象实例,并且本过程可重复块365至395。一旦在堆中不再有供分析的对象实例,则在块400可从堆中清除所有未被标记的对象,从而将相应的存储器返回到可分配状态。此外,在块405可处理是潜在闲荡者的各对象实例。

更具体地说,如图3D所示,开始于块410并进行至判断块420,可首先确定是否存储器已到达其最大限度,例如当发生了一存储器分配失败时的情况。如果没有达到,则本过程可在块470结束。否则,在块430,可选择所述属性文件中的第一个对象,并且在块440,可解除引用所选择的对象。在这方面,应认识到,当所选择的对象是一对象高速缓存时,那里包含的信息在性质上是冗余的,结果其解除引用的影响是微不足道的。随后,在判断块450,如果在所述属性文件中还有其他对象,则在块460可获取所述属性文件中的下一个对象,并且在块440,再次解除引用所选对象。本过程可继续进行,直到在所述属性文件中再没有对象供选择。随后,本过程可在块470结束。

本发明可在硬件、软件或硬件和软件的结合中实现。本发明的方法和系统的一种实施方式可以一集中方式在一个计算机系统中实现,或者以一分布方式实现,其中不同部件分布在若干个互连的计算机系统中。任何种类的计算机系统,或适应于完成这里描述的方法的其他装置,都适合于完成这里描述的功能。

硬件和软件的一种典型结合可以是带有一计算机程序的一通用计算机系统,当该计算机程序被载入和执行时,控制所述计算机系统,以使其执行这里描述的方法。本发明也可以被嵌入一计算机程序产品中,该计算机程序产品包括使能实施这里描述的方法的所有功能,并且当被载入一计算机系统中时能够执行这些方法。

在这里的上下文中,计算机程序或应用意味着以任何语言、代码或符号表示的、一组指令的任何表达式,该组指令旨在致使具有信息处理能力的一系统或者直接地或者在完成了以下步骤中的任何一个或二者之后执行一特定功能:a)转换成另一种语言、代码或符号;b)在一不同材料形式中复制。重要的是,本发明可以体现在其他特定形式中,而不脱离本发明的精神和本质特征,因此,当指出本发明的范围时,应当参照以下权利要求,而不是以上说明书。

去获取专利,查看全文>
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号