CN101615143A - 用于内存泄漏诊断的方法和装置 - Google Patents
用于内存泄漏诊断的方法和装置 Download PDFInfo
- Publication number
- CN101615143A CN101615143A CN200810131740A CN200810131740A CN101615143A CN 101615143 A CN101615143 A CN 101615143A CN 200810131740 A CN200810131740 A CN 200810131740A CN 200810131740 A CN200810131740 A CN 200810131740A CN 101615143 A CN101615143 A CN 101615143A
- Authority
- CN
- China
- Prior art keywords
- path
- dispense path
- dispense
- age
- algebraically
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
一种诊断内存泄露的方法和装置。所述方法包括:跟踪应用程序在虚拟机上运行过程中的对象分配,从而获取对象的分配路径和分配时间;记录每个对象的分配路径和分配时间;为每个对象赋予一个与一条分配路径相对应的唯一的ID;基于每个对象的与分配该对象的分配路径相对应ID,确定其每个对象所属的路径;针对每条分配路径整理由它分配的、并且还没有被回收的对象并根据这些对象的分配时间计算该路径所分配同一类对象的“年龄代数”;根据每条路径分配的、并且存活的同类对象的年龄代数对路径进行排序;以及对分配路径的排序数据进行分析,排序越高的分配路径,越有可能是引入内存泄漏。据此,可能存在内存泄漏的分配路径被挑选、报告给用户进行分析。本发明还涉及一种执行上述方法的装置。
Description
技术领域
本发明涉及一种用于垃圾收集语言的内存泄漏诊断的方法和装置。
背景技术
在一些编程语言以及相关的运行时间(runtime)中,通常会由应用程序本身提供一种内存管理功能。对于那不再被程序需要的内存是由程序设计员来释放。如果程序不能合理释放不同的内存将导致内存资源的浪费,即这些内存将不能被任何其他的程序使用。导致这种内存浪费的程序错误通常称之为“内存泄漏”。在有些编程语言中,会采用自动内存管理而不是依赖程序员释放内存。这种自动内存管理在本领域通常称之为“垃圾收集”,就是一种与编程语言以及其相关的运行时间的实施相关的运行时间系统的主动元件。这种自动内存管理通过自动释放那些不再为运行程序所引用的内存部分将程序员部分地从释放内存的管理工作中解脱出来。但是,自动内存管理会产生另一个问题,就是有些对象保留对部分内存中的数据结构的引用(reference),而这些数据结构在未来的应用程序执行中将不会被使用。这种引用会阻止自动垃圾收集器回收那些不再被使用的内存部分,也导致了“内存泄漏”。因此,尽管垃圾收集机制帮助减少了“内存泄漏”问题,但是后一种内存泄漏仍旧存在并导致计算机的性能降低,严重的时候会导致应用程序的运行占用所有的内存并导致计算机崩溃。因此,内存泄漏由于其对计算机的性能造成巨大影响而削弱了计算机的可获得性和安全性。
对于支持自动内存管理的运行时间中的内存泄漏,其主要以两类方式存在:一类是通过每次执行而快速地创建大量的泄漏或以至于为人所觉察的方式创建泄漏;另一类是通过每次执行而连续微妙地以至于无法察觉地创建泄漏。
如何发现和找到那些正在泄漏的对象以及快速找到泄漏的原因是本领域需要解决的问题。一个系统的泄漏诊断起来是非常复杂的,尤其是对于那些每次连续以及较小容量地发生的缓慢泄漏而言是如此。对于在堆上的不明显的增长是非常难以辨识的。通常,在发现泄漏时已经为时已晚,泄漏程序已经对整个系统造成了严重的影响。这对于那种开始很小但是在整个运行时间段内持续增长的泄漏而言尤其如此。有时,在问题大到足以可注意之前需要高达几周的服务时间。识别这些潜在泄漏是非常困难的,尤其是对于不能忍受多次堆(heap)访问甚至堆转储(dump)的在线系统(live productive system)而言是如此,因为这些系统不能忍受由于堆操作需要的执行暂停。尽管现在存在各种垃圾回收方式并且也各有益处,但是这种内存泄漏对于Java程序而言依然是一个问题。
目前,现有的一些技术有助于用户对黑箱进行研究以便确定在运行时间(runtime)处的根本原因。对诊断内存泄漏,现有技术主要依赖于比较区分堆快照(snapshot)(堆快照是一种由像节点一样的类型以及其间的引用构成的图(graph))以及根据对象数量的增长来进行诊断。这些技术在每轮垃圾收集之后监视堆,并且观察自由空间的向下的锯齿图形(内存的使用率曲线图)直到程序无法在从堆上获得空间为止(每次收集的、可供以后使用的内存越来越少)。这种现有的技术并不能用于在线系统,因为这种堆快照的获取和分析会使得具有较大的堆容量的系统暂停几十秒。对于诸如服务器的在线系统而言,这种延迟或暂停会导致超时,从而显著影响在线应用的表现。基于上述原因,这种延迟和暂停对于在线系统而言是完全不可接受的。
而且,用于大型应用程序的内存堆往往容量巨大,因此,试图对堆快照进行频繁的比较对这些应用程序的诊断帮助有限,因为泄漏对象并不明显,但是如果利用现有技术进行泄漏诊断,应用程序会由于为进行泄漏诊断而频繁进行堆快照的比较操作而减慢,这将对服务质量以及用户的体验带来负面的效果。而且,这些技术在有些情况下将使得正在运行的应用程序或系统受到很大干扰(perturb)以至于不具有实际价值,尤其是在在线环境下。
现有的内存泄漏的诊断方法对工业应用的效果有限,因为这些现有的方法通常将基本类型识别为嫌疑类型。例如,一种现有技术建议使用引用(reference)来查找负责内存泄漏的有用对象。但是引用不能包含执行语境信息。被引用的嫌疑对象因为是基本的常见使用类型,可能同时被多个引用者持有。在这种情况下,人们依然不了解这些引用为什么会产生以及在何种条件下泄漏问题会被再现。诊断以及修复是否正确难以进行判别。
在目前的实践中,一方面,依赖多次取得全引用图快照并对其进行引用分析对于大规模在线系统而言成本过于昂贵。另一方面,在发明人的经验中,为了诊断内存泄漏,用户必须寻找可能具有问题的候选数据结构。但是,发现将要关注的正好的数据结构非常困难。当探寻服务(尤其是大型在线系统)的引用图时,噪声、复杂性以及规模问题会使得引用图的分析非常困难。当在长时间运行的系统中诊断缓慢的内存泄漏时,噪声可能是一个特别的问题。噪声影响可能会矮化诊断缓慢泄漏所需的证据直到其运行了很久之后为止。
概括而言,现有技术方案主要集中在以下几点:反复访问堆甚至进行堆转储来产生堆快照、在不同的快照之间进行比较以便找到作为泄漏候选的增长节点、找到嫌疑结构、以及分析引用图从而找到造成内存被不当持有的引用者以便随后进行确认。因此,目前针对内存泄漏路径所采取的方法通常包括两个步骤:诊断并确认诊断以及修复泄漏点。但是在诊断和确认诊断之间存在断层(gap),现有技术在内存泄漏诊断方面所能提供的帮助有限。
根据以上描述可知,现有的内存泄漏诊断技术存在以下技术问题:
1.效率低下。现有的途径需要用户手动将这些高速缓存对象与真正的泄漏对象区分开。总体而言,这些途径使得用户忙于应付关于所创建的各个对象的众多低水平的细节,普通用户很难解释复杂引用图以获得相关问题执行环境。这些解释处理需要大量的专门知识。即使对于专家而言,这也通常需要进行很长时间的分析工作来发现泄漏的根本原因。
2.堆访问会对所运行的系统造成的干扰(perturbation)。这些技术在有些情况下将使得运行的系统不稳定以至于不具有实际价值,尤其是在在线境下。获取引用图后需要对堆快照执行比较分析,这些工作甚至可以造成具有较大堆尺寸的系统暂停几十秒。如前所述,对于服务器而言,这些延迟或暂停会导致超时(timeout),并且显著地改变系统的特性。
3.基于堆增长进行泄漏分析受到限制。现有的一些工具利用堆的增长和对堆进行区分来发现内存泄漏,以便发现使得堆增长的对象。尽管堆增长是有助于判别的有用的参数,但是仅仅使用增长作为一种启发来发现泄漏依然存在许多问题。毕竟,增长的对象或类型并不一定就是泄漏并且泄漏也并不一定就会增长。
4.基于引用进行的泄漏分析受到限制。仅仅知晓占支配地位的泄漏对象的类型,通常是诸如“串型”的低级类型,对解释为什么会发生内存泄漏的帮助有限,这是因为这些串可能被用于多个语境中,甚至可能在相同的数据结构(例如DOM文件)中被用于多种用途。此外由于一个低级泄漏对象可能同时被多个引用者不当持有,因此很容易在分析引用图、提取泄漏的原因时导致迷失。单一的DOM对象包含有成千上万个对象,并且在其间存在丰富的引用网络。如果对架构的实施不了解,就很难获知要遵循引用路径中的那个路径、获知何时分析分配调用路径、或者哪个调用位置是重要的。
5.基于类型分配堆栈进行的泄漏分析受到限制。有些方法能够通过监视堆而同时记录每一个类型对象的分配堆栈,但并不是嫌疑类型的所有实例正在泄漏,因此实际泄漏路径趋向被淹没在所有堆栈之间,并且存储和分析这些堆栈需要付出运行时间和运行空间的代价。通常,泄漏位置不是与分配位置映射,而是与分配函数的调用者相映射。例如,Java数据库连接(JDBC)通过由一个类调用的一个代理类被反复地创建,所述调用的类会忘记调用该代理类的JDBC释放函数。这样,就必须对调用者进行分析。
综上可见,现有技术现需要进行复杂图分析以及丰富的程序知识,为泄漏的确认以及修复提供有限的线索。
本申请的目的在于解决现有技术中存在的上述技术问题。
发明内容
发明人注意到,现有的方法主要集中在内存泄漏的查找,但是很少关注与泄漏问题直接相关的分配路径的认识。辨识其上可能发生泄漏的分配路径能够直接获得与泄漏分析相关的信息,指引用户跟踪嫌疑对象分配和使用。
基于以上认识以及为了避免上述现有技术的缺点,本发明提供了一种能够用于活动系统的内存泄漏诊断装置和方法。
根据本发明的一个方面,提供了一种用于诊断内存泄露的方法,包括:跟踪应用程序在虚拟机上运行过程中的对象分配,从而获取并记录对象的分配路径和分配时间;以预定的时间间隔计算每一类对象在其分配路径的年龄代数;以及将其上具有高年龄代数对象的分配路径确定为可能存在内存泄漏的分配路径,并报告给用户以进行分析。
根据本发明的另一个方面,提供了一种诊断内存泄漏的装置,包括:
对象分配跟踪器件,跟踪应用程序在虚拟机上运行过程中的对象分配,从而获取并记录对象的分配路径和分配时间;分配路径记录器件,用于记录从对象分配跟踪器件传送来的每个对象的分配路径和分配时间;用于应用程序的堆,用于存储从分配路径记录器件传送来的路径分配的对象信息;分配路径读取器件,用于读取所述堆中路径分配的对象信息,并扫描存储器中存储的每个对象的id以及对应的分配路径信息,以便针对每条分配路径整理由它分配的、并且还没有被回收的对象并根据每个对象的分配时间计算该路径所分配同一类对象的年龄代数;分配路径排序器件,用于根据每条路径分配的、并且存活的对象的年龄代数把路径排序;以及诊断报告器件,用于对从分配路径排序器传送来的分配路径的排序数据进行分析,并将高排序的分配路径确定为可能存在内存泄漏的分配路径报告给用户以进行分析。
根据本发明的另一个方面,还提供一种用于诊断内存泄漏的装置,包括:
对象分配跟踪器件,用于跟踪应用程序在虚拟机上运行过程中的对象分配,从而获取对象的分配路径和分配时间;分配路径记录器件,用于在每个所分配的对象上打上包含其分配路径与分配对象的对应关系的标签;用于应用程序的堆,用于存储从分配路径记录器件传送来的路径分配的对象信息;分配路径读取器件,对每条分配路径直接按照标签从所述堆中读取由它分配的、并且还没有被回收的对象,并根据每个对象的分配时间计算该路径所分配同一类对象的年龄代数;分配路径排序器件,用于根据每条路径分配的、并且存活的对象的年龄代数把路径排序;以及诊断报告器件,用于对从分配路径排序器传送来的分配路径的排序数据进行分析,并将高排序的分配路径确定为可能存在内存泄漏的分配路径报告给用户进行分析。
附图说明
下面参照附图仅作为示例详细描述本发明的实施例,其中:
图1表示在执行应用程序的过程中用于管理所分配对象的信息的数据结构;
图2所示的是本发明所使用的标签的结构的示意图。;
图3所示的是在不同波段上的同类对象之间的调用关系的示意图;
图4所示的是提取每个对象的分配路径以及将所述分配路径与具体对象进行绑定的过程示意图;
图5所示的是不同位置层级的结构以及进行对象聚合的示意图。
图6所示的是诊断一个应用程序所造成的内存泄漏的流程图
图7所示的是用于诊断内存泄漏的装置的一个实施例。
图8所示的是用于诊断内存泄漏的装置的另一个实施例。
具体实施方式
现在将参考本发明的示例性实施例进行详细的描述,在附图中图解说明了所述实施例的示例,其中相同的参考数字始终指示相同的元件。应当理解,本发明并不限于所公开的示例实施例。还应当理解,并非所述方法和设备的每个特征对于实施任一权利要求所要求保护的本发明都是必要的。此外,在整个公开中,当显示或描述处理或方法时,方法的步骤可以以任何顺序或者同时执行,除非从上下文中能清楚一个步骤依赖于先执行的另一步骤。此外,步骤之间可以有显著的时间间隔。
申请人发现,泄漏的对象通常属于一种类型,并且该类型的实例在不同的间隔期间被连续地生成、分配。考虑到这种情形,在本发明的方法中,首先辨识与这种分配一致的类的类型。随后,找到创建该类型的实例的路径。本发明关注在每一个相对较长的间隔中连续创建的同一类对象。为了实现本发明的目的,本发明提出了一种数据结构对同一类型的对象分配进行跟踪,如图1所示。每种面向对象的应用程序都包含有不同类型的对象。针对每种类型的对象,都构建一种便于记录其分配路径的列表。这种数据结构中包含了类的签名、对象计数、时间计数器以及分配路径(一个对象的分配路径是其分配时刻的堆栈映象)。通过这种数据结构对对象的分配进行管理。
参见图1,针对同一种类型的对象,在应用程序的过程中可能在不同的路径上被分配。因此根据图1所示的数据结构,针对每条分配路径进行跟踪,利用计数器记录在该路径上分配的对象数量,当分配数量超过一定规模的时候在计时器中记录相应的时刻。换句话说,计时器中记录了分配数量连续到达制定规模的时间间隔长度。。对所述的对象的分配信息的跟踪,可以通过后面将结合图6和7所详细描述的对象分配跟踪器件61来进行。对于所跟踪获得这种对象的信息,可以由将结合图6和7所详细描述的分配路径记录器件62记录起来并存储到相应的存储器63中或直接发送到应用程序的堆中。
对于所记录的具有上述数据结构的对象信息,可以采用专门的分配路径管理器件来进行管理,也可以在直接将相关的对象信息发送到堆之前对每个所分配的对象打上独特的标签,以便将每个对象(即使是相同类的对象)区分开来。图2所示的就是本发明可以使用的这种标签的形式。针对每个所分配的对象的一个标签包括了多个字段。就本发明所示的图2中的实施例而言,所述标签结构中的第一字段是该对象的标识符字段id,其表示了该对象属于哪个波段(band)以及那个组(group),俩者的组合唯一的标志了该对象所处的“年龄代数”,其中对象的年龄是指从其被分配一直到被释放的时间,其年龄代数可以用该对象自分配起直到被回收所经历的“垃圾回收”次数或者该对象存在时间相对于某一预定时间阈值的倍数。在这里,默认每一次垃圾回收都会检索所有在堆中分配内存的对象。第二字段表示类字段,表示该对象属于那个类,例如图1中所示的类1、类2、类3......等。第三字段属于路径字段,表述该对象位于图1中所示的哪个路径上。第四字段是方法字段,该方法字段并不是一种方法签名的真实内容,而是一个地址,指向方法签名的实际存贮。最后一个字段是被调用者字段,被用来寻找分配的路径。该字段与第四个字段结合,可以恢复出分配指定对象的路径内容。图3就表示出了如何基于不同年龄代数的对象标签,从调用关系字段和方法字段恢复出基本的路径信息。
下面,本发明将参照图4对本发明如何跟踪对象分配以及分配路径以及如何在分配过程中计数进行详细的描述。
图4所示的是提取每个对象的分配路径以及将所述分配路径与具体对象进行绑定标签的过程示意图。在应用程序运行时,对象的分配被跟踪。对于类型i的对象,当该对象的总数达到阈值Nt时记录时间Ti,同时将该计数器值重置为0。当该对象的总数再次达到阈值Nt时记录时间Ti+1。如果Ti和Ti+1之间的差值超过阈值Tt时,该类型i就被识别需要进行下一阶段的跟踪记录过程,如果类型i进入下一阶段的记录过程,分配i对象的路径将被记录下来以及在该路径上分配i类型对象的总数也被记录。对于由路径Pi所分配的类型i的对象,在Pi上的当前层级(tier,层级代表分配研究对象的堆栈位置,因为堆栈是分层结构的,所以使用层级来标志堆栈中的位置),在本发明中也称之为波段(band),的位置被标签到对象上。如果Ti和Ti+1之间的差值小于阈值Tt时,类型i的计数不变,随着新实例的分配而增加。当对象的总数在时间Tj+1处再次达到阈值Nt时其数量并且Tj和Tj+1之间的差值超过阈值Tt时,该数量被重置为0,并且采用Tj+1的值替代Tj,并且增加Pi上的层级,以便后面分配的对象将采用下一等级的位置来标签。如此对Pi上的的每个等级的位置逐步地执行相同的处理和判断,以便这些等级将被标签在对象上。
阈值Tt选择对于在服务期间辨识寿命(lifetime)分布是非常有帮助的。该默认值被设定为平均GC(垃圾收集)间隔。Nt的选择被用于安排对象分配的规模或度量(scale),这有助于发现用于相对频繁地分配一种类型对象的路径。这种相对频繁地分配一种类型的对象的分配路径很可能与持续泄漏相关。当属于一种类型的对象被分配的总数超过阈值Nt时,这种类型的对象被辨识出来并且其分配路径必须予以重视。当在固定路径中分配的对象的数量超过阈值Nt时,该路径被辨识出来并通过将其自身与所创建的实例绑定起来而被记录。如果达到伐值的时间太短(<Tt),绑定到对象上的标签不变。如果时间足够长(>=Tt),新的标签将被给予被分配的对象。这种绑定间隔导致标记不同频带id和组id的组合的对象之间的分配时间至少长于Tt。换句话说,组id和频带id的组合唯一的标记了不同年龄代数的对象。这种标记方式直接有助于在堆访问的同时进行泄漏诊断,并输出泄漏对象以及直接相关的泄漏路径。
为了区分不同位置的层级(一个位置的层级表示其位于整个分配路径上的层级号)根据在该分配路径上的不同帧的深度(depth)而给予不同的频带。例如,频带0被赋予位于分配路径的顶部的分配位置,该位置直接创建对象,而频带1则赋予调用频带0的位置的分配位置。这样对诊断泄漏对象以及跟踪对象标签的分配路径非常有用,该对象标签将在下面两部分中引入。组id被引入以防频带的值满溢:当频带代表的层级数超过分配路径的最大深度时,组id从0开始自增。频带值每满溢一次,组id自增1。组id和频带id的组合对于后面的诊断非常重要。图5所示的就是这种层级的示意图。
下面所示的程序代码表示出了本发明是如何基于图1中所示的结构来跟踪管理对象的分配的,也是对上面的具体描述的一种程序表示。该程序代码在java对象被分配时被调用。
New_object ()
{
/*Get class signature of the object′s class.*/
classSignature=GetClassSignature();
/*Find the class index in hashTable,if it′s not exist,put it into hashTable.*/
classIndex=getAndPutClass(classSignature);
/*Increase the object count of this class.*/
countClass( );
/*If count of this class>Nt,count this ojbect to it′s allocation path.*/
if(objectCount>Nt){
/*Find allocation path in this class structure,if it′s not exist,put it
into hashTable.*/
getAndPutAllocationPath();
/*Tag this object with allocation path′s band,class index,method of the
allocation path′s band and its callee.*/
tagObject(allocPathBand,classIndex,methodOfBand,callee);
/*Increase the object count of this allocation path of this class.*/
countAllocPath();
/*If the allocation path count>Nt and time since last change of allocation
path′s band larger than Tt,then increase band of the allocation path,and reset
its count,and update lastChangeTime*/
if(countOfAllocPath>Nt && time_interval>Tt)
moveToNextBand();
}}
以上对对象的分配的跟踪和记录进行详细的描述。这种对各种类型的对象的分配的跟踪和记录是为了便于在进行诊断时发现泄漏对象以及发生泄漏的路径。在进行诊断的时候,发现泄漏类以及泄漏的路径是同时进行的,而不是分步进行的。基于对对象分配的跟踪和记录,下面描述泄漏的诊断。
在进行诊断之前,需要对应用程序的虚拟机的堆进行访问。经过多次垃圾回收当前堆中仅保存有存活的对象信息。就本发明而言,包含有所分配对象的类型、分配时间、分配路径等信息。这些信息可以以上述与对象绑定的标签的形式存在,也可以其他形式存在,例如可以专门设立一种分配路径管理器将按来管理每个对象的分配时间以及分配路径直接的对应关系。
总体而言,首先,将标签中基于频带id和组id的组合相同的对象聚合(aggregate)成一组。接着从具有最高频带的对象从其标签的最后俩个字段中恢复出这些对象的分配路径。用这种方式找到的组数就是该路径分配对象的年龄跨度或者年龄代数。获取该路径中的对象分配跨度或代数(span)以便用于诊断泄漏。采用这种方式,可同时找出泄漏对象以及泄漏路径。
在较长的运行时间期间,泄漏导致在堆上具有不同年龄的相同类型的对象的存在。对象的寿命是其幸免的垃圾回收的次数。该跨度计数是一种类型的所有实例的不同寿命的数量或者代数。较低的跨度计数表示一类的所有实例在存储器内已经存在了相同的时间。较高的跨度计数表示该运行的应用程序正继续分配同一类新对象而没释放其更老的对象,程序通常不倾向于间隔地分配长时间存活的对象。相反,他们倾向于集中性地分配长时间存活的对象,或者分配对象只是为了在随后很短一段时间使用,这些对象随后一旦其不再被需要就会立刻被清除。
基于以上理论,存活对象通过其标签被汇总以便诊断泄漏问题。如在前面所提到的那样,一个标签包括与分配路径上的层级相关的位置的频带id以及与将路径标签到对象上的满溢次数(round)相关的组id。每一次垃圾收集都会清除清除堆上那些不被引用的、“死亡”的对象。如上面所提到的那样,频带id以及组id的组合在不同时间间隔(至少间隔Tt)期间被绑定。时间Tt与垃圾回收的时间间隔相关,能够用于标识对象的年龄。这样,标签中不同频带id以及组id的组合区分了不同年龄的对象。基于以上分析,所有标签中拥有相同的频带id以及组id组合的对象被分到一组,这样被一条分配路径分配的对象被分到若干组内。分组的数量决定了该路径分配的对象的年龄代数。分配最大年龄代数的对象的那些路径被辨识为候选泄漏路径。具有这些候选路径标签的对象就是泄漏实例。图5所示的是该聚合的处理过程。
在进行聚合以及获知了哪些是嫌疑泄漏类之后,需要采用与将标签路径绑定到对象上的处理相反的处理来确定分配中哪些是泄漏哪些不是泄漏,因为分配位置以及分配路径具体内容对于诊断和修复泄漏来说是有很大帮助的,因此遍历整个路径是必须的。为了解决这个问题,就要进行与将标签路径绑定到对象上的处理相反的处理,从标签中恢复出确切的泄漏路径。该恢复过程可见图3所示。从类型i的对象的最高频带为K(K>=1)处的标签开始,标签的一个字段(field)是“callee(被调用者)”,其引用在频带(K-1)处的方法,被在频带K处的方法调用。这样迭代的恢复出原始分配路径的各层方法,所发现的方法链条就是分配路径。也就是说,路径的发现过程从最高波段开始进行。
图6所示的是诊断一个应用程序所造成的内存泄漏的流程图。首先运行一个应用程序,并在步骤S601处,一种如后面将要描述的内存泄漏诊断装置随着应用程序开始运行而开始监测在应用程序的运行时间(runtime)处对象的分配以及内存的分配。在步骤S602处,内存泄漏诊断装置中的对象分配跟踪器件跟踪应用程序在虚拟机上运行过程中的对象分配,并针对每一种类型的对象,获取该当前对象的类型以及所分配的堆栈,为所有堆栈编码唯一的id以及为每个对象赋予一个与一条分配路径相对应的唯一的id,并将这种对应关系存储起来。然后在步骤S603处,将其中包含了该对象的类型id、其堆栈的id、以及指向顶部方法签名的指针的标签与相应的对象绑定在一起。该顶部方法签名并不在寄存器中。所有的方法签名都被编码并保存在代理中,这种不同签名的系列表示了各种分配路径。因此,与对象绑定的标签包含了该对象的分配路径以及对象的类型。在步骤S604处,将所有对象的标签保存在一个列表中。具体而言,就是采用如后面所述的分配路径管理器件来管理该列表,从而管理列表中的标签中所包含的数据,即对象的类型id、其堆栈的id、以及指向顶部方法签名的指针。在步骤S605处,经过一个预订的时间间隔之后,例如经过了自动垃圾回收装置执行一次自动垃圾回收的预定间隔之后,用于由对象的类型id以及堆栈的id的id的寄存器被修改以便存储具有更高层级或波段的方法签名,从而使得以后所分配的对象与在该间隔之前所分配的对象具有不同的年龄代数。所述的时间间隔可以是预定时间间隔,例如垃圾回收间隔。所述寄存器的改变也可以通过具体的事件来触发。该具体的时间可以是具有特定类型和堆栈的对象的总量达到了用户根据其应用程序的存储器使用规模所规定的某种阈值,也可以是某种需要专门关注的事件。在步骤S606处,用户需要进行内存泄漏诊断时,通过后面将要描述的分配路径读取器件,从一个存储器中读取关于标签的列表以及位于堆中的存活的分配对象的信息。随后在步骤S607中,从所读取的标签列表中提取各个标签,并将所有存活的分配对象按照标签聚合曾不同的组。然后在步骤S608处,对每个具有相同标签的组中的对象的总量进行排序,并将那些排序高的组中的对象(即龄年代数较高的对象)所在的分配路径确定为嫌疑的内存泄漏路径。应当理解上述方法为本发明的优选实施例,并非所有步骤对于解决本发明所提出的问题都是必要,而且上述方法的步骤可以以任何顺序或者同时执行,除非从上下文中能清楚一个步骤依赖于先执行的另一步骤。此外,步骤之间可以有显著的时间间隔。
以上对本发明的内存泄漏的诊断方法进行了详细的描述。相对于现有技术而言,这些方法具有以下优点:用户无需制作引用图并对对象的引用图进行分析、通过将分配时间与分配路径与分配对象的绑定可以直接获得与泄漏嫌疑对象对应的分配路径、有助于修复泄漏,易于发现代码跟踪输入项以及找到被分配的对象是如何被使用的、尤其是可以同时发现泄漏的对象以及能够确定候选分配路径,并且该候选分配路径可以仅仅通过一次访问堆就可以实现。该方法有助于将用户从琐碎的中断和分析中解脱出来,防止系统进行多重堆访问或堆转储,因此缩短了诊断的时间。此外,本发明的方法不需要对现有的虚拟机进行任何修改、不需要对内部GC机制进行任何修改、不需要对事件监听的去分配(de-allocation)、甚至不需要考虑对象的移动。
图7是采用上述方法的装置的一个实施例。
如图7所示,根据本发明的诊断内存泄漏的装置700包括:对象分配跟踪器件701,用于跟踪应用程序708在虚拟机712上运行过程中的对象分配,从而获取对象的分配路径和分配时间;分配路径记录装置702,用于记录从对象分配跟踪器件701传送来的每个对象的分配路径和分配时间;存储器703,用于存储从分配路径记录器件702传送来的与对象相关的分配路径和分配时间;分配路径管理器件704,用于管理存储器中所存储的数据,以及为每个对象赋予一个与一条分配路径相对应的唯一的id并将这种对应关系以存储在存储器中;用于应用程序的堆709,用于存储从分配路径记录器件702传送来的分配对象的信息;分配路径读取器件705,用于读取所述堆中分配对象的信息,并扫描存储器中存储的每个对象的id以及对应的分配路径信息,以便针对每条分配路径整理由它分配的、并且还没有被回收的对象并根据每个对象的分配时间计算该路径所分配同一类对象的年龄代数;分配路径排序器件706,用于根据每条路径分配的、并且存活的对象的年龄代数对分配路径进行排序;以及诊断报告器件707,用于对从分配路径排序器件传送来的分配路径的排序数据进行分析,并将高排序的分配路径确定为可能存在内存泄漏的分配路径报告给用户进行分析。
图8是采用上述方法的装置的另一个实施例。
如图8所示,根据本发明的诊断内存泄漏的装置800包括:对象分配跟踪器件801,用于跟踪应用程序808在虚拟机812上运行过程中对象的分配,从而获取对象的分配路径和分配时间;分配路径记录装置802,用于在每个所分配的对象上打上包含其分配路径与分配时间的对应关系的标签;用于应用程序的堆809,用于存储从分配路径记录器件802传送来分配对象的信息;分配路径读取器件805,针对每条分配路径直接按照标签从所述堆中读取由它分配的、并且还没有被回收的对象并根据每个对象的分配时间计算该路径所分配同一类对象的年龄代数;分配路径排序器件806,用于根据每条路径分配的、并且存活的对象的年龄代数对分配路径进行排序;以及诊断报告器件807,用于对从分配路径排序器件806传送来的分配路径的排序数据进行分析,并将高排序的分配路径确定为可能存在内存泄漏的分配路径报告给用户进行分析。
对于上述诊断内存泄漏的装置700和800,其还可以包括对象寿命管理器件710以及810以及动态比特码器件711以及811。对象寿命管理器件710以及810用于按照对象分配时间来直接计算对象的年龄,避免直接将分配时间放入所述堆中。动态比特码器件711以及811可使用二进制代码注入的方法获取分配路径,替换直接读取运行时堆栈的内容以获取路径信息。
本发明的描述是为了示例说明的目的而提供的,而不旨在是彻底无遗漏的,或者局限于所公开的实施例。很多修改和变更对于本领域的普通技术人员将是清楚的。选择这些实施例是为了说明本发明的原理及其实际应用,并且使得本领域的其他普通技术人员能够理解本发明,以便实现可能适于其他预期用途的具有各种修改的各种实施例。
Claims (20)
1.一种诊断内存泄露的方法,包括:
跟踪应用程序在虚拟机上运行过程中的对象分配,从而获取并记录对象的分配路径和分配时间;
以预定的时间间隔计算每一类对象在其分配路径的年龄代数;以及
将其上具有高年龄代数对象的分配路径确定为可能存在内存泄漏的分配路径,并报告给用户以进行分析
2.如权利要求1所述的诊断内存泄露的方法,其中,所述预定的时间间隔是垃圾回收间隔或对应于特定类型和堆栈的对象的总量达到规定的阈值的时间。
3.如权利要求1或2所述的诊断内存泄露的方法,其中,获取并记录对象的分配路径和分配时间的步骤包括:为每个对象赋予一个与分配路径相对应的唯一的id。
4.如权利要求3所述的诊断内存泄露的方法,其中,以预定的时间间隔计算每一类对象在其分配路径其年龄代数的步骤包括:基于每个对象的与分配该对象的分配路径相对应id,确定其每个对象所属的分配路径,并针对每条分配路径整理由它分配的、并且还没有被回收的对象并根据每个对象的分配时间计算该路径所分配同一类对象的年龄代数。
5.如权利要求3所述的诊断内存泄露的方法,其中,将其上具有高年龄代数对象的分配路径确定为可能存在内存泄漏的分配路径的步骤包括:根据每条路径分配的、并且存活的同类对象的年龄代数对路径进行排序,以及对分配路径的排序数据进行分析,并将高排序的分配路径确定为可能存在内存泄漏的分配路径报告给用户进行分析。
6.如权利要求5所述的诊断内存泄露的方法,其中所述跟踪应用程序在虚拟机上运行过程中对象的分配采用一种数据结构来进行,该数据结构包含了对象所属类的签名、对象计数、时间计数以及分配路径。
7.如权利要求6所述的诊断内存泄露的方法,其中所述为每个对象赋予一个与一条分配路径相对应的唯一的id,包括将每个对象的与分配路径相关联的波段id以及组id包含在一种标签中并将标签与相应的对象绑定。
8.如权利要求7所述的诊断内存泄露的方法,其中所述标签中还可以包含关于对象的类型、路径、方法以及被调用者的信息。
9.如权利要求4所述的诊断内存泄露的方法,其中所述以预定的时间间隔计算每一类对象在其分配路径其年龄代数从对象所属的分配路径的最高波段id开始。
10.如权利要求4所述的方法,其中还包括在进行所述整理之前进行至少一次垃圾收集。
11.一种诊断内存泄漏的装置,包括:
对象分配跟踪器件,跟踪应用程序在虚拟机上运行过程中的对象分配,从而获取并记录对象的分配路径和分配时间;
分配路径记录器件,用于记录从对象分配跟踪器件传送来的每个对象的分配路径和分配时间;
用于应用程序的堆,用于存储从分配路径记录器件传送来的路径分配的对象信息;
分配路径读取器件,用于读取所述堆中路径分配的对象信息,并扫描存储器中存储的每个对象的id以及对应的分配路径信息,以便针对每条分配路径整理由它分配的、并且还没有被回收的对象并根据每个对象的分配时间计算该路径所分配同一类对象的年龄代数;
分配路径排序器件,用于根据每条路径分配的、并且存活的对象的年龄代数把路径排序;以及
诊断报告器件,用于对从分配路径排序器传送来的分配路径的排序数据进行分析,并将高排序的分配路径确定为可能存在内存泄漏的分配路径报告给用户以进行分析。
12.如权利要求11所述的诊断内存泄漏的装置,其中对象分配跟踪器件采用一种数据结构来进行对象分配的跟踪,该数据结构包含了对象所述的类的签名、对象计数、时间计数以及分配路径。
13.如权利要求11或12所述的诊断内存泄露的装置,其还包括对象寿命管理器件用于按照对象分配时间来直接计算对象的年龄,避免直接将分配时间放入所述堆中。
14.如权利要求11所述的诊断内存泄露的装置,其还包括动态调码器,其可使用二进制代码注入的方法获取分配路径,替换直接读取运行时堆栈的内容以获取路径信息。
15.一种用于诊断内存泄漏的装置,包括:
对象分配跟踪器件,用于跟踪应用程序在虚拟机上运行过程中的对象分配,从而获取对象的分配路径和分配时间;
分配路径记录器件,用于在每个所分配的对象上打上包含其分配路径与分配对象的对应关系的标签;
用于应用程序的堆,用于存储从分配路径记录器件传送来的路径分配的对象信息;
分配路径读取器件,对每条分配路径直接按照标签从所述堆中读取由它分配的、并且还没有被回收的对象,并根据每个对象的分配时间计算该路径所分配同一类对象的年龄代数;
分配路径排序器件,用于根据每条路径分配的、并且存活的对象的年龄代数把路径排序;以及
诊断报告器件,用于对从分配路径排序器传送来的分配路径的排序数据进行分析,并将高排序的分配路径确定为可能存在内存泄漏的分配路径报告给用户进行分析。
16.如权利要求15所述的诊断内存泄漏的装置,其中对象分配跟踪器件采用一种数据结构来进行对象分配的跟踪,该数据结构包含了对象所述的类的签名、对象计数、时间计数以及分配路径。
17.如权利要求15所述的诊断内存泄露的装置,其中所述分配路径记录器件通过将标签与相应的对象绑定来记录与分配对象相关的信息。
18.如权利要求17所述的诊断内存泄露的装置,其中所述标签中还可以包含关于对象的类型、路径、方法以及被调用者的信息。
19.如权利要求15-19任意一项所述的诊断内存泄露的装置,其还包括对象寿命管理器件用于按照对象分配时间来直接计算对象的年龄,避免直接将分配时间放入所述对象标签中。
20.如权利要求19所述的诊断内存泄露的装置,其还包括动态变码器,其可使用二进制代码注入的方法获取分配路径,替换直接读取运行时堆栈的内容以获取路径信息。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200810131740.3A CN101615143B (zh) | 2008-06-27 | 2008-06-27 | 用于内存泄漏诊断的方法和装置 |
US12/491,877 US8429620B2 (en) | 2008-06-27 | 2009-06-25 | Memory leak diagnosis |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200810131740.3A CN101615143B (zh) | 2008-06-27 | 2008-06-27 | 用于内存泄漏诊断的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101615143A true CN101615143A (zh) | 2009-12-30 |
CN101615143B CN101615143B (zh) | 2013-04-17 |
Family
ID=41449204
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200810131740.3A Expired - Fee Related CN101615143B (zh) | 2008-06-27 | 2008-06-27 | 用于内存泄漏诊断的方法和装置 |
Country Status (2)
Country | Link |
---|---|
US (1) | US8429620B2 (zh) |
CN (1) | CN101615143B (zh) |
Cited By (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102985910A (zh) * | 2010-03-02 | 2013-03-20 | 超威半导体公司 | 对无用存储单元收集的gpu支持 |
CN103123604A (zh) * | 2011-11-18 | 2013-05-29 | 苹果公司 | 跟踪数据处理系统的内存使用的方法 |
CN103838633A (zh) * | 2012-11-20 | 2014-06-04 | 国际商业机器公司 | 在动态虚拟机存储器调整中避免内存不足 |
CN104461915A (zh) * | 2014-11-17 | 2015-03-25 | 苏州阔地网络科技有限公司 | 一种在线课堂系统中内存动态分配方法及设备 |
CN104778087A (zh) * | 2014-01-09 | 2015-07-15 | 中国移动通信集团山东有限公司 | 一种信息处理方法以及信息处理装置 |
CN106095689A (zh) * | 2016-06-24 | 2016-11-09 | 北京奇虎科技有限公司 | 一种应用内存泄露的检测方法和装置 |
CN106383743A (zh) * | 2016-09-27 | 2017-02-08 | 腾讯科技(深圳)有限公司 | 业务处理方法及系统 |
CN106886474A (zh) * | 2015-12-16 | 2017-06-23 | 塔塔顾问服务有限公司 | 用于存储器嫌疑检测的方法和系统 |
US9846601B2 (en) | 2013-05-21 | 2017-12-19 | Huawei Technologies Co., Ltd. | Method and apparatuses for determining a leak of resource and predicting usage of resource |
CN107783908A (zh) * | 2017-11-07 | 2018-03-09 | 晶晨半导体(上海)股份有限公司 | 一种基于Linux内核内存泄露的检测方法 |
CN107797901A (zh) * | 2017-10-25 | 2018-03-13 | 四川长虹电器股份有限公司 | 一种堆栈分析以及邮件实时报警的实现方法 |
CN108073439A (zh) * | 2016-11-11 | 2018-05-25 | 深圳业拓讯通信科技有限公司 | 一种jvm内存泄露自动检测方法以及系统 |
US10289472B2 (en) | 2014-08-26 | 2019-05-14 | Huawei Technologies Co., Ltd. | Resource leak detection method, apparatus, and system |
CN110083450A (zh) * | 2019-04-09 | 2019-08-02 | Oppo广东移动通信有限公司 | 内存回收方法、装置、电子设备及存储介质 |
CN111274057A (zh) * | 2020-01-13 | 2020-06-12 | 北京字节跳动网络技术有限公司 | 一种内存泄露链路的处理方法、装置、介质和电子设备 |
CN112100022A (zh) * | 2020-08-14 | 2020-12-18 | 北京航空航天大学 | 一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法 |
CN112463626A (zh) * | 2020-12-10 | 2021-03-09 | 网易(杭州)网络有限公司 | 内存泄漏定位方法、装置、计算机设备及存储介质 |
CN113297074A (zh) * | 2021-05-21 | 2021-08-24 | 百果园技术(新加坡)有限公司 | 一种内存跟踪方法及装置 |
CN113419893A (zh) * | 2021-07-19 | 2021-09-21 | 网易(杭州)网络有限公司 | 内存泄漏查证方法、装置、电子设备和存储介质 |
WO2023284793A1 (zh) * | 2021-07-16 | 2023-01-19 | 维沃移动通信有限公司 | 内存泄露处理方法、装置和电子设备 |
Families Citing this family (32)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7293263B2 (en) * | 2002-12-20 | 2007-11-06 | Bea Systems, Inc. | System and method for memory leak detection in a virtual machine environment |
JP4512402B2 (ja) * | 2004-04-12 | 2010-07-28 | 株式会社日立製作所 | メモリリークの原因箇所検出方法、及びその実行プログラム |
US8522216B2 (en) | 2010-05-04 | 2013-08-27 | Oracle International Corporation | Memory leak detection |
US8504878B2 (en) * | 2010-05-04 | 2013-08-06 | Oracle International Corporation | Statistical analysis of heap dynamics for memory leak investigations |
CN101908984A (zh) * | 2010-06-30 | 2010-12-08 | 杭州华三通信技术有限公司 | 一种内存的故障检测方法和单板 |
CN102722432B (zh) * | 2011-03-29 | 2016-02-24 | 国际商业机器公司 | 追踪内存访问的方法和装置 |
US8918616B2 (en) | 2011-08-24 | 2014-12-23 | Microsoft Corporation | Memory allocation analysis |
US9141510B2 (en) * | 2011-08-24 | 2015-09-22 | Microsoft Technology Licensing, Llc | Memory allocation tracking |
US8881107B2 (en) * | 2011-08-24 | 2014-11-04 | Microsoft Corporation | Automatic memory leak detection |
US8566559B2 (en) | 2011-10-10 | 2013-10-22 | Microsoft Corporation | Runtime type identification of native heap allocations |
CN102662866B (zh) * | 2012-04-09 | 2015-03-25 | 华为软件技术有限公司 | 一种文件cache管理方法及内存管理系统 |
CN102681938B (zh) * | 2012-05-15 | 2015-02-18 | 青岛海信移动通信技术股份有限公司 | 一种内存泄漏检测方法及装置 |
CN102929699B (zh) * | 2012-10-10 | 2015-06-10 | 武汉钢铁(集团)公司 | 一种Java虚拟机的垃圾回收方法及其监测系统 |
US8966455B2 (en) * | 2012-12-31 | 2015-02-24 | International Business Machines Corporation | Flow analysis in program execution |
US9003233B2 (en) * | 2012-12-31 | 2015-04-07 | Bmc Software, Inc. | Memory leak detection |
US9164872B2 (en) * | 2013-05-22 | 2015-10-20 | Sap Se | Tracking of program objects during request processing |
US9183116B1 (en) | 2014-04-23 | 2015-11-10 | Microsoft Technology Licensing, Llc | Call chain interval resource impact aggregation differencing |
CN103984898B (zh) * | 2014-05-29 | 2017-02-01 | 北京神州绿盟信息安全科技股份有限公司 | 一种喷射模式攻击的检测方法和装置 |
CN104050044A (zh) * | 2014-06-19 | 2014-09-17 | 宇龙计算机通信科技(深圳)有限公司 | 一种终端、一种释放内存的方法及装置 |
DE112014007090T5 (de) | 2014-10-24 | 2017-07-13 | Google Inc. | Verfahren und systeme zum automatischen tagging anhand von software-ausführungs-traces |
US9886665B2 (en) * | 2014-12-08 | 2018-02-06 | International Business Machines Corporation | Event detection using roles and relationships of entities |
US9734204B2 (en) | 2014-12-11 | 2017-08-15 | International Business Machines Corporation | Managed runtime cache analysis |
US9940234B2 (en) * | 2015-03-26 | 2018-04-10 | Pure Storage, Inc. | Aggressive data deduplication using lazy garbage collection |
US9760464B1 (en) * | 2015-03-27 | 2017-09-12 | Amazon Technologies, Inc. | Memory leak detection |
US9824005B1 (en) | 2015-03-27 | 2017-11-21 | Amazon Technologies, Inc. | Process level memory allocation by memory type |
US10091076B2 (en) | 2015-08-25 | 2018-10-02 | Google Llc | Systems and methods for configuring a resource for network traffic analysis |
US10635570B2 (en) * | 2017-09-29 | 2020-04-28 | Oracle International Corporation | Memory leak profiling events |
CN108182146B (zh) * | 2017-12-27 | 2021-08-24 | 北京奇艺世纪科技有限公司 | 一种内存泄漏的检测方法及系统 |
CN110134611B (zh) * | 2019-05-20 | 2021-06-25 | 腾讯科技(深圳)有限公司 | 内存泄漏分析方法、装置、终端和存储介质 |
CN111352734A (zh) * | 2020-02-26 | 2020-06-30 | 烽火通信科技股份有限公司 | 一种内存泄漏检测方法及内存管理模块 |
US20220283864A1 (en) * | 2021-03-04 | 2022-09-08 | Microsoft Technology Licensing, Llc | Advanced memory tracking for kernel mode drivers |
US11755473B2 (en) * | 2022-01-03 | 2023-09-12 | Samsung Electronics Co., Ltd. | Method and system for managing memory leaks in a linear memory model |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
AU2423092A (en) | 1991-08-08 | 1993-03-02 | Pure Software, Inc. | Method and apparatus for identifying memory leaks and tracking pointers in a computer program |
US6167535A (en) * | 1997-12-09 | 2000-12-26 | Sun Microsystems, Inc. | Object heap analysis techniques for discovering memory leaks and other run-time information |
CN1248114C (zh) * | 2002-06-20 | 2006-03-29 | 华为技术有限公司 | 一种软件内存泄露的检查方法 |
US7178134B2 (en) * | 2003-04-24 | 2007-02-13 | International Business Machines Corporation | Method and apparatus for resolving memory allocation trace data in a computer system |
US7194664B1 (en) * | 2003-09-08 | 2007-03-20 | Poon Fung | Method for tracing application execution path in a distributed data processing system |
US20050071387A1 (en) * | 2003-09-29 | 2005-03-31 | International Business Machines Corporation | Automated scalable and adaptive system for memory analysis via the discovery of co-evolving regions |
US7257692B2 (en) | 2003-10-01 | 2007-08-14 | Lakeside Software, Inc. | Apparatus and method for detecting memory leaks |
US7587709B2 (en) * | 2003-10-24 | 2009-09-08 | Microsoft Corporation | Adaptive instrumentation runtime monitoring and analysis |
US7577943B2 (en) * | 2003-10-24 | 2009-08-18 | Microsoft Corporation | Statistical memory leak detection |
US7200731B2 (en) | 2004-04-23 | 2007-04-03 | Alcatel Ip Networks, Inc. | Memory leak detection |
CN100389403C (zh) * | 2005-04-07 | 2008-05-21 | 华为技术有限公司 | 内存泄漏检测及恢复的方法 |
US7765528B2 (en) * | 2005-09-21 | 2010-07-27 | Hewlett-Packard Development Company, L.P. | Identifying sources of memory retention |
-
2008
- 2008-06-27 CN CN200810131740.3A patent/CN101615143B/zh not_active Expired - Fee Related
-
2009
- 2009-06-25 US US12/491,877 patent/US8429620B2/en not_active Expired - Fee Related
Cited By (29)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102985910A (zh) * | 2010-03-02 | 2013-03-20 | 超威半导体公司 | 对无用存储单元收集的gpu支持 |
CN102985910B (zh) * | 2010-03-02 | 2016-04-13 | 超威半导体公司 | 对无用存储单元收集的系统和方法 |
CN103123604A (zh) * | 2011-11-18 | 2013-05-29 | 苹果公司 | 跟踪数据处理系统的内存使用的方法 |
CN103838633A (zh) * | 2012-11-20 | 2014-06-04 | 国际商业机器公司 | 在动态虚拟机存储器调整中避免内存不足 |
CN103838633B (zh) * | 2012-11-20 | 2017-06-13 | 国际商业机器公司 | 调整虚拟机存储器的方法和系统 |
US9846601B2 (en) | 2013-05-21 | 2017-12-19 | Huawei Technologies Co., Ltd. | Method and apparatuses for determining a leak of resource and predicting usage of resource |
CN104778087B (zh) * | 2014-01-09 | 2019-04-12 | 中国移动通信集团山东有限公司 | 一种信息处理方法以及信息处理装置 |
CN104778087A (zh) * | 2014-01-09 | 2015-07-15 | 中国移动通信集团山东有限公司 | 一种信息处理方法以及信息处理装置 |
US10289472B2 (en) | 2014-08-26 | 2019-05-14 | Huawei Technologies Co., Ltd. | Resource leak detection method, apparatus, and system |
CN104461915B (zh) * | 2014-11-17 | 2017-06-20 | 阔地教育科技有限公司 | 一种在线课堂系统中内存动态分配方法及设备 |
CN104461915A (zh) * | 2014-11-17 | 2015-03-25 | 苏州阔地网络科技有限公司 | 一种在线课堂系统中内存动态分配方法及设备 |
CN106886474A (zh) * | 2015-12-16 | 2017-06-23 | 塔塔顾问服务有限公司 | 用于存储器嫌疑检测的方法和系统 |
CN106095689A (zh) * | 2016-06-24 | 2016-11-09 | 北京奇虎科技有限公司 | 一种应用内存泄露的检测方法和装置 |
CN106383743A (zh) * | 2016-09-27 | 2017-02-08 | 腾讯科技(深圳)有限公司 | 业务处理方法及系统 |
CN108073439A (zh) * | 2016-11-11 | 2018-05-25 | 深圳业拓讯通信科技有限公司 | 一种jvm内存泄露自动检测方法以及系统 |
CN107797901A (zh) * | 2017-10-25 | 2018-03-13 | 四川长虹电器股份有限公司 | 一种堆栈分析以及邮件实时报警的实现方法 |
CN107783908A (zh) * | 2017-11-07 | 2018-03-09 | 晶晨半导体(上海)股份有限公司 | 一种基于Linux内核内存泄露的检测方法 |
CN110083450A (zh) * | 2019-04-09 | 2019-08-02 | Oppo广东移动通信有限公司 | 内存回收方法、装置、电子设备及存储介质 |
CN111274057B (zh) * | 2020-01-13 | 2021-07-06 | 北京字节跳动网络技术有限公司 | 一种内存泄露链路的处理方法、装置、介质和电子设备 |
CN111274057A (zh) * | 2020-01-13 | 2020-06-12 | 北京字节跳动网络技术有限公司 | 一种内存泄露链路的处理方法、装置、介质和电子设备 |
CN112100022A (zh) * | 2020-08-14 | 2020-12-18 | 北京航空航天大学 | 一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法 |
CN112100022B (zh) * | 2020-08-14 | 2022-02-15 | 北京航空航天大学 | 一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法 |
CN112463626A (zh) * | 2020-12-10 | 2021-03-09 | 网易(杭州)网络有限公司 | 内存泄漏定位方法、装置、计算机设备及存储介质 |
CN112463626B (zh) * | 2020-12-10 | 2023-07-11 | 网易(杭州)网络有限公司 | 内存泄漏定位方法、装置、计算机设备及存储介质 |
CN113297074A (zh) * | 2021-05-21 | 2021-08-24 | 百果园技术(新加坡)有限公司 | 一种内存跟踪方法及装置 |
CN113297074B (zh) * | 2021-05-21 | 2023-12-22 | 百果园技术(新加坡)有限公司 | 一种内存跟踪方法及装置 |
WO2023284793A1 (zh) * | 2021-07-16 | 2023-01-19 | 维沃移动通信有限公司 | 内存泄露处理方法、装置和电子设备 |
CN113419893A (zh) * | 2021-07-19 | 2021-09-21 | 网易(杭州)网络有限公司 | 内存泄漏查证方法、装置、电子设备和存储介质 |
CN113419893B (zh) * | 2021-07-19 | 2022-07-12 | 网易(杭州)网络有限公司 | 内存泄漏查证方法、装置、电子设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
US8429620B2 (en) | 2013-04-23 |
US20090328007A1 (en) | 2009-12-31 |
CN101615143B (zh) | 2013-04-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101615143B (zh) | 用于内存泄漏诊断的方法和装置 | |
CN104272266B (zh) | 对具有多个监视对象器件的计算机系统进行管理的管理系统 | |
Raja et al. | Defining and evaluating a measure of open source project survivability | |
US7325234B2 (en) | System and method for monitoring computer application and resource utilization | |
US20040064544A1 (en) | Coverage analysis of program code that accesses a database | |
US20100031238A1 (en) | Method and Apparatus for Locating Memory Leak in a Program | |
CN102567185B (zh) | 一种应用服务器的监控方法 | |
EP3200080B1 (en) | Methods and systems for memory suspect detection | |
CN105912458A (zh) | 一种用于动态检测c/c++内存泄露的方法及系统 | |
CN111858713A (zh) | 基于对象的政府信息化资产管理方法及系统 | |
Khan et al. | A process model for requirements change management in collocated software development | |
CN107480188B (zh) | 一种审计业务数据处理方法和计算机设备 | |
Weninger et al. | Utilizing object reference graphs and garbage collection roots to detect memory leaks in offline memory monitoring | |
US7539833B2 (en) | Locating wasted memory in software by identifying unused portions of memory blocks allocated to a program | |
Šor et al. | Memory leak detection in Plumbr | |
CN110175100A (zh) | 一种存储盘故障预测方法及预测系统 | |
CN115545652A (zh) | 人员综合评价方法、装置、设备和存储介质 | |
US7606989B1 (en) | Method and apparatus for dynamically pre-tenuring objects in a generational garbage collection system | |
US20060036475A1 (en) | Business activity debugger | |
CN105095047B (zh) | 一种提取底层系统行为特征的操作系统监控方法及装置 | |
CN116974468B (zh) | 一种基于大数据的设备数据存储管理方法及系统 | |
CN115049030B (zh) | 一种基于无源rfid的垃圾袋信息收集方法 | |
Qian et al. | A Lightweight Approach to Detect Memory Leaks in JavaScript (S). | |
CN109800134A (zh) | 一种诊断数据中心储存设备的剩余寿命的方法和系统 | |
CN110928757B (zh) | 一种基于贝叶斯网络定位hdfs关键低效函数的性能分析方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20180622 Address after: 7 floor, building 10, Zhang Jiang Innovation Park, 399 Keyuan Road, Zhang Jiang high tech park, Pudong New Area, Shanghai. Patentee after: International Business Machines (China) Co., Ltd. Address before: New York grams of Armand Patentee before: International Business Machines Corp. |
|
TR01 | Transfer of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20130417 Termination date: 20190627 |
|
CF01 | Termination of patent right due to non-payment of annual fee |