[发明专利]一种检测内存泄露的方法及装置在审
申请号: | 202210508567.4 | 申请日: | 2022-05-11 |
公开(公告)号: | CN114880226A | 公开(公告)日: | 2022-08-09 |
发明(设计)人: | 刘小兵 | 申请(专利权)人: | 北京京东拓先科技有限公司 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 中原信达知识产权代理有限责任公司 11219 | 代理人: | 孙磊;韩黎捷 |
地址: | 100176 北京市北京经济技*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 检测 内存 泄露 方法 装置 | ||
本发明公开了一种检测内存泄露的方法及装置,涉及计算机技术领域。该方法的一具体实施方式包括:获取待检测的内存区域的指针地址;根据所述指针地址确定所述内存区域对应的多个内存对象;确定所述多个内存对象之间的引用关系;根据所述引用关系,检测所述多个内存对象之间是否存在循环引用;如果是,确定所述内存区域存在内存泄露。该实施方式提高了程序的运行效率和稳定性,且适用范围更大,准确性也更高。
技术领域
本发明涉及计算机技术领域,尤其涉及一种检测内存泄露的方法及装置。
背景技术
内存泄露是指应用程序运行过程中,已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
目前主要通过hook机制监听内存堆债、或者检测页面及子视图是否释放的方式来检测内存泄露。
但是,现有技术中至少存在如下问题:hook机制需要常驻内存,并且涉及API的使用,这可能降低应用程序的运行效率和稳定性;检测页面及子视图的方式仅能检测到与页面及子视图相关的对象所对应的内存泄露,适用范围较小,导致检测准确性较差。
发明内容
有鉴于此,本发明实施例提供一种检测内存泄露的方法及装置,通过内存区域的指针地址确定内存区域中的多个内存对象,并根据内存对象之间的引用关系来检测内存对象之间是否存在循环引用,若存在循环引用,则确定存在内存泄露。由此,通过主动扫描内存对象,可以避免hook对象的创建与销毁,也无需常驻内存运行,由此提高了程序的运行效率和稳定性。并且相对于检测页面及子视图的方式,本发明实施例由于不依赖页面及子视图的生命周期,因此不仅可以检测页面及其属性的引用关系,也可以检测其他对象之间的引用关系,适用范围更大,准确性也更高。
为实现上述目的,根据本发明实施例的一个方面,提供了一种检测内存泄露的方法。
本发明实施例的一种检测内存泄露方法包括:获取待检测的内存区域的指针地址;
根据所述指针地址确定所述内存区域对应的多个内存对象;
确定所述多个内存对象之间的引用关系;
根据所述引用关系,检测所述多个内存对象之间是否存在循环引用;
如果是,确定所述内存区域存在内存泄露。
可选地,所述根据所述引用关系,检测所述多个内存对象之间是否存在循环引用,包括:
根据所述引用关系,构建所述多个内存对象对应的有向图;
确定每一个所述内存对象在所述有向图中的入度和/或出度;
根据所述入度和/或出度,检测所述多个内存对象之间是否存在循环引用。
可选地,所述根据所述入度和/或出度,检测所述多个内存对象之间是否存在循环引用,包括:
根据所述有向图,确定所述内存对象对应的一个或多个被引用对象;
循环执行以下步骤,直至不存在入度为零的目标内存对象:
从所述有向图中删除当前入度为零的目标内存对象;
针对删除后剩余的每一个所述内存对象:确定对应的所述一个或多个被引用对象中是否存在所述目标内存对象,如果是,删除所述目标内存对象;
重新确定所述内存对象的当前入度。
可选地,根据所述有向图,确定所述内存对象对应的一个或多个引用对象;
循环执行以下步骤,直至不存在出度为零的目标内存对象:
从所述有向图中删除当前出度为零的目标内存对象;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京京东拓先科技有限公司,未经北京京东拓先科技有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202210508567.4/2.html,转载请声明来源钻瓜专利网。