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监控是否存在对象被回收;其中所述对象关联有标示符;在监控到存在所述对象被回收的情况下,在预设集合中删除所述对象关联的标示符;其中所述预设集合包括多个对象各自关联的标示符;其中,所述预设集合中剩余的标示符可以用于确定内存泄露对象。具体的,内存泄露检测设备确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象。本专利技术实施例中,内存泄露检测设备借助所述JVM ...
【技术保护点】
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任一项所述的方法,其特征在于,所述确定所述预设集合中剩余的标示符中的一个或多...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。