用于发现内存泄漏和运行期信息的对象堆分析技术的制作方法

文档序号:6414599阅读:180来源:国知局
专利名称:用于发现内存泄漏和运行期信息的对象堆分析技术的制作方法
技术领域
本发明涉及分析(例如优化、查错或“调试”)软件应用程序的技术。更具体来说,本发明涉及将JavaTM虚拟机上应用程序在运行期期间存在的对象有关的信息存储起来供以后分析的技术。
JavaTM程序设计语言是由Sun Microsystem开发的一种面向对象的高级程序设计语言,其轻便性设计,足以使得其能在范围从小型设备(例如寻呼机、蜂窝电话和智能卡)到超级计算机的各种计算机上执行。用Java(和其它语言)编写的计算机程序可以被编译成虚拟机指令由Java虚拟机执行。一般来说,Java虚拟机是一个解码并执行虚拟机指令的解释程序。
用于Javs虚拟机的虚拟机指令是字节代码,即它们包括一个或多个字节。字节代码以一种特定的文件格式存储,该文件格式称作“类文件”,它包括一个类的方法(method)的字节代码。除了一个类的方法的字节代码之外,类文件还包括一个符号表以及其它辅助信息。
以一个或多个类文件中的Java字节代码体现的计算机程序是独立于平台的。这种计算机程序不加改变就可以在能运行Java虚拟机一个实现的任何计算机上执行。Java虚拟机是一个“通用”计算机的软件仿真程序,这是Java虚拟机的计算机程序能独立于平台的一个主要因素。
Java虚拟机通常是以一个软件解释程序实现的。常规的解释程序在执行期间解码并执行被解释程序的虚拟机指令,每次一条指令,这与编译程序不同,编译程序将源代码解码成本机机器指令,然后执行,在执行期间不再执行解码。一般来说,Java虚拟机要用Java程序设计语言以外的一种程序设计语言(例如,C++程序设计语言)来编写。因此,Java程序的执行会涉及执行用多种程序设计语言写成的功能。此外,字节代码本身也可能会调用不是用Java程序设计语言编写的函数(例如用于输入/输出的系统函数)。因此执行JAVA程序会导致执行用多种程序设计语言写成的函数,这是很正常的。
尽管面向对象的程序的一个目标是允许重用测试过的源代码,由此减少运行期出错的次数,Java程序仍然能从提供一个在运行期进入程序操作的窗口的分析技术中获得好处。例如,分析可用于优化程序或者寻找代码中的错误。因此,提供分析Java虚拟机上执行的应用程序的革新技术,这是人们所希望的。此外,提供应用程序在运行期存在的对象的快照(snapshot),以便例如能够发现内存泄漏,这也是有益的。
总的来说,本发明的实施例提供了分析面向对象的计算机程序的革新技术。在运行期期间某特定时刻处于活动状态的对象(“活动对象”)的快照可以被存储起来。可以利用一种分析工具来生成允许用户分析活动对象的超文本文档。例如,用户通过浏览超文本标记语言(HTML)文档,并判定某类的实例比预期的多,就能够识别内存泄漏。用户然后就可以跟踪指向不必要的实例的引用(或指针),以便判定是什么引起了内存泄漏。此外,用户还可以比较两个不同运行期的活动对象的两个不同的快照,以便例如可以容易地识别某类的新实例。下面描述本发明的几个实施例。
在一个实施例中,计算机实现的、分析面向对象的程序的执行的方法包括在运行期期间接受输入,以存储关于活动对象的信息。为了定位活动对象,系统可以从对象的根集的成员的对象开始扫描活动对象。然后,可以识别由对象的根集(root set)引用的对象,以及由这些对象引用的对象,如此等等,直到所有的活动对象都被识别。关于活动对象的信息可以被存储(例如存储在一个文件中)。在最佳实施例中,活动对象是Java类的实例。
在另一个实施例中,计算机实现的、分析面向对象的程序的执行的方法包括检索执行中某个时刻的活动对象的有关信息。可以递归扫描该信息以确认哪些对象是根集的成员,并保持活动对象的层次关系。可以生成一个超文本文档以提供有关活动对象的信息,供用户分析。
在另一个实施例中,计算机实现的、分析面向对象的程序的执行的方法包括存储两个不同运行期的活动对象的有关信息。第一和第二运行期之间的差别,例如新实例,于是就可以被确定。可以生成超文本文档,以表示这种差别,供用户分析。
结合附图参阅下面的详细描述后,本发明的其他特点和优点将变得非常明显。


