提供一种用于追踪面向对象的程序对内存的访问的方法和装置,所述方法包括:通过修改面向对象的程序的核心类,为程序中的至少一个类分配ID;从运行环境获得卸载的类的ID;以及释放用于存储卸载的类的内存访问信息的内存空间。所述装置与所述方法相对应。利用上述方法和装置,能够标识出面向对象的程序中的各个类,并获得卸载的类的信息,由此释放与卸载的类的内存访问有关的内存空间,从而极大地减小内存访问追踪的存储开销。
【技术实现步骤摘要】
本专利技术涉及内存管理,更具体而言,涉及用于追踪内存访问的方法和装置。
技术介绍
为了对计算机的内存进行分析和管理,常常需要追踪一个程序在运行期间对内存的访问纪录。内存的访问纪录可以用于进行例如内存泄露检测、数据竞争检测等多项内存分析。为了进行内存访问追踪,需要对程序进行初步处理,使其能够记录程序运行期间所涉及的内存访问事件。图I示出现有技术中用于执行内存访问追踪的方案的示意图。如图所示,为了追踪程序在运行期间的内存访问情况,首先对有待执行的程序进行附加代码的插入。所插入的附加代码包含一些指令,用于记录程序运行过程中对内存的读取、写入等动作。于是,在运行时环境中,不仅原始程序得到执行,所插入的代码也随之被执行。在执行时,所插入的·附加代码会调用内存访问追踪模块中的一些例行程序,从而对各个内存访问事件进行监视和记录,并将记录的内存访问事件存储在存储装置中,例如内存、数据库中。可以看到,在上述方案中,为了实现对内存访问的追踪,需要执行附加的代码,并在内存中临时存储各种内存访问事件。由于内存访问事件往往数量极为庞大,记录内存访问事件本身又额外地占用了大量的内存,带来了极大的内存开销。例如,按照上述方案对WAS (Websphere Application Server)应用进行动态内存分析所占用的内存是运行原有应用时所占用内存的3.3倍;为了追踪Tomcat应用的内存访问情况而占用的内存是原有应用的3-5倍。为了解决内存分析本身带来的巨大内存开销,现有技术中提出了一些方法来对上述方案进行改进。在一种方法中,为程序的运行和分析提供足够大的内存空间。但是,该方法仅仅是在学术研究领域较为流行,在现实中并不可行。在一种方法中,设计一种过滤工具,该工具根据一些算法和策略对一些不重要的内存访问事件进行过滤和移除,从而减轻内存访问事件的存储开销。然而,所提出的过滤算法和策略通常较为复杂,不易于广泛执行。在内存追踪的一种常用方法中,将内存访问事件直接写入文档之中用于事后分析。这样的方式虽然可以减轻内存存储的开销,但是却失去了内存实时分析的优势。尤其对于一些长时间运行的应用,例如Tomcat和WAS,并不适合进行事后分析。另一方面,现有的多种应用,例如上述的Tomcat和WAS,都是采用面向对象的语言进行编写。与传统的由一系列指令流程构成的面向过程的程序语言不同,面向对象的程序可以看到多个共同协作的对象的集合,其中每个对象能够接收消息、处理数据并将消息发送给其他对象。根据面向对象语言的特点,面向对象的应用程序对内存的访问可以看作程序中的对象的某些成员的内存操作。并且,许多面向对象编程语言已经被设计为具有垃圾收集功能。垃圾收集功能是一种自动的内存管理方案,用于对应用不再访问或使用的对象所占用的内存进行清理。在这种方案下,如果一个对象不被任何其他对象所引用,或者说,从根对象无法达到该对象,那么该对象及其占用的内存将作为垃圾被收集、移动和重新整理。虽然垃圾收集方案使得程序员不必再手动处理内存的分配和管理,但同时也使得内存的追踪更加困难。基于面向对象编程语言的诸多特点,希望提出一种针对性的内存追踪方案,使其能够减小内存追踪的存储开销,同时简单而易于执行。
技术实现思路
鉴于以上提出的问题,提出本专利技术,旨在提供一种针对面向对象语言的内存追踪方案,用以解决至少一个现有技术中存在的问题。根据本专利技术第一方面,提出一种方法,用于Java程序对内存的访问,所述方法包括通过修改面向对象的程序的核心类,为程序中的至少一个类分配ID ;向运行环境请求 与卸载相关的信息,利用返回的信息获得卸载的类的ID ;以及释放用于存储卸载的类的内存访问信息的内存空间。根据本专利技术第二方面,提出一种装置,用于追踪Java程序对内存的访问,所述装置包括代码修改模块,配置为通过修改面向对象的程序的核心类,为程序中的至少一个类分配ID ;以及卸载追踪模块,配置为向运行环境请求与卸载相关的信息,利用返回的信息获得卸载的类的ID,并释放用于存储卸载的类的内存访问信息的内存空间。利用本专利技术实施例的方法和装置,能够标识出面向对象的程序中的各个类,并获得卸载的类的信息,由此释放与卸载的类的内存访问有关的内存空间,从而极大地减小内存访问追踪的存储开销。附图说明图I示出现有技术中用于执行内存访问追踪的方案的示意图;图2示出根据本专利技术一个实施例的方法的流程图;图3示出根据本专利技术一个实施例的修改核心类的示意图;图4示出根据一个实施例获得卸载的类的信息的步骤;以及图5示出根据本专利技术一个实施例的装置的示意图。具体实施例方式下面结合具体例子描述本专利技术的实施方式。应该理解,出于说明目的而描述的例子不应作为对本专利技术实质范围的限制。在本专利技术的多个实施例中,提出一种方法,用于追踪由面向对象语言编写的程序对内存的访问。如本领域技术人员所知,面向对象的语言,例如Java,C#等,会在程序中定义对象所属于的各种类。相应地,在运行环境中存在类加载器,用以动态地加载所需的类。在运行环境判断认为不再需要一个已经加载的类时,会将这个类进行卸载。基于此,如果能够对卸载的类进行标识和识别,并相应地释放这些类的内存访问事件所占用的内存,那么就有可能在追踪内存访问的同时减轻内存的开销,提闻追踪效率。将上述构思作为出发点,本专利技术的实施例针对面向对象的语言提出一种内存追踪方法,从而在类卸载的情况下释放相应的内存占用,提闻内存追踪的空间效率。图2不出根据本专利技术一个实施例的方法的流程图。如图所示,在一个实施例中,追踪内存访问的方法包括以下步骤步骤20,通过修改面向对象的程序的核心类,为程序中的至少一个类分配ID ;步骤22,向运行环境请求与卸载相关的信息,利用返回的信息获得卸载的类的ID ;以及步骤24,释放用于存储卸载的类的内存访问信息的内存空间。具体地,为了获知卸载的类的信息,首先必须对类进行标识,也就是,为每个类分配一个独有的ID。因此,在步骤20中,对于面向对象的程序,通过在描述一般类的核心类中添加成员,以此成员的值来表示类的ID,从而实现对类的ID分配。这样的ID分配过程与面向对象的程序的特点密不可分。如本领域技术人员所知,在面向对象的程序中,对象是对现实世界中事物的抽象,是程序的基本封装单位。一般地,一个对象通过对象标识、属性和方法来刻画。对象属性是用来描述对象的静态特征的一组数据,在Java程序中又称为数据成员。对象方法也称为服务或操作,是对对象动态特征(行为)的描述。每一个方法确定对象的一种行为或功能,又称为成员方法。如果一组对象具有相同的属性和方法,那么这组对象就构成一个类。因此,类是对象的抽象和归纳,对象是类的实例。类的概念使得编程人员能够对属于该类的全部对象进行统一的描述。因此,在面向对象的程序中,通常在定义对象之前应先定义类,在定义了类之后,才在类的基础上创建对象。与对象的特征相对应,描述一个类需要指明下述三个方面内容类的名称、属性说明和方法说明。在典型的面向对象语言Java的程序中,类通常以如下格式来定义class 类名{数据成员成员方法}其中花括号中包括的内容称为类体,由数据成员(属性)和成员方法(方法)两部分组成。与对象相对应,类体中的数据成员描述对象的属性;成员方法则刻画对象的行为或动作,每一个本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种方法,用于追踪Java程序对内存的访问,所述方法包括 通过修改Java程序的核心类,为程序中的至少一个类分配ID ; 向运行环境请求与卸载相关的信息,利用返回的信息获得卸载的类的ID ;以及 释放用于存储卸载的类的内存访问信息的内存空间。2.根据权利要求I的方法,其中所述核心类为Java.lang. Class,其中修改所述核心类包括,添加数据成员objectID,并在对应的成员方法中对objectID赋值,使得与所述核心类的对象相对应的类具有不同的objectID值作为其ID。3.根据权利要求2的方法,其中对objectID赋值包括以下方法中之一 将objectID值设定为所述程序中的计数器的值,所述计数器的值随着类的加载而递增; 将objectID值设定为类的加载时间; 将objectID值设定为系统生成的UUID。4.根据权利要求I的方法,其中获得卸载的类的ID包括 为至少一个核心类对象创建弱引用; 将弱引用对象的ID设定为所述核心类对象所具有的ID ; 将所述弱引用对象添加到引用队列中; 在引用队列中调用特定函数方法从而向运行环境请求与卸载相关的信息,所述函数方法请求返回与被垃圾收集的核心类对象相对应的弱引用对象信息;以及从运行环境获取返回的弱引用对象的ID,将此ID作为卸载的类的ID。5.根据权利要求I的方法,其中释放用于存储卸载的类的内存访问信息的内存空间包括移除与所述卸载的类有关的内存访问信息,所述内存访问信息包括,该类的所有对象的内存访问事件、该类的各个变量的内存操作事件。6.一种装...
【专利技术属性】
技术研发人员:罗志达,刘伟,
申请(专利权)人:国际商业机器公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。