CN114327984A - 内存检测方法及装置 - Google Patents
内存检测方法及装置 Download PDFInfo
- Publication number
- CN114327984A CN114327984A CN202111634913.5A CN202111634913A CN114327984A CN 114327984 A CN114327984 A CN 114327984A CN 202111634913 A CN202111634913 A CN 202111634913A CN 114327984 A CN114327984 A CN 114327984A
- Authority
- CN
- China
- Prior art keywords
- call stack
- memory
- information
- byte
- unreleased
- 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.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本公开关于一种内存检测方法及装置。该内存检测方法包括:在业务程序每分配超过预定个数的字节的情况下,从内存中导出一个文件,其中,文件包括业务程序的每个调用栈的未释放的字节数;针对每个调用栈,执行如下操作:基于每个文件的导出时间和每个文件中当前调用栈的未释放的字节数进行拟合处理,得到拟合信息;通过拟合信息,确定当前调用栈在当前时间和业务程序启动时间的未释放的字节数之间的字节变化信息;基于每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息。
Description
技术领域
本公开涉及计算机领域,尤其涉及一种内存检测方法及装置。
背景技术
在定位C++服务的内存膨胀的场景中,需要确定有哪些调用栈的内存增长比较大,这类问题不像内存泄漏,对于一个内存占比比较大的服务来说,很多内存占用是合理的,因此,单纯的通过调用栈内存占比确定调用栈内存的增长是不准确的。
目前,定位C++服务的内存膨胀常用的方法是使用asan或者hook malloc/free来记录所有的内存分配,但是,上述方法对业务程序的性能影响比较大,常常导致业务运行缓慢,甚至由于运行过慢都无法复现内存膨胀,并且上述方法在进程退出时才能检测到未释放内存,而一般超级大型服务持续运行并不退出,故无法做到所有的全局对象或者缓存在进程退出时释放内存,在这种场景下还会存在误判的问题。
发明内容
本公开提供一种内存检测方法及装置,以至少解决相关技术中确定内存膨胀的方法对业务程序的性能损耗大且存在误判的问题。
根据本公开实施例的第一方面,提供一种内存检测方法,包括:在业务程序每分配超过预定个数的字节的情况下,从内存中导出一个文件,其中,文件包括业务程序的每个调用栈的未释放的字节数;针对每个调用栈,执行如下操作:基于每个文件的导出时间和每个文件中当前调用栈的未释放的字节数进行拟合处理,得到拟合信息;通过拟合信息,确定当前调用栈在当前时间和业务程序启动时间的未释放的字节数之间的字节变化信息;基于每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息。
可选地,基于每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息,包括:从所有调用栈中筛选出字节变化信息中字节变化大于预设值的调用栈;基于筛选后的调用栈的字节变化信息对筛选后的调用栈进行排序,得到内存增长排序信息。
可选地,通过拟合信息,确定当前调用栈在当前时间和业务程序启动时间的未释放的字节数之间的的字节变化信息,包括:基于拟合信息,确定当前调用栈在当前时间前预定时间内的未释放的字节数的第一平均值;基于拟合信息,确定当前调用栈在业务程序启动后预定时间内的未释放的字节数的第二平均值;获取第二平均值和第一平均值的字节差值。
可选地,通过拟合信息,确定当前调用栈在当前时间和业务程序启动时间的未释放的字节数之间的的字节变化信息,包括:基于拟合信息,确定当前调用栈在当前时间前预定时间内的未释放的字节数;获取当前调用栈在当前时间前预定时间内的未释放的字节数和在当前时间前预定时间内导出的包含当前调用栈的文件的数量的第一比值;基于拟合信息,确定当前调用栈在业务程序启动后预定时间内的未释放的字节数;获取当前调用栈在业务程序启动后预定时间内的未释放的字节数和在业务程序启动后预定时间内导出的包含当前调用栈的文件的数量的第二比值;获取第二比值和第一比值的字节差值。
可选地,在基于每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息之后,还包括:将内存增长排序信息展示给用户;基于用户的指示,确定内存增长信息中与指示对应的调用栈;调整与指示对应的调用栈处的代码。
可选地,在从内存中导出一个文件之前,还包括:在业务程序每分配超过第一预定个数的字节的情况下,将业务程序的每个调用栈和每个调用栈的未释放的字节数存入内存,其中,第一预定个数小于预定个数。
根据本公开实施例的第二方面,提供一种内存检测装置,包括:导出单元,被配置为在业务程序每分配超过预定个数的字节的情况下,从内存中导出一个文件,其中,文件包括业务程序的每个调用栈的未释放的字节数;拟合单元,被配置为针对每个调用栈,执行如下操作:基于每个文件的导出时间和每个文件中当前调用栈的未释放的字节数进行拟合处理,得到拟合信息;通过拟合信息,确定当前调用栈在当前时间和业务程序启动时间的未释放的字节数之间的字节变化信息;排序信息获取单元,被配置为基于每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息。
可选地,排序信息获取单元,还被配置为从所有调用栈中筛选出字节变化信息中字节变化大于预设值的调用栈;基于筛选后的调用栈的字节变化信息对筛选后的调用栈进行排序,得到内存增长排序信息。
可选地,拟合单元,还被配置为基于拟合信息,确定当前调用栈在当前时间前预定时间内的未释放的字节数的第一平均值;基于拟合信息,确定当前调用栈在业务程序启动后预定时间内的未释放的字节数的第二平均值;获取第二平均值和第一平均值的字节差值。
可选地,拟合单元,还被配置为基于拟合信息,确定当前调用栈在当前时间前预定时间内的未释放的字节数;获取当前调用栈在当前时间前预定时间内的未释放的字节数和在当前时间前预定时间内导出的包含当前调用栈的文件的数量的第一比值;基于拟合信息,确定当前调用栈在业务程序启动后预定时间内的未释放的字节数;获取当前调用栈在业务程序启动后预定时间内的未释放的字节数和在业务程序启动后预定时间内导出的包含当前调用栈的文件的数量的第二比值;获取第二比值和第一比值的字节差值。
可选地,排序信息获取单元,还被配置为在按基于每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息之后,将内存增长排序信息展示给用户;基于用户的指示,确定内存增长信息中与指示对应的调用栈;调整与指示对应的调用栈处的代码。
可选地,导出单元,还被配置为在从内存中导出一个文件之前,在业务程序每分配超过第一预定个数的字节的情况下,将业务程序的每个调用栈和每个调用栈的未释放的字节数存入内存,其中,第一预定个数小于预定个数。
根据本公开实施例的第五方面,提供了一种电子设备,包括:处理器;用于存储处理器可执行指令的存储器;其中,处理器被配置为执行指令,以实现根据本公开的内存检测方法。
根据本公开实施例的第六方面,提供了一种计算机可读存储介质,当计算机可读存储介质中的指令被至少一个处理器运行时,促使至少一个处理器执行如上根据本公开的内存检测方法。
根据本公开实施例的第七方面,提供了一种计算机程序产品,包括计算机指令,计算机指令被处理器执行时实现根据本公开的内存检测方法。
本公开的实施例提供的技术方案至少带来以下有益效果:
根据本公开的内存检测方法及装置,在业务程序每分配预定个数的字节后,均导出一个文件,当导出的文件足够多时,针对每个调用栈,可以基于文件的导出时间和文件中未释放的字节数进行拟合处理,得到拟合信息,从而可以得到任意时间下调用栈的未释放的字节数,无需等待程序退出时才检测内存来获取未释放的字节数,且本公开巧妙地运用了内存采样方法,避免了进程较大时的性能损耗,可以应用在大型服务上。因此,本公开解决了相关技术中确定内存膨胀的方法对业务程序的性能损耗大且存在误判的问题。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。
图1是示出根据本公开的示例性实施例的内存检测方法的实施场景示意图;
图2是根据一示例性实施例示出的一种内存检测方法的流程图;
图3是根据一示例性实施例示出的一种内存采样记录后的代码示意图;
图4是根据一示例性实施例示出的一种拟合函数的曲线图;
图5是根据一示例性实施例示出的一种内存检测装置的框图;
图6是根据本公开实施例的一种电子设备600的框图。
具体实施方式
为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。
需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
在此需要说明的是,在本公开中出现的“若干项之中的至少一项”均表示包含“该若干项中的任意一项”、“该若干项中的任意多项的组合”、“该若干项的全体”这三类并列的情况。例如“包括A和B之中的至少一个”即包括如下三种并列的情况:(1)包括A;(2)包括B;(3)包括A和B。又例如“执行步骤一和步骤二之中的至少一个”,即表示如下三种并列的情况:(1)执行步骤一;(2)执行步骤二;(3)执行步骤一和步骤二。
针对上述问题,本公开提供了一种内存检测方法,能够避免进程较大时业务程序的性能损耗且可以避免误判,下面以某一APP程序的场景为例进行说明。
图1是示出根据本公开的示例性实施例的内存检测方法的实施场景示意图,如图1所述,该实施场景包括服务器100、用户终端110和用户终端120,其中,用户终端不限于2个,包括并不限于手机、个人计算机等设备,用户终端可以安装有APP程序,服务器可以是一个服务器,也可以是若干个服务器组成服务器集群,还可以是云计算平台或虚拟化中心。
服务器100在检测到APP程序每分配超过预定个数的字节的情况下,从内存中导出一个文件,其中,文件包括业务程序的每个调用栈的未释放的字节数,然后,针对每个调用栈,执行如下操作:基于每个文件的导出时间和每个文件中当前调用栈的未释放的字节数进行拟合处理,得到拟合信息,再通过拟合信息,确定当前调用栈在当前时间和业务程序启动时间的未释放的字节数之间的字节变化信息;得到变化信息后,可以基于每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息,并将内存增长排序信息展示给用户终端110或120,以便用户可以获知内存增长可以的调用栈,并基于该内存增长排序信息调整相应的调用栈处代码。
下面,将参照图2至图5详细描述根据本公开的示例性实施例的内存检测方法及装置。
图2是根据一示例性实施例示出的一种内存检测方法的流程图,如图2所示,内存检测方法包括以下步骤:
在步骤S201中,在业务程序每分配超过预定个数的字节的情况下,从内存中导出一个文件,其中,文件包括业务程序的每个调用栈的未释放的字节数。
根据本公开的示例性实施例,在从内存中导出一个文件之前,还包括:在业务程序每分配超过第一预定个数的字节的情况下,将业务程序的每个调用栈和每个调用栈的未释放的字节数存入内存,其中,第一预定个数小于预定个数。根据本实施例,可以预先在内存中存储调用栈的未释放的字节数,从而可以方便后续导出文件。
例如,在业务程序启动后,可以通过hook malloc/free函数,在每分配sample个字节后,则在内存中记录当前分配的调用栈以及指针、每个分配的调用栈的未释放的字节数,具体图3所示,在后续释放的时候,可以检查相应指针是否被记录,如果相应指针被记录了,则在内存中减掉相应指针对应的字节数。上面有提到每分配sample个字节,则在内存中记录相应的信息,实际上每分配-ln(q)*sample个字节,则在内存中记录相应的信息,该函数是一个简单的指数分布,q的取值可以是(1/2^26,1],通过对上述函数简单的积分可得平均值为sample,故一般直接采用平均值sample,其中,sample的默认值一般采用512k,最大值可达9M。
返回图2,在步骤S202中,针对每个调用栈,执行如下操作:基于每个文件的导出时间和每个文件中当前调用栈的未释放的字节数进行拟合处理,得到拟合信息;通过拟合信息,确定当前调用栈在当前时间和业务程序启动时间的未释放的字节数之间的字节变化信息。
例如,以拟合信息为拟合函数为例进行说明,可以定期导出当前heap堆上的一个内存分配情况,也即heap文件,这样针对每个调用栈,可以得到一对数据(未释放的字节数,导出时间),当导出的数据足够多时,可以开始对导出的数据进行分析拟合,生成一个堆上内存随时间变化的函数,如图4所示。
根据本公开的示例性实施例,通过拟合信息,确定当前调用栈在当前时间和业务程序启动时间的未释放的字节数之间的的字节变化信息,包括:基于拟合信息,确定当前调用栈在当前时间前预定时间内的未释放的字节数的第一平均值;基于拟合信息,确定当前调用栈在业务程序启动后预定时间内的未释放的字节数的第二平均值;获取第二平均值和第一平均值的字节差值。根据本实施例,通过平均值来确定字节差值,可以克服内存占用随着时间不规则抖动的问题,有助于后续筛选出的是一个内存整体向上增长的调用栈。
根据本公开的示例性实施例,通过拟合信息,确定当前调用栈在当前时间和业务程序启动时间的未释放的字节数之间的的字节变化信息,包括:基于拟合信息,确定当前调用栈在当前时间前预定时间内的未释放的字节数;获取当前调用栈在当前时间前预定时间内的未释放的字节数和在当前时间前预定时间内导出的包含当前调用栈的文件的数量的第一比值;基于拟合信息,确定当前调用栈在业务程序启动后预定时间内的未释放的字节数;获取当前调用栈在业务程序启动后预定时间内的未释放的字节数和在业务程序启动后预定时间内导出的包含当前调用栈的文件的数量的第二比值;获取第二比值和第一比值的字节差值。根据本实施例,通过上述比值来确定字节差值,可以克服内存占用随着时间不规则抖动的问题,有助于后续筛选出的是一个内存整体向上增长的调用栈。
例如,由于是聚焦于膨胀/泄漏,那么每个调用栈的当前时间前一段时间的内存肯定比进程启动开始时一段时间的内存高,所以可以计算进程启动开始后一段时间(例如,还可以是第一次导出文件的导出时间后一段时间)的内存的平均值,以及结束前一段时间的内存的平均值,然后基于二者的平均值去做一个差值,也即得到字节差值。
返回图2,在步骤S203中,基于每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息。例如,可以按照字节变化信息中字节变化的大小排序,得到内存增长可疑的调用栈的一个排行,该排行可以用表的形式表示,但是本公开并不进行限定。这样,排在前面的说明在业务程序运行过程中,占用了更多的内存,就更加有可能是有问题的调用栈。
根据本公开的示例性实施例,基于每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息,包括:从所有调用栈中筛选出字节变化信息中字节变化大于预设值的调用栈;基于筛选后的调用栈的字节变化信息对筛选后的调用栈进行排序,得到内存增长排序信息。根据本实施例,可以过滤掉内存增长小的调用栈,因为内存增长小的调用栈是可以可疑调用栈的概率很小,过滤掉可疑减少处理成本。
例如,由于一个进程的有非常多的调用栈需要进行处理,所以全部处理起来处理成本很高,因此,可以过滤掉一些结果,具体地,在大型的C++服务中,发生内存泄漏或者膨胀时,一般泄漏的内存量级在10%+的总内存占用,而一般大型C++服务占用高达100G+,所以无需关注那些内存占用很小的调用栈,比如,预估500M以下的内存占用都不用关注,使用此过滤条件,可以先过滤掉80%的调用栈,减少了处理成本。
根据本公开的示例性实施例,在基于筛选后的调用栈的字节变化信息对筛选后的调用栈进行排序,得到内存增长排序信息之后,还包括:将内存增长排序信息展示给用户;基于用户的指示,确定内存增长信息中与指示对应的调用栈;调整与指示对应的调用栈处的代码。根据本实施例,可以将内存增长排序信息展示给用户,从而用户可以根据排序优先处理最可疑的调用栈。
需要说明的是,上述方法可以作为内存检测工具,具体地,本公开基于jemalloc/tcmalloc的采样heap profiling,开发了一种内存检测工具KProf,可以分析内存使用情况以及内存膨胀点的过滤,并最终输出一个很直观的调用栈图表。jemalloc/tcmalloc开启heap profiling对业务程序地性能影响很小,可以认为性能损耗在5%以内。
综上,本公开巧妙利用内存采样的方法,避免了进程较大时业务程序的性能损耗,在大型服务上不影响可用性,可以非常方便的获取到调用栈在任意时间点的内存分配情况,按照对时间顺序的筛查、过滤、辅之以一些列常见的策略,筛选出最可疑的内存膨胀点,大大的提高了内存问题的debug效率,也即查找内存膨胀地效率。在实际使用中,相关技术中内存检测方法可能需要花费两三天才能得到内存膨胀点,而本公开使用KProf仅需要运行1到2个小时复现问题就可解决,目前已经解决了业务线上200+内存膨胀的问题,广受好评。
另外,针对内存膨胀,还可以使用gperftools亦或者是jemalloc中自带的heapprofile功能,可以定位到内存占用比较大的点,但是需要人工去校验这些点,去确认这些调用栈是否是正常的,对此本公开不再展开论述。
图5是根据一示例性实施例示出的一种内存检测装置的框图。参照图5,该装置包括导出单元50、拟合单元52和排序信息获取单元54。
导出单元50,被配置为在业务程序每分配超过预定个数的字节的情况下,从内存中导出一个文件,其中,文件包括业务程序的每个调用栈的未释放的字节数;拟合单元52,被配置为针对每个调用栈,执行如下操作:基于每个文件的导出时间和每个文件中当前调用栈的未释放的字节数进行拟合处理,得到拟合信息;通过拟合信息,确定当前调用栈在当前时间和业务程序启动时间的未释放的字节数之间的字节变化信息;排序信息获取单元54,被配置为基于筛选后的调用栈的字节变化信息对筛选后的调用栈进行排序,得到内存增长排序信息。
根据本公开的示例性实施例,排序信息获取单元54,还被配置为从所有调用栈中筛选出字节变化信息中字节变化大于预设值的调用栈;基于筛选后的调用栈的字节变化信息对筛选后的调用栈进行排序,得到内存增长排序信息。
根据本公开的示例性实施例,拟合单元52,还被配置为基于拟合信息,确定当前调用栈在当前时间前预定时间内的未释放的字节数的第一平均值;基于拟合信息,确定当前调用栈在业务程序启动后预定时间内的未释放的字节数的第二平均值;获取第二平均值和第一平均值的字节差值。
根据本公开的示例性实施例,拟合单元52,还被配置为基于拟合信息,确定当前调用栈在当前时间前预定时间内的未释放的字节数;获取当前调用栈在当前时间前预定时间内的未释放的字节数和在当前时间前预定时间内导出的包含当前调用栈的文件的数量的第一比值;基于拟合信息,确定当前调用栈在业务程序启动后预定时间内的未释放的字节数;获取当前调用栈在业务程序启动后预定时间内的未释放的字节数和在业务程序启动后预定时间内导出的包含当前调用栈的文件的数量的第二比值;获取第二比值和第一比值的字节差值。
根据本公开的示例性实施例,排序信息获取单元54,还被配置为在基于筛选后的调用栈的字节变化信息对筛选后的调用栈进行排序,得到内存增长排序信息之后,将内存增长排序信息展示给用户;基于用户的指示,确定内存增长信息中与指示对应的调用栈;调整与指示对应的调用栈处的代码。
根据本公开的示例性实施例,导出单元50,还被配置为在从内存中导出一个文件之前,在业务程序每分配超过第一预定个数的字节的情况下,将业务程序的每个调用栈和每个调用栈的未释放的字节数存入内存,其中,第一预定个数小于预定个数。
根据本公开的实施例,可提供一种电子设备。图6是根据本公开实施例的一种电子设备600的框图,该电子设备包括至少一个存储器601和至少一个处理器602,所述至少一个存储器中存储有计算机可执行指令集合,当计算机可执行指令集合被至少一个处理器执行时,执行根据本公开实施例的内存检测方法。
作为示例,电子设备600可以是PC计算机、平板装置、个人数字助理、智能手机、或其他能够执行上述指令集合的装置。这里,电子设备1000并非必须是单个的电子设备,还可以是任何能够单独或联合执行上述指令(或指令集)的装置或电路的集合体。电子设备600还可以是集成控制系统或系统管理器的一部分,或者可被配置为与本地或远程(例如,经由无线传输)以接口互联的便携式电子设备。
在电子设备600中,处理器602可包括中央处理器(CPU)、图形处理器(GPU)、可编程逻辑装置、专用处理器系统、微控制器或微处理器。作为示例而非限制,处理器602还可包括模拟处理器、数字处理器、微处理器、多核处理器、处理器阵列、网络处理器等。
处理器602可运行存储在存储器中的指令或代码,其中,存储器601还可以存储数据。指令和数据还可经由网络接口装置而通过网络被发送和接收,其中,网络接口装置可采用任何已知的传输协议。
存储器601可与处理器602集成为一体,例如,将RAM或闪存布置在集成电路微处理器等之内。此外,存储器601可包括独立的装置,诸如,外部盘驱动、存储阵列或任何数据库系统可使用的其他存储装置。存储器601和处理器602可在操作上进行耦合,或者可例如通过I/O端口、网络连接等互相通信,使得处理器602能够读取存储在存储器601中的文件。
此外,电子设备600还可包括视频显示器(诸如,液晶显示器)和用户交互接口(诸如,键盘、鼠标、触摸输入装置等)。电子设备的所有组件可经由总线和/或网络而彼此连接。
根据本公开的实施例,还可提供一种计算机可读存储介质,其中,当计算机可读存储介质中的指令被至少一个处理器运行时,促使至少一个处理器执行本公开实施例的内存检测方法。这里的计算机可读存储介质的示例包括:只读存储器(ROM)、随机存取可编程只读存储器(PROM)、电可擦除可编程只读存储器(EEPROM)、随机存取存储器(RAM)、动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM)、闪存、非易失性存储器、CD-ROM、CD-R、CD+R、CD-RW、CD+RW、DVD-ROM、DVD-R、DVD+R、DVD-RW、DVD+RW、DVD-RAM、BD-ROM、BD-R、BD-R LTH、BD-RE、蓝光或光盘存储器、硬盘驱动器(HDD)、固态硬盘(SSD)、卡式存储器(诸如,多媒体卡、安全数字(SD)卡或极速数字(XD)卡)、磁带、软盘、磁光数据存储装置、光学数据存储装置、硬盘、固态盘以及任何其他装置,所述任何其他装置被配置为以非暂时性方式存储计算机程序以及任何相关联的数据、数据文件和数据结构并将所述计算机程序以及任何相关联的数据、数据文件和数据结构提供给处理器或计算机使得处理器或计算机能执行所述计算机程序。上述计算机可读存储介质中的计算机程序可在诸如客户端、主机、代理装置、服务器等计算机设备中部署的环境中运行,此外,在一个示例中,计算机程序以及任何相关联的数据、数据文件和数据结构分布在联网的计算机系统上,使得计算机程序以及任何相关联的数据、数据文件和数据结构通过一个或多个处理器或计算机以分布式方式存储、访问和执行。
根据本公开实施例,提供了一种计算机程序产品,包括计算机指令,计算机指令被处理器执行时实现本公开实施例的内存检测方法。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
Claims (10)
1.一种内存检测方法,其特征在于,包括:
在业务程序每分配超过预定个数的字节的情况下,从内存中导出一个文件,其中,所述文件包括所述业务程序的每个调用栈的未释放的字节数;
针对每个调用栈,执行如下操作:基于每个文件的导出时间和所述每个文件中当前调用栈的未释放的字节数进行拟合处理,得到拟合信息;通过所述拟合信息,确定所述当前调用栈在当前时间和所述业务程序启动时间的未释放的字节数之间的字节变化信息;
基于所述每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息。
2.如权利要求1所述的内存检测方法,其特征在于,所述基于所述每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息,包括:
从所有调用栈中筛选出所述字节变化信息中字节变化大于预设值的调用栈;
基于筛选后的调用栈的字节变化信息对所述筛选后的调用栈进行排序,得到所述内存增长排序信息。
3.如权利要求1所述的内存检测方法,其特征在于,所述通过所述拟合信息,确定所述当前调用栈在当前时间和所述业务程序启动时间的未释放的字节数之间的的字节变化信息,包括:
基于所述拟合信息,确定所述当前调用栈在当前时间前预定时间内的未释放的字节数的第一平均值;
基于所述拟合信息,确定所述当前调用栈在所述业务程序启动后预定时间内的未释放的字节数的第二平均值;
获取所述第二平均值和所述第一平均值的字节差值。
4.如权利要求1所述的内存检测方法,其特征在于,所述通过所述拟合信息,确定所述当前调用栈在当前时间和所述业务程序启动时间的未释放的字节数之间的的字节变化信息,包括:
基于所述拟合信息,确定所述当前调用栈在当前时间前预定时间内的未释放的字节数;
获取所述当前调用栈在当前时间前预定时间内的未释放的字节数和在当前时间前预定时间内导出的包含所述当前调用栈的文件的数量的第一比值;
基于所述拟合信息,确定所述当前调用栈在所述业务程序启动后预定时间内的未释放的字节数;
获取所述当前调用栈在所述业务程序启动后预定时间内的未释放的字节数和在所述业务程序启动后预定时间内导出的包含所述当前调用栈的文件的数量的第二比值;
获取所述第二比值和所述第一比值的字节差值。
5.如权利要求1所述的内存检测方法,其特征在于,在基于所述每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息之后,还包括:
将所述内存增长排序信息展示给用户;
基于所述用户的指示,确定所述内存增长信息中与所述指示对应的调用栈;
调整与所述指示对应的调用栈处的代码。
6.如权利要求1所述的内存检测方法,其特征在于,在从内存中导出一个文件之前,还包括:
在业务程序每分配超过第一预定个数的字节的情况下,将所述业务程序的每个调用栈和所述每个调用栈的未释放的字节数存入内存,其中,所述第一预定个数小于所述预定个数。
7.一种内存检测装置,其特征在于,包括:
导出单元,被配置为在业务程序每分配超过预定个数的字节的情况下,从内存中导出一个文件,其中,所述文件包括所述业务程序的每个调用栈的未释放的字节数;
拟合单元,被配置为针对每个调用栈,执行如下操作:基于每个文件的导出时间和所述每个文件中当前调用栈的未释放的字节数进行拟合处理,得到拟合信息;通过所述拟合信息,确定所述当前调用栈在当前时间和所述业务程序启动时间的未释放的字节数之间的字节变化信息;
排序信息获取单元,被配置为基于所述每个调用栈的字节变化信息对每个调用栈进行排序,得到内存增长排序信息。
8.一种电子设备,其特征在于,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述指令,以实现如权利要求1至6中任一项所述的内存检测方法。
9.一种计算机可读存储介质,其特征在于,当所述计算机可读存储介质中的指令被至少一个处理器运行时,促使所述至少一个处理器执行如权利要求1至6中任一项所述的内存检测方法。
10.一种计算机程序产品,包括计算机指令,其特征在于,所述计算机指令被处理器执行时实现如权利要求1至6中任一项所述的内存检测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111634913.5A CN114327984A (zh) | 2021-12-27 | 2021-12-27 | 内存检测方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111634913.5A CN114327984A (zh) | 2021-12-27 | 2021-12-27 | 内存检测方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114327984A true CN114327984A (zh) | 2022-04-12 |
Family
ID=81016665
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111634913.5A Pending CN114327984A (zh) | 2021-12-27 | 2021-12-27 | 内存检测方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114327984A (zh) |
-
2021
- 2021-12-27 CN CN202111634913.5A patent/CN114327984A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107193750B (zh) | 一种脚本录制方法和装置 | |
CN109656779A (zh) | 内存监控方法、装置、终端和存储介质 | |
US10049034B2 (en) | Information processing apparatus | |
CN111866209A (zh) | 一种为云主机分配网卡的方法与设备 | |
CN114511235A (zh) | 流程评估方法及系统 | |
CN108667740A (zh) | 流量控制的方法、装置及系统 | |
CN114490375A (zh) | 应用程序的性能测试方法、装置、设备及存储介质 | |
CN108920326A (zh) | 确定系统耗时异常的方法、装置及电子设备 | |
CN114327984A (zh) | 内存检测方法及装置 | |
CN107193721B (zh) | 一种生成日志的方法和装置 | |
EP2278468A2 (en) | System and method for tracking application usage | |
CN114465926B (zh) | 递归服务器监测方法、装置、设备及存储介质 | |
CN112631941B (zh) | 定位linux内核slub内存泄漏的方法和系统 | |
CN104794040A (zh) | 业务监控方法、装置及系统 | |
CN112380115A (zh) | 一种回归测试方法、装置、电子设备及存储介质 | |
US10228825B1 (en) | Display and analysis of information related to monitored elements of a computer system | |
CN109992614B (zh) | 数据获取方法、装置和服务器 | |
CN113051105A (zh) | 数据处理方法、装置、设备及存储介质 | |
CN107491287B (zh) | 指令的执行方法及装置 | |
CN112346894B (zh) | 内存泄露检测方法、装置、系统及计算机设备 | |
CN113676377B (zh) | 基于大数据的在线用户数评估方法、装置、设备及介质 | |
CN112783716B (zh) | 一种监控方法和装置 | |
CN114911418A (zh) | 一种无线电信号存储与回放装置 | |
CN106484598B (zh) | 一种终端内存的显示方法及显示装置 | |
CN117349020A (zh) | 一种系统信息处理方法及装置、电子设备、存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |