一种内存泄露检测方法及设备技术

技术编号:19176990 阅读:32 留言:0更新日期:2018-10-17 00:18
本发明专利技术实施例涉及计算机领域,公开了一种内存泄露检测方法及设备,其中,该方法包括:当Java应用程序在虚拟机上运行时,调用Java虚拟机工具接口JVMTI监控是否存在对象被回收;其中所述对象关联有标示符;在监控到存在所述对象被回收的情况下,在预设集合中删除所述对象关联的标示符;其中所述预设集合包括多个对象各自关联的标示符;确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象。实施本发明专利技术实施例,能够提高内存泄露检测的效率。

A memory leak detection method and device

The embodiment of the present invention relates to the computer field and discloses a memory leak detection method and a device, wherein the method includes: when a Java application program is running on a virtual machine, calling the Java Virtual Machine Tool Interface JVMTI to monitor whether an object is reclaimed; where the object is associated with an identifier; and monitoring to a presence In the case of the object being recovered, the associated identifier of the object is deleted in the preset set, wherein the preset set includes the identifiers associated with each of the plurality of objects, and the object associated with one or more of the remaining identifiers in the preset set is determined to be a memory leak object. By implementing the embodiment of the invention, the efficiency of memory leak detection can be improved.

【技术实现步骤摘要】
一种内存泄露检测方法及设备
本专利技术涉及计算机领域,尤其涉及一种内存泄露检测方法及设备。
技术介绍
在计算机领域中,内存泄露指由于疏忽或错误造成程序已经不再使用的内存无法被回收。随着应用程序的运行,系统中可用的内存越来越少,导致系统由于没有足够的内存而瘫痪。目前,检测内存泄漏的手段是内存分析工具。内存分析工具首先通过对应用程序运行时导出的文件人为地判断对象实例数量、或对象内存占用大小来找到有高风险内存泄露的类;然后再在另一个时间导出一个文件进行同样的分析,对比两次分析结果,如果发现某个类的实例数量有明显增加、且大致趋势是随着应用程序的运行一直增加,那么所述类即可为内存泄露的重点关注对象;最后再人为参与进行更深度地分析以确定内存泄露的对象。但是,实践中发现,上述整个内存泄露的检测过程需要人为的参与,且需要对内存泄露场景比较熟悉的人员进行检测,内存泄露检测的效率较低。
技术实现思路
本专利技术实施例公开了一种内存泄露检测方法及设备,能够提高内存泄露检测的效率。第一方面,本专利技术实施例提供了一种内存泄露检测方法,所述方法包括:当应用程序在虚拟机上运行时,调用Java虚拟机工具接口JVMTI监控是否存在对象被回收;其中所述对象关联有标示符;在监控到存在所述对象被回收的情况下,在预设集合中删除所述对象关联的标示符;其中所述预设集合包括多个对象各自关联的标示符;其中,所述预设集合中剩余的标示符可以用于确定内存泄露对象。具体的,内存泄露检测设备确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象。本专利技术实施例中,内存泄露检测设备借助所述JVMTI能够监控应用程序中对象是否被回收的能力,检测出所述应用程序中未被回收的对象,即所述剩余的标示符关联的对象,并根据所述未被回收的对象确定内存泄露对象。可见,与现有技术中通过人为判断对象实例数量、或对象内存占用大小来找到内存泄露对象相比,本方案减少了人力资源的消耗,提高了内存泄露检测的效率。在一种可能的设计中,通过代码注入技术跟踪所述对象的创建事件从而获取所述对象的位置信息。其中,所述获取的对象的位置信息可以用于确定所述内存泄露对象的位置。具体的,内存泄露检测设备根据所述位置信息确定所述内存泄露对象的位置。通过本专利技术实施例提供的技术方案,所述内存泄露检测设备在确定内存泄露对象的同时,还可以定位所述内存泄露对象的位置,避免了人为地去寻找所述内存泄露对象的位置,提高了内存泄露检测的效率。在一种可能的设计中,通过所述JVMTI的Thread-local机制创建所述对象所在线程的分配列表;以及调用信息传递接口函数将所述对象的标示符和位置信息传递给所述分配列表中;其中,所述线程各自关联一个分配列表;所述分配列表包括多个对象各自关联的标示符和位置信息;以及所述分配列表中同一个对象的标示符和位置信息具有关联关系;所述根据所述位置信息确定所述内存泄露对象的位置,包括:根据所述分配列表中的位置信息确定所述内存泄露对象的位置。通过本专利技术实施提供的技术方案,通过所述JVMTI的thread-local机制创建的所述分配列表来保存所述标示符和所述位置信息,避免了多线程并发问题。在一种可能的设计中,所述根据所述分配列表中的位置信息确定所述内存泄露对象的位置,包括:调用在所述JVMTI中已创建的守护线程导出所述分配列表中的标示符和位置信息。其中,该导出的所述标示符和所述位置信息可以用于确定所述内存泄露对象的位置。具体的,内存泄露检测设备可以根据导出的所述标示符和所述位置信息确定所述内存泄露对象的位置。通过本专利技术实施例提供的技术方案,所述内存泄露检测设备还可以通过创建的守护线程不定时地导出所述位置信息,避免了因所述位置信息都存在于内存中,而导致内存的使用率过高。在一种可能的设计中,获取包括指定目录的启动指令;其中所述启动指令用于启动文件检测线程,所述启动文件检测线程用于检测所述指定目录下是否存在开始文件或结束文件,所述开始文件用于触发启动监控对象的回收情况,所述结束文件用于触发结束监控对象的回收情况;当检测到所述指定目录下存在所述开始文件时,触发执行所述调用JVMTI监控是否存在对象被回收的步骤;当检测到所述指定目录下存在所述结束文件时,结束对所述对象的回收情况的监控,并触发执行所述确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象的步骤。通过本专利技术实施例提供的技术方案,所述JVMTI可以只监控在检测到所述开始文件之后创建的对象,避免监控应用程序中所有的对象,监控的对象的数量级小,内存泄露检测效率高;另外,在所述应用程序运行过程中,所述内存泄露检测设备还可以不定时地启动文件检测线程,以实现在所述应用程序运行的任一时间点开始监控对象的回收情况,从而实现监控范围的灵活设置。在一种可能的设计中,调用在所述JVMTI中已创建的守护线程导出所述预设集合中剩余的标示符;根据导出的所述标示符确定内存泄露对象。通过本专利技术实施例提供的技术方案,所述内存泄露检测设备通过所述JVMTI创建守护线程,来专门导出所述剩余的标示符,避免了因通过所述应用程序中的业务线程执行上述导出操作而影响所述应用程序的运行效率。在一种可能的设计中,根据所述预设集合中剩余的标示符和预设的排除对象确定内存泄露对象。通过本专利技术实施例提供的方案,所述内存泄露检测设备还可以预先设定排除对象,比如与应用程序具有相同的生命周期、且被正常引用的静态对象或全局对象等等,在确定所述内存泄露对象时,排除所述排除对象,避免了所述静态对象或全局对象等设定的所述排除对象被误定义为所述内存泄露对象,提高了内存泄露对象检测的准确率。在一种可能的设计中,所述根据导出的所述标示符和所述位置信息确定所述内存泄露对象的位置之后,所述方法还包括:在所述内存泄露对象的位置信息出现重复的情况下,去掉所述内存泄露对象的位置信息中重复的位置信息通过本专利技术实施例提供的技术方案,在导出的所述位置信息出现重复的情况下,所述内存泄露检测设备通过对所述内存泄露对象的位置信息进行去重操作,可以使所述内存泄露对象的位置信息直观上简洁、明了。第二方面,本专利技术实施例提供一种内存泄露检测设备,所述设备包括:监控单元,用于当应用程序在虚拟机上运行时,调用Java虚拟机工具接口JVMTI监控是否存在对象被回收;其中所述对象关联有标示符;标示符删除单元,用于在所述监控单元监控到存在所述对象被回收的情况下,在预设集合中删除所述对象关联的标示符;其中所述预设集合包括多个对象各自关联的标示符;对象确定单元,用于确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象。本专利技术实施例中,内存泄露检测设备监控出应用程序中未被回收的对象,即所述剩余的标示符关联的对象,并根据所述未被回收的对象确定内存泄露对象。可见,与现有技术中通过人为判断对象实例数量、或对象内存占用大小来找到内存泄露对象相比,本专利技术实施例提供的方案减少了人力资源的消耗,提高了内存泄露检测的效率。在一种可能的设计中,所述设备还包括:位置确定单元,用于通过代码注入技术跟踪所述对象的创建事件从而获取所述对象的位置信息;并根据所述位置信息确定所述内存泄露对象的位置。通过本专利技术实施例提供的技术方案,所述内存泄露本文档来自技高网...

