[发明专利]一种内存泄露检测方法及设备有效
申请号: | 201710211056.5 | 申请日: | 2017-03-31 |
公开(公告)号: | CN108664390B | 公开(公告)日: | 2021-10-01 |
发明(设计)人: | 焦石;蒋启刚 | 申请(专利权)人: | 华为技术有限公司 |
主分类号: | G06F11/36 | 分类号: | G06F11/36;G06F9/455 |
代理公司: | 广州三环专利商标代理有限公司 44202 | 代理人: | 郝传鑫;熊永强 |
地址: | 518129 广东*** | 国省代码: | 广东;44 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 内存 泄露 检测 方法 设备 | ||
1.一种内存泄露检测方法,其特征在于,所述方法包括:
当应用程序在虚拟机上运行时,调用Java虚拟机工具接口JVMTI监控是否存在对象被回收;其中所述对象关联有标示符;
在监控到存在对象被回收的情况下,在预设集合中删除所述对象关联的标示符;其中所述预设集合包括多个对象各自关联的标示符;确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象;
其中,还包括:
通过代码注入技术跟踪所述对象的创建事件,获取所述对象的位置信息;
所述确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象之后,还包括:根据所述位置信息确定所述内存泄露对象的位置;
其中,所述通过代码注入技术跟踪所述对象的创建事件,获取所述对象的位置信息之后,还包括:
通过所述JVMTI的Thread-local机制创建所述对象所在线程的分配列表;以及调用信息传递接口函数将所述对象的标示符和位置信息传递给所述分配列表;
其中,所述线程各自关联一个分配列表;所述分配列表包括多个对象各自关联的标示符和位置信息;所述分配列表中同一个对象的标示符和位置信息具有关联关系;
所述根据所述位置信息确定所述内存泄露对象的位置,包括:
根据所述分配列表中的位置信息确定所述内存泄露对象的位置。
2.根据权利要求1所述的方法,其特征在于,所述根据所述分配列表中的位置信息确定所述内存泄露对象的位置,包括:
调用在所述JVMTI中已创建的守护线程导出所述分配列表中的标示符和位置信息;
根据导出的所述标示符和所述位置信息确定所述内存泄露对象的位置。
3.根据权利要求1所述的方法,其特征在于,还包括:
获取包括指定目录的启动指令;其中所述启动指令用于启动文件检测线程,所述文件检测线程用于检测所述指定目录下是否存在开始文件或结束文件,所述开始文件用于触发启动监控对象的回收情况,所述结束文件用于触发结束监控对象的回收情况;
当检测到所述指定目录下存在所述开始文件时,触发执行所述调用JVMTI监控是否存在对象被回收的步骤;
当检测到所述指定目录下存在所述结束文件时,结束对所述对象的回收情况的监控,并触发执行所述确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象的步骤。
4.根据权利要求2所述的方法,其特征在于,还包括:
获取包括指定目录的启动指令;其中所述启动指令用于启动文件检测线程,所述文件检测线程用于检测所述指定目录下是否存在开始文件或结束文件,所述开始文件用于触发启动监控对象的回收情况,所述结束文件用于触发结束监控对象的回收情况;
当检测到所述指定目录下存在所述开始文件时,触发执行所述调用JVMTI监控是否存在对象被回收的步骤;
当检测到所述指定目录下存在所述结束文件时,结束对所述对象的回收情况的监控,并触发执行所述确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象的步骤。
5.根据权利要求1至4任一项所述的方法,其特征在于,所述确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象,包括:
调用在所述JVMTI中已创建的守护线程导出所述预设集合中剩余的标示符;
根据导出的所述标示符确定内存泄露对象。
6.根据权利要求1至4任一项所述的方法,其特征在于,所述确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象,包括:
根据所述预设集合中剩余的标示符和预设的排除对象确定内存泄露对象,所述预设的排除对象为与应用程序具有相同的生命周期、且被正常引用的静态对象或全局对象。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于华为技术有限公司,未经华为技术有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201710211056.5/1.html,转载请声明来源钻瓜专利网。