图1表示的是可用于执行本发明实施例的软件的一例计算机系统。
图2表示图1的计算机系统的系统框图。
图3表示Java源代码程序是如何执行的。
图4表示一个Java运行期系统的一个实现的部件。
图5表示在一个Java堆栈上存储的函数的帧。
图6表示存储在运行期期间获得的活动对象有关的信息的过程。
图7表示表现在运行期期间获得的活动对象有关的信息的过程。
图8A~8E表示在快照被摄取时具有活动的实例的所有类的超文本文档。
图9表示在快照被摄取时具有活动的实例的一个类的超文本文档。
图10表示不含子类的一个类的实例的超文本文档。
图11表示包含子类的一个类的实例的超文本文档。
图12表示一个活动对象的有关信息的超文本文档。
图13表示根集引用到一个不含弱引用的活动对象的超文本文档。
图14表示根集引用到一个包含弱引用的活动对象的超文本文档。
图15A和15B表示从一个活动对象可达到的所有对象的超文本文档。
图16A~16E表示根集所有成员的超文本文档。
图17表示两个不同运行期的活动对象之间的差别(例如新实例)的确定过程。
图18表示一个类的新实例的超文本文档。
图19表示一个包含子类的类的新实例的超文本文档。
图20A~20B描述可用于存储活动对象的有关信息的数据结构。
图21表示BOD服务器的一个实施例。
定义类-一种面向对象的数据类型,它定义共享相同特征的对象,一般包括数据以及以该数据为操作对象的函数。
对象(或实例)-类的一个例化的成员。
对象的根集-不通过其它对象链接能被直接引用的对象。
活动对象-已经被例化、并且是根集的成员或者可被根集的成员直接或间接引用的对象。
本机方法(或代码)-用Java程序设计语言以外的其它程序设计语言写成的函数。
概述在以下的说明中,将结合对执行期间Java程序(例如字节代码)的执行进行分析的最佳实施例来说明本发明。具体来说,将要说明例子中,有用C++程序设计语言写成Java模拟机。然而,本发明不局限于任何特定语言、计算机结构、或特定的实现。因此,以下对实施例的说明的目的是示范性而不是限制性的。
图1表示可用于执行本发明一个实施例的软件的一例计算机系统。图1所示的计算机系统1包括显示器3、屏幕5、机箱7、键盘9和鼠标11。鼠标11可以有一个或多个用于与图形用户界面交互作用的按钮。机箱7内安装了CD-ROM驱动器13、系统内存和硬盘驱动器(见图2),它们可用于存储和检索实现本发明的含有计算机代码的软件程序、用于本发明的数据,等等。尽管CD-ROM13被显示为典型的计算机可读存储介质,其它计算机可读存储介质,包括软盘、磁带、快速存储器、系统内存以及硬盘驱动器,也都可以使用。此外,在载波中(例如在包括因特网在内的网络中)实现的数据信号也可以是计算机可读存储介质。
图2表示用于执行本发明一个实施例的软件的计算机系统1的系统框图。如图1所示,计算机系统1包括监视器3、键盘9和鼠标11。计算机系统1进一步包括数个子系统,诸如中央处理器51、系统内存53、固定式存储器55(例如硬盘驱动器)、可卸式存储器57(例如CD-ROM驱动器)、显示适配器59、声卡61、扬声器63、以及网络接口65。其它适于本发明使用的计算机系统可以包括更多或更少的子系统。例如,另一种计算机系统可包括多个处理器(即多处理器系统),或包括一个高速缓存。
计算机系统1的系统总线体系结构由箭头67表示。然而,这些箭头是表示用于连接各个子系统的互连方案。例如,可以用本地总线连接中央处理器到系统存储器和显示适配器。图2中所示的计算机系统1只是适合本发明使用的计算机系统的一例。其它具有不同子系统配置的计算机结构也可以使用。
一般来说,用Java程序设计语言写成的计算机程序要被编译成字节代码或Java虚拟机指令,然后由Java虚拟机执行。字节代码被存储在一个类文件中输入到Java虚拟机用于解释。图3表示一段简单的Java源代码被一个解释程序-Java虚拟机执行的过程。
Java源代码101包括用Java编写的经典Hello World程序。源代码然后被输入到字节代码编译器103,后者把源代码编译成字节代码。字节代码被称为虚拟机指令,因为他们将被一个软件仿真的计算机执行。一般来说,虚拟机指令是通用的(即不是专门为任何特定的微处理器和计算机结构设计的),但是这并不是非这样不可。字节代码编译器输出一个包括Java程序的字节代码的Java类文件105。
该Java类文件被输入到Java虚拟机107。Java虚拟机是一个解码并执行Java类文件中字节代码的解释器。Java虚拟机是一个解释器,但是它通常被称作Java虚拟机,因为它用软件仿真一个微处理器或计算机结构(例如硬件上可能不存在的微处理器和计算机结构)。
图4表示一个Java运行期系统的一个实现的部件。Java虚拟机的实现被称为Java运行期系统。Java运行期系统201可以接受输入Java类文件203、标准内嵌Java类205和本机方法207,以便执行一个Java程序。标准内嵌Java类可以是诸如线程、串等等对象的类。本机方法可以用Java程序设计语言之外的其它程序设计语言编写。本机方法一般存储在动态链接库(DDL)或共享库中。
Java运行期系统也可以与一个操作系统209连接。例如,可以由操作系统来处理输入-输出函数,包括提供Java运行期系统与Java类文件203、标准内嵌Java类205和本机方法207的连接。
动态类加载器和检验器211通过操作系统209将Java类文件203和标准内嵌Java类205装入内存213。此外,动态类加载器和检验器还可以检验Java类文件中字节代码的正确性,报告所发现的任何错误。
本机方法链接器215通过操作系统209连接本机方法207到Java运行期系统并将本机方法存储在内存213。如图所示,内存213可以为Java类保留一个类和方法区,为本机方法保留一个本机方法区。内存213中的类和方法区可以被存储在一个垃圾回收堆中。在一个新的对象被创建时,他们全存储在垃圾收集堆中。当空间不再使用时,由Java运行期系统而不是应用程序,负责回收垃圾回收堆中的内存。
图4所示的Java运行期系统的核心是一个执行引擎217。该执行引擎执行存储在内存213中的指令,并且可以用软件、硬件、或二者的组合来实现。执行引擎支持面向对象的应用程序,并且在概念上说,有多个执行引擎在并行地运行,每个Java线程有一个执行引擎。执行引擎217也可以利用后援代码221(support code)。后援代码可以提供与例外、线程、安全等等有关的功能。
当Java程序执行时,函数在每个线程内部被顺序调用。每个线程有一个执行堆栈,存储每个尚未完成执行的函数的帧。帧存储着函数的执行所需的信息,这种信息可能包括状态变量、局部变量和一个操作数堆栈。当一个函数被调用时,该函数的一个帧被压入执行堆栈。当函数结束时,函数的帧被弹出执行堆栈。因此,只有与执行堆栈顶部的帧对应的函数是活动的,与执行堆栈顶部以下的帧对应的函数已经将它们的执行挂起,一直要等到它们调用的函数返回(即结束)。
图5表示在一个执行堆栈上存储的Java函数的帧。图中所示的执行堆栈301在执行堆栈顶部有一个帧303,帧305和307分别在帧303的下面。一个堆栈指针SP指向执行堆栈的顶部,而一个帧指针FP指向位于执行堆栈301顶部的堆栈中的一个帧指针。
图中显示,每个帧都包括一个状态变量、一个局部变量和一个用于对应该帧的函数的操作数帧。此外,存储在帧中的最后项是一个帧指针,它指向执行堆栈上位于当前帧下面的帧中的帧指针,如图309和311所示。虽然存储本机方法的帧的执行堆栈可能看起来不一样,但基本原则一般是与所示执行堆栈一样的。
分析运行期的执行为了分析一个Java程序的执行,用户用一个Java虚拟机来执行程序。虚拟机负责解释Java程序,为了提高效率,可以执行编译。图6表示存储在运行期期间获得的活动对象有关的信息的过程。
在步骤401,系统在运行期期间接受输入以存储活动对象的有关信息。例如,用户可能按下某些键(例如<control>\),向系统表示活动对象的有关信息应当要存储了。
系统然后在步骤403,搜索以根集的成员开始的被请求信息。是根集成员的对象可以被直接引用。例如,在最佳实施例中,是根集成员的对象可以被Java类的静态数据成员引用、被Java或本机执行堆栈局部引用、或者被本机代码全局引用(全局Java本机接口引用)。系统可以从是根集成员的对象开始,递归地跟踪对由根集成员引用的任何其它对象的引用。这样,所有是根集成员的对象或是可以直接或间接被根集成员引用的对象都将被确定(即从根集可到达的对象的传递闭包)。这些对象就是此时此刻的活动对象。在最佳实施例中,使用了一个与垃圾回收算法类似的标记与扫描算法。
一旦确定了活动对象,系统就在步骤405存储关于这些对象的信息。这种信息可能包括对象的标识符、表示对象是否是根集成员以及为什么是一个根集成员(例如,被一个Java类的静态数据成员引用)的标志、线程标识符(适用的话)、类标识符、对象的数据,等等。在最佳实施例中被存储的信息如图18A~18B所示。在Java程序中,类的对象存储存储其它对象的结构(即某特定类的所有对象的结构),所以活动对象相关的信息可能包括定义其它对象的结构的对象。
活动对象相关的信息可以被存储在文件或任何其它计算机存储器(例如内存)中。该信息可在活动对象被确定时或者随后被一次性存储。因此,流程图中表示的步骤是示例性的,本领域的熟练人员容易明白,在其它实施例中可以对这些步骤进行组合、删除或插入。尽管这种信息可以在运行期期间分析,但一般都是在程序停止执行后再作分析。图7表示提供在运行期期间获得的活动对象有关的信息的过程。在步骤451,系统检索所存储的活动对象的相关信息,这种信息不仅包括关于活动对象本身的信息,也包括关于它们相互间关系的信息。活动对象之间的关系可能就像是一个有向图结构,它以根集成员为开端,一般是经过各种间接层次,前进到其它对象。所以,不是根集成员的对象,能够像图6中步骤403一样地通过跟踪从根集成员的引用而被确定。
一旦检索出活动对象的相关信息,系统就在步骤453接受一个用户查询。在一个最佳实施例中,该查询被作为一个统一资源定位器(URL)详细登记到一个超文本传输协议(HTTP)服务器。以下说明可能用到的查询。
“全部类查询”显示在运行期出现在堆上的类的全部。这些类可以按其完全限定类名被排序,组织成封装结构。这个查询的结果的例子在图8A~8E中表示。
“类查询”显示关于一个期望的类的信息。该信息可能包括超类、任何子类、实例数据成员、以及静态数据成员。这个查询的结果的例子在图9中表示。
“实例查询”显示一个指定类的所有实例。这个查询的结果的例子在图10中表示。
“对象查询”显示在运行期出现在堆上的一个对象的有关信息。最值得注意的是,人们可以漫游到引用该对象的对象,这一点可用于追踪错误。这个查询的结果的例子在图12中表示。
“根查询”提供从根集到特定对象的引用链。可以提供从能到达所感兴趣的对象的根集的每个成员开始的引用链。在最佳实施例中,这些链是按深度优先搜索计算的,目的是为了减少链的长度。也可以采用其它搜索技术。“根查询”是查找内存泄漏的一种很有价值的查询,因为可用它来判断对象为什么仍然是活动的。这个查询的结果的例子在图13中表示。
“可到达对象查询”显示从特定对象可到达的所有对象的传递闭包。该查询适用于判断内存中某对象总运行期的轨迹。这个查询的结果的例子在(图12后的)图中表示。
“全部根查询”显示根集的所有成员。这个查询的结果的例子在图14中表示。
除非在步骤455该查询表明用户结束,否则,系统在步骤457生成一个或多个超文本文档,以提供符合该查询的信息。超文本文档包括向文档其它部分或其它文档的链接。在最佳实施例中,超文本文档用超文本标记语言(HTML)编写。
在步骤459,系统将该超文本文档提供给用户去分析。完成方法是创建一个HTTP服务器去提供一个能用Web浏览器阅览的HTML文档。
以上说明了本发明的实施例。但是读者去读一读提供给用户作分析的数据的例子可能是有帮助的。一旦活动对象的有关信息的快照被摄取并放入HTML文档,用户就可以用Web浏览器去分析该信息。较好的着手点是显示所有有过活动实例的对象的一个查询。
图8A~8E表示在快照被摄取时具有活动的实例的全部类的超文本文档。如图所示,类是通过封装组织的。加下划线的文字代表到其它HTML文档的超文本链接。举例来说,可以选取图8D中的链接503去更详细地阅读关于类jovial.slotCar.track.TrackSegment的信息。
图9表示在快照被摄取时具有活动的实例的一个类的超文本文档,本例中,该类是jovial.slotCar.track.TrackSegment。这样,当用户“点击”链接503,就会看见图9表示的超文本文档。如图所示,诸如超类、子类、实例数据成员、以及静态数据成员之类的信息,可以用指向更详细信息的超文本链接表示出来。
在图9中超文本文档的底部,用户可以通过不合子类的链接553或包括子类的链接575去阅读该类的活动实例。换言之,链接553将显示类jovial.slotCar.track.TrackSegment的所有实例,但是不包括这个类的子类的实例。链接575将显示类jovial.slotCar.track.TrackSegment的所有实例-包括这个类的子类的实例(例如,类jovial.slotCar.track.CurvedTrackSegment和jovial.slotCar.track.StraightTrackSegment)。
图10表示不含子类的一个类的实例的超文本文档。尽管该超文本文档不是选择链接533时出现的超文本文档,但是它代表了超文本文档的式样的一个例子。如图所示,有类jovial.slotCar.Car的两个实例,它们位于特定的内存位置。如果用户要分析关于这两个实例中任何一个的更详细信细,就可以选择链接。链接607将结合图12作更详细的说明。
图11表示包含子类的一个类的实例的超文本文档。该图表示如果用户点击图9的链接575后会出现什么。由于子类的实例被显示出来,有些实例可能会比jovial.slotCar.track.TrackSegment包含更多数据或函数。然而,所有这些实例将继承这个父类。
图12表示一个活动对象的有关信息的超文本文档。该活动对象是可通过图10中链接607选择的活动对象。如图所示,类、实例数据成员、对该对象的引用、自根集的引用链都可以提供。举例来说,链接635会显示不含弱引用的自根集的引用链,链接675会显示包含弱引用的自根集的引用链。弱引用是在需要更多内存或堆空间时垃圾回收器会将其移去的一种引用。链接681会显示能由该对象到达(或引用)的所有对象。
图13表示根集引用到一个不含弱引用的活动对象的超文本文档,而图14表示根集引用到一个包含弱引用的活动对象的超文本文档。尽管图中没有表示出弱引用,图13中链接691允许用户切换到图14,而图14中链接693则允许用户切换回去。
图15A和15B表示从一个活动对象可达到的所有对象的超文本文档。这在用户激活图12的链接681时就会显示出来。这些对象可以通过搜寻活动对象的一个有向图来确定。
回头参见图8E,链接705允许用户请求阅览根集的所有成员。图16A~16E表示如果激活链接705就会显示的根集所有成员的超文本文档。如图所示,根集的成员可以按照它们被引用的方式来组织。引用方式例如,Java静态引用、Java局部引用、本机静态引用、本机局部引用。图16E中链接715允许用户请求有过活动实例的所有类,诸如图8A~8E。
超文本文档的诸例说明了用户可以容易地分析最佳实施例中的活动对象。然而,本发明并不局限于通过超文本文档来表示,本领域的熟练人员会明白,其它方法也可以采用。
为了进一步理解本发明,描述一下用户能在其中执行对Java程序的分析的情景可能是有帮助的。内存泄漏是几乎所有程序设计语言中普遍存在的问题。概括地说,内存泄漏指内存已经分配,但不再被一个计算机程序使用。在最坏的情况下,内存泄漏会因为没有足够的可用内存而导致内存分配出错。在由根集向不再需要的堆中的对象的引用时,内存泄漏可能归咎于程序员的错误。
假定用户怀疑有内存泄漏问题,用户可计算在特定运行期应当是活动的某个类的实例的数量。用户然后就可以按照本发明实施例生成活动对象的快照。用户然后可以分析所存储的信息,确定曾经是活动的实例的数量。如果数量比预期的多,用户可以追踪从错误的活动对象出发的引用,以判断什么对象正保持一个错误的引用。
此外,本发明的实施例允许用户比较活动对象的快照。图17表示了确定在两个不同的运行期的活动对象之间的差别的过程。
在步骤751,系统存储与在第一运行期的活动对象有关的信息。随后在步骤753,系统存储与在第二运行期的活动对象有关的信息。然后再指令系统按上述方式存储由用户输入的信息。
用户可以在步骤755指令系统去确定第一、第二运行期之间的差异。例如,用户可以指定存储着两个运行期的快照的文件。系统然后比较这两个快照,确定这两个快照之间的差异-例如在第二运行期出现了什么新实例。
第一、第二运行期之间的差异一旦确定,系统就在步骤757接受用户查询。除以上说明的查询外,还可以使用一个“新实例查询”,该查询只显示在第二运行期中的新实例。“新”实例是指在第一快照中出现但是在第二快照没有相同标识符的对象的实例。对象的标识符是由虚拟机分配、唯一地标识对象的一个32位的整数(或句柄(handle))。尽管句柄可以被重用,在相对较短的时间间隔内摄取的快照一般产生很好的结果。这种查询的结果的一个例子如图8所示。
除非在步骤759该查询表示用户结束,否则,系统在步骤761生成一个或多个超文本文档,以提供符合查询的信息(例如两个快照之间的差异)。在步骤763,系统将该超文本文档提供给用户去分析,完成方法是创建一个HTTP服务器去提供一个能用Web浏览器阅览的HTML文档。
类的新实例的超文本文档如图18中所示。如图所示,链接801允许用户查看该类的详细信息,而链接803允许用户查看该新实例的详细信息。在图18中的超文本文档中没有表示子类。图19表示了一个包含子类的类的新实例的超文本文档,本例中还有它们其它的实例。
在调试期间,分析计算机程序随时间推移如何变化是有益的。运用本发明实施例,用户不仅能摄取运行期期间多个活动对象快照,而且能让系统比较快照并表示差异,供进一步分析之用。
至此,就可以将关于活动对象的信息的具体细节存储起来。图20A~20B描述了最佳实施例中可用于存储活动对象的相关信息的一种数据结构。可以按照这些图中说明的结构存储一个二进制对象转储(binaryobject dump-BOD)文件。尽管最佳实施例中可以使用这种结构,也可以使用其它结构,这并不偏离本发明的精神。
图21显示BOD服务器的典型部件。服务器启动时,读一个BOD文件并在内存中建立所示的结构。该结构的顶层是一个快照实例(所示对象是快照的成员)。当用户请求信息时,服务器将该快照作为堆内容的只读表示来处理。
以上是对本发明的最佳实施例的全部说明,但是也可以使用其它可选方式、改进方式和同等方式。显然,如果适当改动上述实施例,本发明同样适合。例如,上述实施例是结合Java虚拟机说明的,但本发明的原理完全适用于其它系统和语言。因此,不应将上述说明看作是对本发明范围的限制。本发明的范围应有附后的权利要求以及与权利要求对等内容的范围来界定。
权利要求
1.在计算机系统中,一种分析面向对象的程序的执行的方法,该方法包含接受面向对象程序运行期期间要求存储与活动对象相关的信息的输入;扫描由是对象的根集的成员的对象开始的活动对象;存储与活动对象相关的信息。
2.权利要求1的方法,其中,扫描与活动对象相关的信息包括扫描由对象的根集中一个对象引用的对象。
3.权利要求1的方法,其中,存储与活动对象相关的信息包括存储对象根集中的对象以及由对象根集中一个对象引用的对象的相关信息。
4.权利要求1或2的方法,其中,与活动对象相关的信息包括一对象是该对象的根集的成员的指示。
5.前述的任一权利要求的方法,其中,对象根集的每个对象由静态数据成员、来自堆栈的局部引用或来自本机代码的引用所引用。
6.前述的任一权利要求的方法,其中,活动对象包括定义其它对象的结构的对象。
7.前述的任一权利要求的方法,其中,活动对象的相关信息被存储在文件中。
8.前述的任一权利要求的方法,其中,活动对象包括Java类的实例。
9.一种用于分析面向对象的程序的执行的计算机程序产品,包含接受面向对象程序运行期期间要求存储与活动对象相关的信息的输入的计算机代码;扫描由是对象的根集的成员的对象开始的活动对象的计算机代码;存储与活动对象相关的信息的计算机代码;存储这些计算机代码的计算机可读介质。
10.权利要求9的计算机程序产品,其中,扫描与活动对象相关的信息的计算机代码包括扫描由对象的根集中一个对象引用的对象的计算机代码。
11.权利要求9的计算机程序产品,其中,存储与活动对象相关的信息的计算机代码包括存储与对象的根集中的对象以及由对象的根集中一个对象引用的对象相关的信息的计算机代码。
12.权利要求9~11的任一个权利要求的计算机程序产品,其中,与活动对象相关的信息包括一对象是该对象的根集的一个成员的指示。
13.权利要求9~12的任一个权利要求的计算机程序产品,其中,对象的根集的每个对象由静态数据成员、来自堆栈的局部引用或来自本机代码的引用所引用。
14.权利要求9~13的任一个权利要求的计算机程序产品,其中,活动对象包括定义其它对象的结构的对象。
15.权利要求9~14的任一个权利要求的计算机程序产品,其中,活动对象的相关信息被存储在文件中。
16.权利要求9~15的任一个权利要求的计算机程序产品,其中,活动对象包括Java类的实例。
17.权利要求9~16的任一个权利要求的计算机程序产品,其中计算机可读介质是从CD-ROM、软盘、磁带、快速存储器、系统内存、硬盘驱动器以及在载波中实现的组中选择的。
18.在计算机系统中,一种分析面向对象的程序的执行的方法,该方法包含在面向对象程序的执行的第一时刻检索活动对象的相关信息;生成一个表示活动对象相关信息的超文本文档;将该超文本文档提供给用户作分析用。
19.权利要求18的方法,进一步包含在面向对象程序的执行的第二时刻检索活动对象的相关信息。
20.权利要求19的方法,进一步包含确定第一和第二时刻的活动对象之间的差异。
21.权利要求20的方法,其中的差异包括在第二时刻出现但在第一时刻不出现的活动对象。
22.18~21中的任一权利要求的方法,其中的活动对象包括Java类的实例和用超文本标记语言(HTML)写成的超文本文档。
23.一种用于分析面向对象的程序的执行的计算机程序产品,包含在面向对象程序的执行的第一时刻检索活动对象的相关信息的计算机代码;生成一个表示活动对象相关信息的超文本文档的计算机代码;将该超文本文档提供给用户作分析用的计算机代码;存储这些计算机代码的计算机可读介质。
24.权利要求23的计算机程序产品,进一步包含在面向对象程序的执行的第二时刻检索活动对象的相关信息的计算机代码;确定第一和第二时刻的活动对象之间的差异的计算机代码,其中的差异包括在第二时刻出现但在第一时刻不出现的活动对象。
25.在计算机系统中,一种用于分析面向对象的程序的执行的方法,该方法包含在面向对象程序运行期期间,存储在面向对象程序的执行的第一时刻和第二时刻的活动对象的相关信息;检索在面向对象程序的执行的第一时刻和第二时刻的活动对象的相关信息;确定第一和第二时刻的活动对象之间的差异;生成一个表示第一和第二时刻的活动对象相关信息之间差异的超文本文档;将该表示第一和第二时刻的活动对象相关信息之间差异的超文本文档提供给用户作分析用。
26.一种用于分析面向对象的程序的执行的计算机程序产品,包含在面向对象程序运行期期间,存储在面向对象程序的执行的第一时刻和第二时刻的活动对象的相关信息的计算机代码;检索在面向对象程序的执行的第一时刻和第二时刻的活动对象的相关信息的计算机代码;确定第一和第二时刻的活动对象之间的差异的计算机代码;生成一个表示第一和第二时刻的活动对象相关信息之间差异的超文本文档的计算机代码;将该表示第一和第二时刻的活动对象相关信息之间差异的超文本文档提供给用户作分析用的计算机代码;存储这些计算机代码的计算机可读介质。
全文摘要
提供一种用于分析面向对象的计算机程序的技术。执行期间特定时刻的活动对象的快照可以被存储起来。用一种分析工具去生成使用户能分析活动对象的超文本文档。此外,用户还可以比较在两个不同运行期的活动对象的不同快照,以便例如能容易地确定类的新实例。
文档编号G06F11/28GK1221912SQ9812279
公开日1999年7月7日 申请日期1998年12月9日 优先权日1997年12月9日
发明者W·F·福特, J·D·尼瑟旺格 申请人:太阳微系统有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1