【技术保护点】
1.一种内存泄露检测方法,其特征在于,所述方法包括:当应用程序在虚拟机上运行时,调用Java虚拟机工具接口JVMTI监控是否存在对象被回收;其中所述对象关联有标示符;在监控到存在对象被回收的情况下,在预设集合中删除所述对象关联的标示符;其中所述预设集合包括多个对象各自关联的标示符;确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象。

【技术特征摘要】
1.一种内存泄露检测方法,其特征在于,所述方法包括:当应用程序在虚拟机上运行时,调用Java虚拟机工具接口JVMTI监控是否存在对象被回收;其中所述对象关联有标示符;在监控到存在对象被回收的情况下,在预设集合中删除所述对象关联的标示符;其中所述预设集合包括多个对象各自关联的标示符;确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象。2.根据权利要求1所述的方法,其特征在于,还包括:通过代码注入技术跟踪所述对象的创建事件,获取所述对象的位置信息;所述确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象之后,还包括:根据所述位置信息确定所述内存泄露对象的位置。3.根据权利要求2所述的方法,其特征在于,所述通过代码注入技术跟踪所述对象的创建事件,获取所述对象的位置信息之后,还包括:通过所述JVMTI的Thread-local机制创建所述对象所在线程的分配列表;以及调用信息传递接口函数将所述对象的标示符和位置信息传递给所述分配列表;其中,所述线程各自关联一个分配列表;所述分配列表包括多个对象各自关联的标示符和位置信息;所述分配列表中同一个对象的标示符和位置信息具有关联关系;所述根据所述位置信息确定所述内存泄露对象的位置,包括:根据所述分配列表中的位置信息确定所述内存泄露对象的位置。4.根据权利要求3所述的方法,其特征在于,所述根据所述分配列表中的位置信息确定所述内存泄露对象的位置,包括:调用在所述JVMTI中已创建的守护线程导出所述分配列表中的标示符和位置信息;根据导出的所述标示符和所述位置信息确定所述内存泄露对象的位置。5.根据权利要求1至4任一项所述的方法,其特征在于,还包括:获取包括指定目录的启动指令;其中所述启动指令用于启动文件检测线程,所述文件检测线程用于检测所述指定目录下是否存在开始文件或结束文件,所述开始文件用于触发启动监控对象的回收情况,所述结束文件用于触发结束监控对象的回收情况;当检测到所述指定目录下存在所述开始文件时,触发执行所述调用JVMTI监控是否存在对象被回收的步骤;当检测到所述指定目录下存在所述结束文件时,结束对所述对象的回收情况的监控,并触发执行所述确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象的步骤。6.根据权利要求1至5任一项所述的方法,其特征在于,所述确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象,包括:调用在所述JVMTI中已创建的守护线程导出所述预设集合中剩余的标示符;根据导出的所述标示符确定内存泄露对象。7.根据权利要求1至5任一项所述的方法,其特征在于,所述确定所述预设集合中剩余的标示符中的一个或多...

【专利技术属性】
技术研发人员:焦石蒋启刚
申请(专利权)人:华为技术有限公司
类型:发明
国别省市:广东,44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1