CN107291619B - 内存占用分析方法及装置 - Google Patents
内存占用分析方法及装置 Download PDFInfo
- Publication number
- CN107291619B CN107291619B CN201710476798.0A CN201710476798A CN107291619B CN 107291619 B CN107291619 B CN 107291619B CN 201710476798 A CN201710476798 A CN 201710476798A CN 107291619 B CN107291619 B CN 107291619B
- Authority
- CN
- China
- Prior art keywords
- stack
- creating
- value
- class
- bytes
- 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.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种内存占用分析方法及装置,涉及信息处理技术领域,可以细粒度的分析某一对象的内存占用情况,进而可以提高应用软件的内存占用分析的精度。所述方法包括:获取软件测试对应的内存对象转储文件;对所述内存对象转储文件进行解析,得到不同类的对象;对所述对象进行内存占用监控,得到所述对象对应的内存占用信息。本发明适用于软件内存占用分析。
Description
技术领域
本发明涉及一种信息处理技术领域,特别是涉及一种内存占用分析方法及装置。
背景技术
随着移动通信技术的发展,诸如手机等移动终端设备越来越普及,大量的应用软件也随之应运而生,用户通常会在移动终端设备中安装许多应用软件来满足各种业务需求。为了使得应用软件在移动终端上充分利用资源且能稳定运行,需要在应用软件开发完成后进行性能测试。
目前在对应用软件进行内存占用性能方面的测试时,通过应用软件相应的启动进程对内存的占用数值来判别该应用软件的内存占用情况,然而,应用软件会包含多个类的对象,例如,JAVA对象、原生态Native对象、根ROOT对象等,通过上述分析方式只能整体分析得到应用软件的内存占用情况,不能细粒度的分析某一对象的内存占用情况,进而会导致应用软件的内存占用分析的精度较低。
发明内容
有鉴于此,本发明提供了一种内存占用分析方法、装置及系统,主要目的在于可以细粒度的分析某一对象的内存占用情况,进而可以提高应用软件的内存占用分析的精度。
依据本发明一个方面,提供了一种内存占用分析方法,该方法包括:
获取软件测试对应的内存对象转储文件;
对所述内存对象转储文件进行解析,得到不同类的对象;
对所述对象进行内存占用监控,得到所述对象对应的内存占用信息。
依据本发明另一个方面,提供了一种内存占用分析装置,该装置包括:
获取单元,用于获取软件测试对应的内存对象转储文件;
解析单元,用于对所述获取单元获取的内存对象转储文件进行解析,得到不同类的对象;
监控单元,用于对所述解析单元解析到的对象进行内存占用监控,得到所述对象对应的内存占用信息。。
依据本发明又一个方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:
获取软件测试对应的内存对象转储文件;
对所述内存对象转储文件进行解析,得到不同类的对象;
对所述对象进行内存占用监控,得到所述对象对应的内存占用信息。
依据本发明再一个方面,提供了一种内存占用分析装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:
获取软件测试对应的内存对象转储文件;
对所述内存对象转储文件进行解析,得到不同类的对象;
对所述对象进行内存占用监控,得到所述对象对应的内存占用信息。
借由上述技术方案,本发明提供的一种内存占用分析方法及装置,与目前通过应用软件相应的启动进程对内存的占用数值来判别该应用软件的内存占用情况相比,本发明可以对软件测试对应的内存对象转储文件进行解析,得到不同类的对象,进而可以基于不同类的对象进行内存占用监控,得到不同对象分别对应的内存占用信息,可以细粒度的分析某一对象的内存占用情况,可以提高应用软件的内存占用分析的精度,方便开发者基于不同对象的内存占用情况,对存在问题的对象直接进行调整,无需再对软件各对象分别进行分析,从而可以提高软件开发效率。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明实施例提供的一种内存占用分析方法流程示意图;
图2示出了本发明实施例提供的另一种内存占用分析方法流程示意图;
图3示出了本发明实施例提供的一种基于对象的内存占用分析实例示意图;
图4示出了本发明实施例提供的一种内存占用分析装置的结构示意图;
图5示出了本发明实施例提供的另一种内存占用分析装置的结构示意图;
图6示出了本发明实施例提供的一种内存占用分析的实体装置结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
如背景技术所述,目前在对应用软件进行内存占用性能方面的测试时,通过应用软件相应的启动进程对内存的占用数值来判别该应用软件的内存占用情况,只能整体分析得到应用软件的内存占用情况,不能细粒度的分析软件某一对象的内存占用情况,进而会导致出现应用软件的内存占用分析精度较低的问题。
为了解决上述问题,本发明实施例提供了一种内存占用分析方法,可以细粒度的分析某一对象的内存占用情况,进而可以提高应用软件的内存占用分析的精度,如图1所示,该方法包括:
101、获取软件测试对应的内存对象转储文件。
其中,内存对象转储文件中记录了软件测试过程中的内存使用情况。该内存对象转储文件可以由现有软件开发工具根据软件测试结果生成得到。
对于本发明实施例的执行主体可以为用于软件内存占用分析的装置,在软件内存占用性能测试的过程中,该装置可以通过特定的接口函数获取相应的内存对象转储文件;然后通过对该内存对象转储文件进行解析,进而监控更细粒度的不同对象的内存占用情况,具体可以执行步骤102至步骤103所述的过程。
102、对获取到的内存对象转储文件进行解析,得到不同类的对象。
例如,根据内存对象转储文件中记录的软件测试过程中的内存使用情况,从内存对象转储文件中解析得到不同的JAVA对象、Native对象、ROOT对象等,具体可以为不同的图片对象、视频对象、数据库对象、文本对象等。
103、对解析得到的对象进行内存占用监控,得到对象对应的内存占用信息。
例如,基于内存对象转储文件进行读取,统计不同的JAVA对象、Native对象、ROOT对象等分别对应的内存占用大小,并将内存占用较多的对象进行标记,发送给软件开发人员进行查看,方便开发人员基于这些不同对象的内存占用情况,对存在内存占用较大的对象直接进行调整,无需再对软件各对象分别进行分析,进而可以提高软件开发效率。
本发明实施例提供的一种内存占用分析方法,与目前通过应用软件相应的启动进程对内存的占用数值来判别该应用软件的内存占用情况相比,本发明实施例可以对软件测试对应的内存对象转储文件进行解析,得到不同类的对象,进而可以基于不同类的对象进行内存占用监控,得到不同对象分别对应的内存占用信息,可以细粒度的分析某一对象的内存占用情况,进而可以提高应用软件的内存占用分析的精度。
进一步的,为了更好的说明上述处理方法的过程,作为对上述实施例的细化和扩展,本发明实施例提供了另一种内存占用分析方法,以安卓(Android)系统为例,如图2所示,但不限于此,具体如下所示:
201、在安卓系统中,通过Debug类的预定dumpHprofData接口函数获取内存对象转储dump hprof文件。
202、根据内存对象转储dump hprof文件中记录的不同标签TAG值,分别创建各自对应类的对象。
例如,获取得到内存对象转储dump hprof文件之后,读取该dump hprof文件中记录的TAG值,其可能的取值为0x01至0x23,共35个值,依据这些TAG值,分别创建各自对应类的对象,以便根据解析得到的这些对象进行内存占用监控,得到对象对应的内存占用信息,实现细粒度的分析某一对象的内存占用情况。
具体地,对于本发明实施例,在创建对象之前,需要创建不同的集合以便在创建对象时进行调用,其中创建不同集合具体的实现过程可以包括:对内存对象转储dump hprof文件进行解析,若解析到TAG值为预定字符串信息的值,则根据当前读取位的下一个整型值和下一个字节的长度,创建字符串集合;若解析到TAG值为预定已加载类信息的值,则根据当前读取位的下一个整型值和已创建的字符串集合,创建已加载类集合;若解析到TAG值为预定函数调用栈信息的值,则根据当前读取位之后预置个数的整型值和已创建的字符串集合,创建调用栈对象集合;若解析到TAG值为预定栈帧信息的值,则根据当前读取位之后预设个数的字节和已创建的调用栈对象集合,创建调用栈帧集合。
其中,上述根据当前读取位的下一个整型值和下一个字节的长度,创建字符串集合的步骤具体可以包括:确定当前读取位的下一个整型值和下一个字节的长度,并将该整型值确定为标识号码;继续读取以该长度为个数的字节;根据以该长度为个数的字节的内容和该标识号码,创建字符串集合。
例如,预定字符串信息的值为0x01,对内存对象转储dump hprof文件进行解析,如果解析到的TAG值为0x01,读取下一个整型int值作为其标识号码ID;再读取下一个字节,该字节里面存储的内容即为字符串的长度length;然后再读取length个字节,这length个字节的内容即为字符串内容value;最后将ID和value按照键值对key、value的形式存储到映射map对象的字符串集合mStrings中,该字符串集合中保存有在每一次解析到的TAG值为0x01时,重复上述过程得到的ID值和字符串内容value值。
上述根据当前读取位的下一个整型值和已创建的字符串集合,创建已加载类集合的过程具体可以包括:确定当前读取位的下一个整型值,作为标识号码;根据该标识号码从已创建的字符串集合中查询对应的字符串值;将查询到的字符串值确定为类的类名;根据所述类名和所述标识号码创建已加载类集合。
例如,预定已加载类信息的值为0x02,对内存对象转储dump hprof文件进行解析,如果解析到的TAG值为0x02,读取下一个整型int值作为其标识号码ID;再以该ID值为key,从已创建的字符串集合mStrings中找到对应的字符串值,作为类的类名className;最后将ID和className按照键值对key、value的形式存储到映射map对象的已加载类集合mClasss中,该已加载类集合中保存有在每一次解析到的TAG值为0x02时,重复上述过程得到的ID值和className值。
上述根据当前读取位之后预置个数的整型值和已创建的字符串集合,创建调用栈对象集合的过程具体可以包括:确定当前读取位的下一个整型值,作为标识号码;继续读取下一个整型值之后预置个数的整型值,分别作为方法名标识、方法签名标识、源文件标识、序列号标识、行号标识;根据该方法名标识、方法签名标识、源文件标识、序列号标识、行号标识,在已创建的字符串集合中进行查询;根据查询结果创建函数调用栈信息;依据函数调用栈信息和标识号码,创建调用栈对象集合。
例如,预定函数调用栈信息的值为0x04,预置个数为5个,对内存对象转储dumphprof文件进行解析,如果解析到的TAG值为0x04,读取下一个整型int值作为其标识号码ID;再继续读取接下来的5个整型值,分别作为方法名标识methodNameID、方法签名标识methodSignatureID、源文件标识sourceFileID、序列号标识serialID、行号标识lineNumberID;然后使用这5个ID作为key,从已创建的字符串集合mStrings中找到各自对应的字符串值,分别作为方法名methodName、方法签名methodSignature、源文件sourceFile、序列号serial、行号lineNumber;再然后以methodName、methodSignature、sourceFile、serial、lineNumber这5个值创建一个函数调用栈信息frame;最后以标识号码ID、frame按照键值对key、value的形式存储到调用栈对象集合mFrames中,该调用栈对象集合中保存有在每一次解析到的TAG值为0x04时,重复上述过程得到的标识号码ID值和frame值。
上述根据当前读取位之后预设个数的字节和已创建的调用栈对象集合,创建调用栈帧集合的过程具体可以包括:继续读取当前读取位之后预设个数的字节,分别作为序列号码、线程序列号码、函数调用栈数;再继续读取以函数调用栈数为个数的字节,作为函数调用栈信息的标识;从调用栈对象集合中获取与函数调用栈信息的标识对应的函数调用栈信息,并组成调用栈集合;根据组成的调用栈集合、序列号码、线程序列号码,创建调用栈帧集合。
例如,预定栈帧信息的值为0x05,预设个数为5个,对内存对象转储dump hprof文件进行解析,如果解析到的TAG值为0x05,读取接下来的三个字节分别作为序列号码serialNumber、线程序列号码threadSerialNumber、函数调用栈数numFrames;再继续读取numFrames个字节作为函数调用栈信息frame的ID,从已创建的调用栈对象集合mFrames中按照该ID,查找到对应的函数调用栈信息frame,并组成调用栈集frames;最后以serialNumber、threadSerialNumber、frames三个值创建调用栈帧stackTrace,并将stackTrace和与该stackTrace对应的调用栈序列号码保存在调用栈帧集合mTraces中,该调用栈帧集合mTraces中保存有在每一次解析到的TAG值为0x05时,重复上述过程得到的stackTrace值和与该stackTrace对应的调用栈序列号码。
进一步的,在上述各个集合创建完毕后,若解析到TAG值为预定堆转储信息的值,则以当前读取位的下一个字节的长度为个数继续进行读取TAG值,并根据读取到的TAG值,创建对应类的对象。
例如,预定堆转储信息的值为0x0c或0x1c,在上述各个集合创建完毕后,对内存对象转储dump hprof文件进行解析,若解析到的TAG值为0x0c或0x1c,读取下一个字节作为其长度length;接下来循环读取length个数目的TAG值,根据读取到的TAG值,创建对应类的对象。
具体地,若读取到的TAG值为第一预定值,则根据读取到的TAG值,创建对应类的对象,具体可以包括:创建相应的根ROOT对象。
例如,第一预定值可以为oxff、0x01、0x05、0x07、0x89、0x8a、0x8b、0x8c、0x90中的一个,如果读取到的TAG值为这些值时,创建相应的ROOT对象,并存储到当前堆heap对象mheap的成员mRoots集合中。
若读取到的TAG值为第二预定值,则根据读取到的TAG值,创建对应类的对象,具体可以包括:继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈帧号码;从已创建的线程对象集合中查询与线程序列号码对应的线程对象;从已创建的调用栈帧集合中查询与线程对象的调用栈序列号码对应的调用栈帧信息;根据调用栈帧信息、标识号码、线程序列号码,创建相应的原始态Native对象、或JAVA对象、或原始态栈Native Stack对象、或线程块ThreadBlock对象。
例如,第二预定值可以为0x02、0x03、0x04、0x06中的一个,预设个数可以为3个,如果读取到的TAG值为0x02时,读取接下来的三个字节分别作为标识号码ID、线程序列号码threadSerialNumber、堆栈帧号码stackFrameNumber;根据threadSerialNumber,从已创建的线程对象集合mThreads中查找到对应的线程对象threadObj;再根据当前线程对象threadObj的调用栈序列号码traceSerialNumber值,从已经创建的调用栈帧集合mTraces中查询对应的调用栈帧信息trace;最后根据ID、threadSerialNumber、trace三个值创建Native对象nativeObj,并存储到mRoots集合中。
如果读取到的TAG值为0x03时,重复上述过程,并在最后根据ID、threadSerialNumber、trace三个值创建JAVA对象javaObj,并存储到mRoots集合中;如果读取到的TAG值为0x04时,重复上述过程,并在最后根据ID、threadSerialNumber、trace三个值创建native stack对象nativeStackObj,并存储到mRoots集合中;如果读取到的TAG值为0x06时,重复上述过程,并在最后根据ID、threadSerialNumber、trace三个值创建ThreadBlock对象threadBlockObj,并存储到mRoots集合中。
若读取到的TAG值为第三预定值,则根据读取到的TAG值,创建对应类的对象,具体可以包括:继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈帧号码;根据标识号码和堆栈帧号码创建线程对象Thread Object对象。
例如,第三预定值可以为0x08,预设个数可以为3个,如果读取到的TAG值为0x08时,读取接下来的三个字节分别作为标识号码ID、线程序列号码threadSerialNumber、堆栈序列号码stackSerialNumber;根据ID和stackFrameNumber值创建Thread Object对象threadObj;最后以stackFrameNumber和threadObj分别作为键值对key、value存储到线程集合对象集合mThreads中。
若读取到的TAG值为第四预定值,则根据读取到的TAG值,创建对应类的对象,具体可以包括:继续读取当前读取位之后预定个数的字节,分别作为标识号码、线程序列号码、超类号码、类加载器号码、对象实例尺寸、数目项、位置信息;从已创建的线程对象集合中查询与线程序列号码对应的线程对象;从已创建的调用栈帧集合中查询与线程对象的调用栈序列号码对应的调用栈帧信息;从已创建的已加载类集合中查询与标识号码对应的类名称;根据标识号码、调用栈帧信息、类名称、位置信息,创建类对象ClassObj对象,并根据超类号码和类加载器号码对ClassObj对象进行配置。
例如,第四预定值可以为0x20,预定个数可以为7个,如果读取到的TAG值为0x20时,读取接下来的7个字节分别作为标识号码ID、线程序列号码threadSerialNumber、超类号码superClassId,类加载器号码classLoaderId,对象实例尺寸instanceSize、数目项numEntries、位置信息position;根据threadSerialNumber,从已创建的线程对象集合mThreads中查询对应的线程对象threadObj;根据当前线程对象threadObj的调用栈序列号码traceSerialNumber值,从已经创建的调用栈帧集合mTraces中查询到对应的调用栈帧信息trace;根据ID值,从已创建的已加载类集合mClasss中查询到当前类class的名称className;然后根据ID、trace、className、position,创建ClassObj对象classObj,并配置classObj的superClassId和classLoaderId值为解析到的superClassId和classLoaderId;最后以ID、classObj分别作为键值对key、value,存储到类class集合的mClassesById中。
若读取到的TAG值为第五预定值,则根据读取到的TAG值,创建对应类的对象,具体可以包括:继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、类号码、剩余量、位置信息;从已创建的调用栈帧集合中查询与堆栈号码对应的调用栈帧信息;根据标识号码、调用栈帧信息、位置信息,创建类实例ClassInstance对象,并根据类号码对ClassInstance对象进行配置。
例如,第五预定值可以为0x21,预置个数可以为5个,如果读取到的TAG值为0x21时,读取接下来的5个字节分别作为标识号码ID、堆栈号码stackId、类号码classId、剩余量remaining、位置信息position;根据stackId,从已创建的调用栈帧集合mTraces中查询对应的调用栈帧信息stack;根据ID、stack、position三个值创建ClassInstance对象instance,并配置instance的classid值为classId;最后将以ID、instance分别作为键值对key、value,存储到堆heap对象的instance集合mInstance中。
若读取到的TAG值为第六预定值,则根据读取到的TAG值,创建对应类的对象,具体可以包括:继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、位置信息;从已创建的调用栈帧集合中查询与堆栈号码对应的调用栈帧信息;根据标识号码、调用栈帧信息、位置信息、元素数,创建数组实例ArrayInstance对象,并根据类号码对ArrayInstance对象进行配置。
例如,第六预定值可以为0x22,预置个数可以为5个,如果读取到的TAG值为0x22时,读取接下来的5个字节分别作为标识号码ID、堆栈号码stackId、元素数numElements、类号码classId、位置信息position;根据stackId,从已创建的调用栈帧集合mTraces中查询到对应的调用栈帧信息stack;然后根据ID、stack、position、numElements四个值创建ArrayInstance对象array,并配置array的classid值为classId;最后将以ID、array分别作为键值对key、value,存储到堆heap对象的instance集合mInstance中。
若读取到的TAG值为第七预定值,则根据读取到的TAG值,创建对应类的对象,具体可以包括:继续读取当前读取位之后特定个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、类型、位置信息;从已创建的调用栈帧集合中查询与堆栈号码对应的调用栈帧信息;根据标识号码、调用栈帧信息、位置信息、元素数,创建数组实例ArrayInstance对象,并根据类号码对ArrayInstance对象进行配置。
例如,第七预定值可以为0x23或0xc3,特定个数可以为6个,如果读取到的TAG值为0x23或0xc3时,读取接下来的6个字节分别作为标识号码ID、堆栈号码stackId、元素数numElements、类号码classId、类型type、位置信息position;再根据stackId,从已创建的调用栈帧集合中查询到对应的调用栈帧信息stack;然后根据ID、stack、type、numElements、position五个值创建ArrayInstance对象array,并配置array的classid值为classId;最后将以ID、array分别作为键值对key、value,存储到堆heap对象的instance集合mInstance中。
若读取到的TAG值为第八预定值,则根据读取到的TAG值,创建对应类的对象,具体可以包括:继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈深度;从预置线程对象集合中查询与线程序列号码对应的线程对象;根据线程对象的调用栈序列号码和所述堆栈深度,从调用栈帧集合中查询相应的调用栈帧信息;根据标识号码、线程序列号码、调用栈帧信息,创建根对象RootObj对象。
例如,第八预定值可以为0x8e,预设个数可以为3个,如果读取到的TAG值为0x8e时,读取接下来的三个字节分别作为标识号码ID、线程序列号码threadSerialNumber、堆栈深度stackDepth;再根据threadSerialNumber从已创建的线程对象集合mTheads中查询到当前的线程对象threadObj;然后根据threadObj的traceSerialNumber成员和stackDepth从已创建的mTraces集合中查询到当前的调用栈帧信息trace;最后根据ID、threadSerialNumber、trace三个值创建RootObj对象root,并将root对象添加到mRoots集合中。
进一步的,当读取到堆的TAG值时,可以做堆集合的处理,例如,如果读取到的TAG值为0xfe时,读取接下来的两个字节,分别作为堆标识heapId、堆名称标识heapNameId;根据heapNameId,从已创建的字符串集合mStrings集合中查询到当前的堆heap名称heapName;最后以heapId、heapName分别作为键值对key、value,存储到heap集合mHeaps中。
203、对解析得到的对象进行内存占用监控,得到对象对应的内存占用信息。
例如,可以针对上述实例中根ROOT对象、原始态Native对象、JAVA对象、原始态栈Native Stack对象、线程块Thread Block对象、线程对象Thread Object、类对象ClassObj等进行内存占用监控,得到不同对象的内存占用情况,并发送给软件开发人员进行查看,如图3所示,软件A中不同对象的内存占用情况,这样方便开发人员基于这些不同对象的内存占用情况,对存在内存占用较大的对象直接进行调整。
本发明实施例提供的另一种内存占用分析方法,与目前通过应用软件相应的启动进程对内存的占用数值来判别该应用软件的内存占用情况相比,可以实现基于不同类的对象进行内存占用监控,得到不同对象分别对应的内存占用信息,进而可以细粒度的分析某一对象的内存占用情况,从而可以提高应用软件的内存占用分析的精度。
进一步的,作为图1和图2所述方法的具体实现,本发明实施例提供了一种内存占用分析装置,如图4所示,所述服务器包括:获取单元31、解析单元32、监控单元33。
获取单元31,可以用于获取软件测试对应的内存对象转储文件;获取单元31为本装置中获取内存对象转储文件的主要功能模块。
解析单元32,用于对所述获取单元31获取的内存对象转储文件进行解析,得到不同类的对象;解析单元32为本装置中对内存对象转储文件进行解析的主要功能模块,为本装置中的核心单元模块。
监控单元33,可以用于对所述解析单元32解析到的对象进行内存占用监控,得到所述对象对应的内存占用信息。监控单元33为本装置中监控不同对象内存占用信息的主要功能模块。
在具体的应用场景中,所述解析单元32,具体可以用于根据所述内存对象转储文件中记录的不同标签TAG值,分别创建各自对应类的对象。
在具体的应用场景中,如图5所示,所述解析单元32具体可以包括:解析模块321、创建模块322。
解析模块321,可以用于对所述内存对象转储文件进行解析。
创建模块322,可以用于若所述解析模块321解析到TAG值为预定字符串信息的值,则根据当前读取位的下一个整型值和下一个字节的长度,创建字符串集合;若解析到TAG值为预定已加载类信息的值,则根据当前读取位的下一个整型值和所述字符串集合,创建已加载类集合;若解析到TAG值为预定函数调用栈信息的值,则根据当前读取位之后预置个数的整型值和所述字符串集合,创建调用栈对象集合;若解析到TAG值为预定栈帧信息的值,则根据当前读取位之后预设个数的字节和所述调用栈对象集合,创建调用栈帧集合;若解析到TAG值为预定堆转储信息的值,则以当前读取位的下一个字节的长度为个数继续进行读取TAG值,并根据读取到的TAG值,创建对应类的对象。
在具体的应用场景中,所述创建模块322,具体可以用于若读取到的TAG值为第一预定值,则创建相应的根ROOT对象。
在具体的应用场景中,所述创建模块322,具体还可以用于若读取到的TAG值为第二预定值,则继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈帧号码;从预置线程对象集合中查询与所述线程序列号码对应的线程对象;从所述调用栈帧集合中查询与所述线程对象的调用栈序列号码对应的调用栈帧信息;根据所述调用栈帧信息、所述标识号码、所述线程序列号码,创建相应的原始态Native对象、或JAVA对象、或原始态栈Native Stack对象、或线程块ThreadBlock对象。
在具体的应用场景中,所述创建模块322,具体还可以用于若读取到的TAG值为第三预定值,则继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈序列号码;根据所述标识号码和所述堆栈序列号码创建线程对象Thread Object对象。
在具体的应用场景中,所述创建模块322,具体还可以用于若读取到的TAG值为第四预定值,则继续读取当前读取位之后预定个数的字节,分别作为标识号码、线程序列号码、超类号码、类加载器号码、对象实例尺寸、数目项、位置信息;从预置线程对象集合中查询与所述线程序列号码对应的线程对象;从所述调用栈帧集合中查询与所述线程对象的调用栈序列号码对应的调用栈帧信息;从所述已加载类集合中查询与所述标识号码对应的类名称;根据所述标识号码、所述调用栈帧信息、所述类名称、所述位置信息,创建类对象ClassObj对象,并根据所述超类号码和所述类加载器号码对所述ClassObj对象进行配置。
在具体的应用场景中,所述创建模块322,具体还可以用于若读取到的TAG值为第五预定值,则继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、类号码、剩余量、位置信息;从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;根据所述标识号码、所述调用栈帧信息、所述位置信息,创建类实例ClassInstance对象,并根据所述类号码对所述ClassInstance对象进行配置。
在具体的应用场景中,所述创建模块322,具体还可以用于若读取到的TAG值为第六预定值,则继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、位置信息;从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;根据所述标识号码、所述调用栈帧信息、所述位置信息、所述元素数,创建数组实例ArrayInstance对象,并根据所述类号码对所述ArrayInstance对象进行配置。
在具体的应用场景中,所述创建模块322,具体还可以用于若读取到的TAG值为第七预定值,则继续读取当前读取位之后特定个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、类型、位置信息;从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;根据所述标识号码、所述调用栈帧信息、所述位置信息、所述元素数,创建数组实例ArrayInstance对象,并根据所述类号码对所述ArrayInstance对象进行配置。
在具体的应用场景中,所述创建模块322,具体还可以用于若读取到的TAG值为第八预定值,则继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈深度;从预置线程对象集合中查询与所述线程序列号码对应的线程对象;根据所述线程对象的调用栈序列号码和所述堆栈深度,从所述调用栈帧集合中查询相应的调用栈帧信息;根据所述标识号码、所述线程序列号码、所述调用栈帧信息,创建根对象RootObj对象。
在具体的应用场景中,所述创建模块322,具体还可以用于确定当前读取位的下一个整型值和下一个字节的长度,并将所述整型值确定为标识号码;继续读取以所述长度为个数的字节;根据以所述长度为个数的字节的内容和所述标识号码,创建字符串集合。
在具体的应用场景中,所述创建模块322,具体还可以用于确定当前读取位的下一个整型值,作为标识号码;根据所述标识号码从所述字符串集合中查询对应的字符串值;将所述字符串值确定为类的类名;根据所述类名和所述标识号码创建已加载类集合。
在具体的应用场景中,所述创建模块322,具体还可以用于确定当前读取位的下一个整型值,作为标识号码;继续读取所述下一个整型值之后预置个数的整型值,分别作为方法名标识、方法签名标识、源文件标识、序列号标识、行号标识;根据所述方法名标识、所述方法签名标识、所述源文件标识、所述序列号标识、所述行号标识,在所述字符串集合中进行查询;根据查询结果创建函数调用栈信息;依据所述函数调用栈信息和所述标识号码,创建调用栈对象集合。
在具体的应用场景中,所述创建模块322,具体还可以用于继续读取当前读取位之后预设个数的字节,分别作为序列号码、线程序列号码、函数调用栈数;再继续读取以所述函数调用栈数为个数的字节,作为函数调用栈信息的标识;从所述调用栈对象集合中获取与所述函数调用栈信息的标识对应的函数调用栈信息,并组成调用栈集合;根据所述调用栈集合、所述序列号码、所述线程序列号码,创建调用栈帧集合。
需要说明的是,本发明实施例提供的一种内存占用分析装置所涉及各功能单元的其他相应描述,可以参考图1和图2中的对应描述,在此不再赘述。
基于上述如图1所示方法,相应的,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:获取软件测试对应的内存对象转储文件;对所述内存对象转储文件进行解析,得到不同类的对象;对所述对象进行内存占用监控,得到所述对象对应的内存占用信息。
基于上述如图1所示方法和如图4和图5所示装置的实施例,本发明实施例还提供了一种内存占用分析的实体装置,如图6所示,该装置包括:处理器41、存储器42、及存储在存储器42上并可在处理器上运行的计算机程序,所述处理器41执行所述程序时实现以下步骤:获取软件测试对应的内存对象转储文件;对所述内存对象转储文件进行解析,得到不同类的对象;对所述对象进行内存占用监控,得到所述对象对应的内存占用信息;该装置还包括:总线43,被配置为耦接处理器41及存储器42。
通过应用本发明的技术方案,可以细粒度的分析某一对象的内存占用情况,进而可以提高应用软件的内存占用分析的精度。
A1、一种内存占用分析方法,包括:
获取软件测试对应的内存对象转储文件;
对所述内存对象转储文件进行解析,得到不同类的对象;
对所述对象进行内存占用监控,得到所述对象对应的内存占用信息。
A2、如A1所述的方法,所述对所述内存对象转储文件进行解析,得到不同类的对象,具体包括:
根据所述内存对象转储文件中记录的不同标签TAG值,分别创建各自对应类的对象。
A3、如A2所述的方法,所述根据所述内存对象转储文件中记录的不同标签TAG值,分别创建各自对应类的对象,具体包括:
对所述内存对象转储文件进行解析,若解析到TAG值为预定字符串信息的值,则根据当前读取位的下一个整型值和下一个字节的长度,创建字符串集合;
若解析到TAG值为预定已加载类信息的值,则根据当前读取位的下一个整型值和所述字符串集合,创建已加载类集合;
若解析到TAG值为预定函数调用栈信息的值,则根据当前读取位之后预置个数的整型值和所述字符串集合,创建调用栈对象集合;
若解析到TAG值为预定栈帧信息的值,则根据当前读取位之后预设个数的字节和所述调用栈对象集合,创建调用栈帧集合;
若解析到TAG值为预定堆转储信息的值,则以当前读取位的下一个字节的长度为个数继续进行读取TAG值,并根据读取到的TAG值,创建对应类的对象。
A4、如A3所述的方法,若读取到的TAG值为第一预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
创建相应的根ROOT对象。
A5、如A3所述的方法,若读取到的TAG值为第二预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈帧号码;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
从所述调用栈帧集合中查询与所述线程对象的调用栈序列号码对应的调用栈帧信息;
根据所述调用栈帧信息、所述标识号码、所述线程序列号码,创建相应的原始态Native对象、或JAVA对象、或原始态栈Native Stack对象、或线程块ThreadBlock对象。
A6、如A3所述的方法,若读取到的TAG值为第三预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈序列号码;
根据所述标识号码和所述堆栈序列号码创建线程对象Thread Object对象。
A7、如A3所述的方法,若读取到的TAG值为第四预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预定个数的字节,分别作为标识号码、线程序列号码、超类号码、类加载器号码、对象实例尺寸、数目项、位置信息;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
从所述调用栈帧集合中查询与所述线程对象的调用栈序列号码对应的调用栈帧信息;
从所述已加载类集合中查询与所述标识号码对应的类名称;
根据所述标识号码、所述调用栈帧信息、所述类名称、所述位置信息,创建类对象ClassObj对象,并根据所述超类号码和所述类加载器号码对所述ClassObj对象进行配置。
A8、如A3所述的方法,若读取到的TAG值为第五预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、类号码、剩余量、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息,创建类实例ClassInstance对象,并根据所述类号码对所述ClassInstance对象进行配置。
A9、如A3所述的方法,若读取到的TAG值为第六预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息、所述元素数,创建数组实例ArrayInstance对象,并根据所述类号码对所述ArrayInstance对象进行配置。
A10、如A3所述的方法,若读取到的TAG值为第七预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后特定个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、类型、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息、所述元素数,创建数组实例ArrayInstance对象,并根据所述类号码对所述ArrayInstance对象进行配置。
A11、如A3所述的方法,若读取到的TAG值为第八预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈深度;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
根据所述线程对象的调用栈序列号码和所述堆栈深度,从所述调用栈帧集合中查询相应的调用栈帧信息;
根据所述标识号码、所述线程序列号码、所述调用栈帧信息,创建根对象RootObj对象。
A12、如A3所述的方法,所述根据当前读取位的下一个整型值和下一个字节的长度,创建字符串集合,具体包括:
确定当前读取位的下一个整型值和下一个字节的长度,并将所述整型值确定为标识号码;
继续读取以所述长度为个数的字节;
根据以所述长度为个数的字节的内容和所述标识号码,创建字符串集合。
13、如12所述的方法,所述根据当前读取位之后预置个数的整型值和所述字符串集合,创建调用栈对象集合,具体包括:
确定当前读取位的下一个整型值,作为标识号码;
根据所述标识号码从所述字符串集合中查询对应的字符串值;
将所述字符串值确定为类的类名;
根据所述类名和所述标识号码创建已加载类集合。
14、如12所述的方法,所述根据当前读取位之后预置个数的整型值和所述字符串集合,创建调用栈对象集合,具体包括:
确定当前读取位的下一个整型值,作为标识号码;
继续读取所述下一个整型值之后预置个数的整型值,分别作为方法名标识、方法签名标识、源文件标识、序列号标识、行号标识;
根据所述方法名标识、所述方法签名标识、所述源文件标识、所述序列号标识、所述行号标识,在所述字符串集合中进行查询;
根据查询结果创建函数调用栈信息;
依据所述函数调用栈信息和所述标识号码,创建调用栈对象集合。
15、如14所述的方法,所述根据当前读取位之后预设个数的字节和所述调用栈对象集合,创建调用栈帧集合,具体包括:
继续读取当前读取位之后预设个数的字节,分别作为序列号码、线程序列号码、函数调用栈数;
再继续读取以所述函数调用栈数为个数的字节,作为函数调用栈信息的标识;
从所述调用栈对象集合中获取与所述函数调用栈信息的标识对应的函数调用栈信息,并组成调用栈集合;
根据所述调用栈集合、所述序列号码、所述线程序列号码,创建调用栈帧集合。
B16、一种内存占用分析装置,包括:
获取单元,用于获取软件测试对应的内存对象转储文件;
解析单元,用于对所述获取单元获取的内存对象转储文件进行解析,得到不同类的对象;
监控单元,用于对所述解析单元解析到的对象进行内存占用监控,得到所述对象对应的内存占用信息。
B17、如B16所述的装置,
所述解析单元,具体用于根据所述内存对象转储文件中记录的不同标签TAG值,分别创建各自对应类的对象。
B18、如B17所述的装置,所述解析单元具体包括:
解析模块,用于对所述内存对象转储文件进行解析;
创建模块,用于若所述解析模块解析到TAG值为预定字符串信息的值,则根据当前读取位的下一个整型值和下一个字节的长度,创建字符串集合;
若解析到TAG值为预定已加载类信息的值,则根据当前读取位的下一个整型值和所述字符串集合,创建已加载类集合;
若解析到TAG值为预定函数调用栈信息的值,则根据当前读取位之后预置个数的整型值和所述字符串集合,创建调用栈对象集合;
若解析到TAG值为预定栈帧信息的值,则根据当前读取位之后预设个数的字节和所述调用栈对象集合,创建调用栈帧集合;
若解析到TAG值为预定堆转储信息的值,则以当前读取位的下一个字节的长度为个数继续进行读取TAG值,并根据读取到的TAG值,创建对应类的对象。
B19、如B18所述的装置,
所述创建模块,具体用于若读取到的TAG值为第一预定值,则创建相应的根ROOT对象。
B20、如B18所述的装置,
所述创建模块,具体用于若读取到的TAG值为第二预定值,则继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈帧号码;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
从所述调用栈帧集合中查询与所述线程对象的调用栈序列号码对应的调用栈帧信息;
根据所述调用栈帧信息、所述标识号码、所述线程序列号码,创建相应的原始态Native对象、或JAVA对象、或原始态栈Native Stack对象、或线程块ThreadBlock对象。
B21、如B18所述的装置,
所述创建模块,具体用于若读取到的TAG值为第三预定值,则继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈序列号码;
根据所述标识号码和所述堆栈序列号码创建线程对象Thread Object对象。
B22、如B18所述的装置,
所述创建模块,具体用于若读取到的TAG值为第四预定值,则继续读取当前读取位之后预定个数的字节,分别作为标识号码、线程序列号码、超类号码、类加载器号码、对象实例尺寸、数目项、位置信息;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
从所述调用栈帧集合中查询与所述线程对象的调用栈序列号码对应的调用栈帧信息;
从所述已加载类集合中查询与所述标识号码对应的类名称;
根据所述标识号码、所述调用栈帧信息、所述类名称、所述位置信息,创建类对象ClassObj对象,并根据所述超类号码和所述类加载器号码对所述ClassObj对象进行配置。
B23、如B18所述的装置,
所述创建模块,具体用于若读取到的TAG值为第五预定值,则继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、类号码、剩余量、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息,创建类实例ClassInstance对象,并根据所述类号码对所述ClassInstance对象进行配置。
B24、如B18所述的装置,
所述创建模块,具体用于若读取到的TAG值为第六预定值,则继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息、所述元素数,创建数组实例ArrayInstance对象,并根据所述类号码对所述ArrayInstance对象进行配置。
B25、如B18所述的装置,
所述创建模块,具体用于若读取到的TAG值为第七预定值,则继续读取当前读取位之后特定个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、类型、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息、所述元素数,创建数组实例ArrayInstance对象,并根据所述类号码对所述ArrayInstance对象进行配置。
B26、如B18所述的装置,
所述创建模块,具体用于若读取到的TAG值为第八预定值,则继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈深度;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
根据所述线程对象的调用栈序列号码和所述堆栈深度,从所述调用栈帧集合中查询相应的调用栈帧信息;
根据所述标识号码、所述线程序列号码、所述调用栈帧信息,创建根对象RootObj对象。
B27、如B18所述的装置,
所述创建模块,具体用于确定当前读取位的下一个整型值和下一个字节的长度,并将所述整型值确定为标识号码;
继续读取以所述长度为个数的字节;
根据以所述长度为个数的字节的内容和所述标识号码,创建字符串集合。
B28、如B27所述的装置,
所述创建模块,具体还用于确定当前读取位的下一个整型值,作为标识号码;
根据所述标识号码从所述字符串集合中查询对应的字符串值;
将所述字符串值确定为类的类名;
根据所述类名和所述标识号码创建已加载类集合。
B29、如B27所述的装置,
所述创建模块,具体还用于确定当前读取位的下一个整型值,作为标识号码;
继续读取所述下一个整型值之后预置个数的整型值,分别作为方法名标识、方法签名标识、源文件标识、序列号标识、行号标识;
根据所述方法名标识、所述方法签名标识、所述源文件标识、所述序列号标识、所述行号标识,在所述字符串集合中进行查询;
根据查询结果创建函数调用栈信息;
依据所述函数调用栈信息和所述标识号码,创建调用栈对象集合。
B30、如B29所述的装置,
所述创建模块,具体还用于继续读取当前读取位之后预设个数的字节,分别作为序列号码、线程序列号码、函数调用栈数;
再继续读取以所述函数调用栈数为个数的字节,作为函数调用栈信息的标识;
从所述调用栈对象集合中获取与所述函数调用栈信息的标识对应的函数调用栈信息,并组成调用栈集合;
根据所述调用栈集合、所述序列号码、所述线程序列号码,创建调用栈帧集合。
C31、一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:
获取软件测试对应的内存对象转储文件;
对所述内存对象转储文件进行解析,得到不同类的对象;
对所述对象进行内存占用监控,得到所述对象对应的内存占用信息。
D32、一种内存占用分析装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:
获取软件测试对应的内存对象转储文件;
对所述内存对象转储文件进行解析,得到不同类的对象;
对所述对象进行内存占用监控,得到所述对象对应的内存占用信息。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
可以理解的是,上述方法及装置中的相关特征可以相互参考。另外,上述实施例中的“第一”、“第二”等是用于区分各实施例,而并不代表各实施例的优劣。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的一种内存占用分析方法、装置及系统中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
Claims (28)
1.一种内存占用分析方法,其特征在于,包括:
获取软件测试对应的内存对象转储文件;
对所述内存对象转储文件进行解析,得到不同类的对象;
对所述对象进行内存占用监控,得到所述对象对应的内存占用信息;
其中,对所述内存对象转储文件进行解析,得到不同类的对象,具体包括:
根据所述内存对象转储文件中记录的不同标签TAG值,分别创建各自对应类的对象,具体包括:
对所述内存对象转储文件进行解析,若解析到TAG值为预定字符串信息的值,则根据当前读取位的下一个整型值和下一个字节的长度,创建字符串集合;
若解析到TAG值为预定已加载类信息的值,则根据当前读取位的下一个整型值和所述字符串集合,创建已加载类集合;
若解析到TAG值为预定函数调用栈信息的值,则根据当前读取位之后预置个数的整型值和所述字符串集合,创建调用栈对象集合;
若解析到TAG值为预定栈帧信息的值,则根据当前读取位之后预设个数的字节和所述调用栈对象集合,创建调用栈帧集合;
若解析到TAG值为预定堆转储信息的值,则以当前读取位的下一个字节的长度为个数继续进行读取TAG值,并根据读取到的TAG值,创建对应类的对象。
2.根据权利要求1所述的方法,其特征在于,若读取到的TAG值为第一预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
创建相应的根ROOT对象。
3.根据权利要求1所述的方法,其特征在于,若读取到的TAG值为第二预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈帧号码;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
从所述调用栈帧集合中查询与所述线程对象的调用栈序列号码对应的调用栈帧信息;
根据所述调用栈帧信息、所述标识号码、所述线程序列号码,创建相应的原始态Native对象、或JAVA对象、或原始态栈Native Stack对象、或线程块Thread Block对象。
4.根据权利要求1所述的方法,其特征在于,若读取到的TAG值为第三预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈序列号码;
根据所述标识号码和所述堆栈序列号码创建线程对象Thread Object对象。
5.根据权利要求1所述的方法,其特征在于,若读取到的TAG值为第四预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预定个数的字节,分别作为标识号码、线程序列号码、超类号码、类加载器号码、对象实例尺寸、数目项、位置信息;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
从所述调用栈帧集合中查询与所述线程对象的调用栈序列号码对应的调用栈帧信息;
从所述已加载类集合中查询与所述标识号码对应的类名称;
根据所述标识号码、所述调用栈帧信息、所述类名称、所述位置信息,创建类对象ClassObj对象,并根据所述超类号码和所述类加载器号码对所述ClassObj对象进行配置。
6.根据权利要求1所述的方法,其特征在于,若读取到的TAG值为第五预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、类号码、剩余量、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息,创建类实例ClassInstance对象,并根据所述类号码对所述ClassInstance对象进行配置。
7.根据权利要求1所述的方法,其特征在于,若读取到的TAG值为第六预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息、所述元素数,创建数组实例ArrayInstance对象,并根据所述类号码对所述ArrayInstance对象进行配置。
8.根据权利要求1所述的方法,其特征在于,若读取到的TAG值为第七预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后特定个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、类型、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息、所述元素数,创建数组实例ArrayInstance对象,并根据所述类号码对所述ArrayInstance对象进行配置。
9.根据权利要求1所述的方法,其特征在于,若读取到的TAG值为第八预定值,则所述根据读取到的TAG值,创建对应类的对象,具体包括:
继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈深度;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
根据所述线程对象的调用栈序列号码和所述堆栈深度,从所述调用栈帧集合中查询相应的调用栈帧信息;
根据所述标识号码、所述线程序列号码、所述调用栈帧信息,创建根对象RootObj对象。
10.根据权利要求1所述的方法,其特征在于,所述根据当前读取位的下一个整型值和下一个字节的长度,创建字符串集合,具体包括:
确定当前读取位的下一个整型值和下一个字节的长度,并将所述整型值确定为标识号码;
继续读取以所述长度为个数的字节;
根据以所述长度为个数的字节的内容和所述标识号码,创建字符串集合。
11.根据权利要求10所述的方法,其特征在于,所述根据当前读取位之后预置个数的整型值和所述字符串集合,创建调用栈对象集合,具体包括:
确定当前读取位的下一个整型值,作为标识号码;
根据所述标识号码从所述字符串集合中查询对应的字符串值;
将所述字符串值确定为类的类名;
根据所述类名和所述标识号码创建已加载类集合。
12.根据权利要求10所述的方法,其特征在于,所述根据当前读取位之后预置个数的整型值和所述字符串集合,创建调用栈对象集合,具体包括:
确定当前读取位的下一个整型值,作为标识号码;
继续读取所述下一个整型值之后预置个数的整型值,分别作为方法名标识、方法签名标识、源文件标识、序列号标识、行号标识;
根据所述方法名标识、所述方法签名标识、所述源文件标识、所述序列号标识、所述行号标识,在所述字符串集合中进行查询;
根据查询结果创建函数调用栈信息;
依据所述函数调用栈信息和所述标识号码,创建调用栈对象集合。
13.根据权利要求12所述的方法,其特征在于,所述根据当前读取位之后预设个数的字节和所述调用栈对象集合,创建调用栈帧集合,具体包括:
继续读取当前读取位之后预设个数的字节,分别作为序列号码、线程序列号码、函数调用栈数;
再继续读取以所述函数调用栈数为个数的字节,作为函数调用栈信息的标识;
从所述调用栈对象集合中获取与所述函数调用栈信息的标识对应的函数调用栈信息,并组成调用栈集合;
根据所述调用栈集合、所述序列号码、所述线程序列号码,创建调用栈帧集合。
14.一种内存占用分析装置,其特征在于,包括:
获取单元,用于获取软件测试对应的内存对象转储文件;
解析单元,用于对所述获取单元获取的内存对象转储文件进行解析,得到不同类的对象;
监控单元,用于对所述解析单元解析到的对象进行内存占用监控,得到所述对象对应的内存占用信息;
其中,所述解析单元,具体用于根据所述内存对象转储文件中记录的不同标签TAG值,分别创建各自对应类的对象,所述解析单元具体包括:
解析模块,用于对所述内存对象转储文件进行解析;
创建模块,用于若所述解析模块解析到TAG值为预定字符串信息的值,则根据当前读取位的下一个整型值和下一个字节的长度,创建字符串集合;
若解析到TAG值为预定已加载类信息的值,则根据当前读取位的下一个整型值和所述字符串集合,创建已加载类集合;
若解析到TAG值为预定函数调用栈信息的值,则根据当前读取位之后预置个数的整型值和所述字符串集合,创建调用栈对象集合;
若解析到TAG值为预定栈帧信息的值,则根据当前读取位之后预设个数的字节和所述调用栈对象集合,创建调用栈帧集合;
若解析到TAG值为预定堆转储信息的值,则以当前读取位的下一个字节的长度为个数继续进行读取TAG值,并根据读取到的TAG值,创建对应类的对象。
15.根据权利要求14所述的装置,其特征在于,
所述创建模块,具体用于若读取到的TAG值为第一预定值,则创建相应的根ROOT对象。
16.根据权利要求14所述的装置,其特征在于,
所述创建模块,具体用于若读取到的TAG值为第二预定值,则继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈帧号码;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
从所述调用栈帧集合中查询与所述线程对象的调用栈序列号码对应的调用栈帧信息;
根据所述调用栈帧信息、所述标识号码、所述线程序列号码,创建相应的原始态Native对象、或JAVA对象、或原始态栈Native Stack对象、或线程块Thread Block对象。
17.根据权利要求14所述的装置,其特征在于,
所述创建模块,具体用于若读取到的TAG值为第三预定值,则继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈序列号码;
根据所述标识号码和所述堆栈序列号码创建线程对象Thread Object对象。
18.根据权利要求14所述的装置,其特征在于,
所述创建模块,具体用于若读取到的TAG值为第四预定值,则继续读取当前读取位之后预定个数的字节,分别作为标识号码、线程序列号码、超类号码、类加载器号码、对象实例尺寸、数目项、位置信息;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
从所述调用栈帧集合中查询与所述线程对象的调用栈序列号码对应的调用栈帧信息;
从所述已加载类集合中查询与所述标识号码对应的类名称;
根据所述标识号码、所述调用栈帧信息、所述类名称、所述位置信息,创建类对象ClassObj对象,并根据所述超类号码和所述类加载器号码对所述ClassObj对象进行配置。
19.根据权利要求14所述的装置,其特征在于,
所述创建模块,具体用于若读取到的TAG值为第五预定值,则继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、类号码、剩余量、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息,创建类实例ClassInstance对象,并根据所述类号码对所述ClassInstance对象进行配置。
20.根据权利要求14所述的装置,其特征在于,
所述创建模块,具体用于若读取到的TAG值为第六预定值,则继续读取当前读取位之后预置个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息、所述元素数,创建数组实例ArrayInstance对象,并根据所述类号码对所述ArrayInstance对象进行配置。
21.根据权利要求14所述的装置,其特征在于,
所述创建模块,具体用于若读取到的TAG值为第七预定值,则继续读取当前读取位之后特定个数的字节,分别作为标识号码、堆栈号码、元素数、类号码、类型、位置信息;
从所述调用栈帧集合中查询与所述堆栈号码对应的调用栈帧信息;
根据所述标识号码、所述调用栈帧信息、所述位置信息、所述元素数,创建数组实例ArrayInstance对象,并根据所述类号码对所述ArrayInstance对象进行配置。
22.根据权利要求14所述的装置,其特征在于,
所述创建模块,具体用于若读取到的TAG值为第八预定值,则继续读取当前读取位之后预设个数的字节,分别作为标识号码、线程序列号码、堆栈深度;
从预置线程对象集合中查询与所述线程序列号码对应的线程对象;
根据所述线程对象的调用栈序列号码和所述堆栈深度,从所述调用栈帧集合中查询相应的调用栈帧信息;
根据所述标识号码、所述线程序列号码、所述调用栈帧信息,创建根对象RootObj对象。
23.根据权利要求14所述的装置,其特征在于,
所述创建模块,具体用于确定当前读取位的下一个整型值和下一个字节的长度,并将所述整型值确定为标识号码;
继续读取以所述长度为个数的字节;
根据以所述长度为个数的字节的内容和所述标识号码,创建字符串集合。
24.根据权利要求23所述的装置,其特征在于,
所述创建模块,具体还用于确定当前读取位的下一个整型值,作为标识号码;
根据所述标识号码从所述字符串集合中查询对应的字符串值;
将所述字符串值确定为类的类名;
根据所述类名和所述标识号码创建已加载类集合。
25.根据权利要求23所述的装置,其特征在于,
所述创建模块,具体还用于确定当前读取位的下一个整型值,作为标识号码;
继续读取所述下一个整型值之后预置个数的整型值,分别作为方法名标识、方法签名标识、源文件标识、序列号标识、行号标识;
根据所述方法名标识、所述方法签名标识、所述源文件标识、所述序列号标识、所述行号标识,在所述字符串集合中进行查询;
根据查询结果创建函数调用栈信息;
依据所述函数调用栈信息和所述标识号码,创建调用栈对象集合。
26.根据权利要求25所述的装置,其特征在于,
所述创建模块,具体还用于继续读取当前读取位之后预设个数的字节,分别作为序列号码、线程序列号码、函数调用栈数;
再继续读取以所述函数调用栈数为个数的字节,作为函数调用栈信息的标识;
从所述调用栈对象集合中获取与所述函数调用栈信息的标识对应的函数调用栈信息,并组成调用栈集合;
根据所述调用栈集合、所述序列号码、所述线程序列号码,创建调用栈帧集合。
27.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1所述的一种内存占用分析方法的步骤。
28.一种内存占用分析装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1所述的一种内存占用分析方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710476798.0A CN107291619B (zh) | 2017-06-21 | 2017-06-21 | 内存占用分析方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710476798.0A CN107291619B (zh) | 2017-06-21 | 2017-06-21 | 内存占用分析方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107291619A CN107291619A (zh) | 2017-10-24 |
CN107291619B true CN107291619B (zh) | 2021-04-02 |
Family
ID=60098049
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710476798.0A Expired - Fee Related CN107291619B (zh) | 2017-06-21 | 2017-06-21 | 内存占用分析方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107291619B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109240773B (zh) * | 2018-08-20 | 2022-08-16 | 武汉斗鱼网络科技有限公司 | 解决房间串数据的方法、装置、终端及可读存储介质 |
CN111966472B (zh) * | 2020-07-02 | 2023-09-26 | 佛山科学技术学院 | 一种工业实时操作系统的进程调度方法及系统 |
CN114546590B (zh) * | 2022-02-18 | 2023-03-14 | 北京基调网络股份有限公司 | Java虚拟机堆内存集合对象监测方法及内存溢出分析方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102662850A (zh) * | 2012-03-30 | 2012-09-12 | 杭州华三通信技术有限公司 | 一种内存管理方法及其系统 |
CN105490876A (zh) * | 2015-11-26 | 2016-04-13 | 上海斐讯数据通信技术有限公司 | 发包联动并发监控自动化测试服务器性能的方法 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104133761A (zh) * | 2013-11-28 | 2014-11-05 | 腾讯科技(成都)有限公司 | 一种移动终端的内存占用分析方法、装置和系统 |
US9514025B2 (en) * | 2015-04-15 | 2016-12-06 | International Business Machines Corporation | Modeling memory use of applications |
CN105260294A (zh) * | 2015-11-16 | 2016-01-20 | 曙光信息产业(北京)有限公司 | 一种应用程序占用内存的监控方法及装置 |
CN105511963B (zh) * | 2015-11-30 | 2019-12-10 | Tcl集团股份有限公司 | 一种基于Android系统的内存优化方法及系统 |
-
2017
- 2017-06-21 CN CN201710476798.0A patent/CN107291619B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102662850A (zh) * | 2012-03-30 | 2012-09-12 | 杭州华三通信技术有限公司 | 一种内存管理方法及其系统 |
CN105490876A (zh) * | 2015-11-26 | 2016-04-13 | 上海斐讯数据通信技术有限公司 | 发包联动并发监控自动化测试服务器性能的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN107291619A (zh) | 2017-10-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8336029B1 (en) | Debugger connection | |
CN105589805B (zh) | 一种代码覆盖率报告的生成方法和装置 | |
CN107066519B (zh) | 一种任务检测方法及装置 | |
CN107291619B (zh) | 内存占用分析方法及装置 | |
CN111190825A (zh) | 自动测试方法、系统及机器人 | |
CN111273891A (zh) | 基于规则引擎的业务决策方法、装置及终端设备 | |
CN111831542B (zh) | Api应用调测方法及装置、存储介质 | |
CN108023905B (zh) | 物联网应用系统及方法 | |
CN114064712A (zh) | 数据访问方法、装置、电子设备及计算机可读存储介质 | |
CN112671878B (zh) | 一种区块链的信息订阅方法、装置、服务器和存储介质 | |
CN110609666B (zh) | 打印机配置方法、装置、电子设备及可读存储介质 | |
CN113806216A (zh) | 接口测试方法、装置、介质及设备 | |
CN112612460A (zh) | 接口的封装和调用方法、电子设备、及存储介质 | |
CN112181479A (zh) | 代码文件版本间差异的确定方法、装置及电子设备 | |
CN107506299B (zh) | 一种代码分析方法及终端设备 | |
CN107767434B (zh) | 虚拟现实技术中纹理贴图配置信息的获取方法、存储介质 | |
CN112631949B (zh) | 一种调试方法、装置、计算机设备及存储介质 | |
CN115509913A (zh) | 软件自动化测试方法、装置、机器可读介质及设备 | |
AU2013206622B2 (en) | Download management method and device based on Android browser | |
CN110262912B (zh) | 一种过程调用gRPC的调用方法及装置 | |
CN108848398B (zh) | 一种本地弹幕消息的分发方法、装置、终端和存储介质 | |
CN112764761A (zh) | 一种程序中断文件解析方法、存储介质、电子设备及系统 | |
CN114157662A (zh) | 一种云平台参数适配方法、装置、终端设备及储存介质 | |
CN106713902A (zh) | 一种摄像模组的故障检测方法、装置及终端 | |
CN105955991A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20210402 |