一种基于JAVA的E—Merlin追踪算法

文档序号:9826085阅读:479来源:国知局
一种基于JAVA的E—Merlin追踪算法
【技术领域】
[0001]—种基于JAVA的E—Merlin追踪算法主要涉及计算机算法方面领域。
【背景技术】
[0002]美国麻省理工大学的El1t Moss、Matthew Hertz等人为实现对程序的精确追踪设计了 Merlin追踪算法。Merlin算法对Java应用程序中对象的分配、死亡和指针更新事件进行了追踪,并采用当时已分配对象的字节数作为对象生命的计算标准。通过拦截指针更新事件,借助垃圾收集程序对对象进行可达性分析,标识对象是否可达并计算不可达对象的死亡时间,从而实现了对Java应用程序的精确追踪。但是经过深入研究,我们发现Merlin算法还存在以下三个方面的不足:
I)单采用当前己分配对象的字节数作为对象生命的计算标准,而没有采用真实的物理时间,,不能体现应用程序中对象生命行为的时间规律以及事件的因果联系。
[0003]2)仅对类中一般对象字段的指针更新事件进行了拦截,而没有拦截栈中局部变量和类中静态字段的指针更新事件。由于不能追踪这两类指针更新事件而无法掌握各种事件的数量关系。
[0004]3)Merlin算法虽然没有追踪栈中局部变量和类中静态字段,但实验表明Merlin追踪算法大部分运行时间仍然集中于对根集的扫描。因此,如果增加对这些变量的追踪,根集的增大将导致扫描范围扩大,这将严重影响算法性能。
[0005]针对Merlin算法的不足,我们对Merlin算法进行了扩展,在开源Java虚拟机JikesRVM中设计实现了 E-Merlin追踪算法,弥补了 Merlin算法的不足。
[0006]

【发明内容】

通过国家专利检索没有发现关于此系统方面的申请资料。
[0007]E-Merlin追踪算法增加了采用基于真实时间的时间量,并对对象从生成到死亡的全部生命行为进行了全程追踪。全程追踪包括一个对象分配时间、分配的原因、对象类型、对象大小(字节数)、死亡时间、存活期间内发生了哪些指针更新事件以及这些事件发生的时间。
[0008]E-Merlin追踪算法主要包括对象创建事件的拦截、指针更新事件的拦截和对象死亡时间的计算三个部分。
【附图说明】
[0009]图1是对象死亡的三种情况。
[0010]图2是E-Merlin算法初始状态⑴。
[0011]图3是图2中处理对象D所在的连通块⑵。
[0012]图4是图3中处理对象D所在的连通块(3)。
[0013]图5是图4中处理对象D所在的连通块⑷。
[0014]图6是图5中处理对象D所在的连通块(5)。
[0015]图7是图6中处理对象D所在的连通块(6)。
[0016]图8是图7中处理对象D所在的连通块(7)。
[0017]一.对象创建事件的追踪;要捕捉程序中所有对象的创建事件,需要在Java字节码一级对所有涉及对象分配的字节码进行拦截。在Java语言中,称数组对象为矢量对象,非数组对象为标量对象。根据Java虚拟机规范,创建对象的字节码为:
1)new,创建一个标量对象;
2)newarray,创建一个矢量对象且数据成员为基本数据类型;
3)anewarray,创建一个矢量对象且数据成员类型为对象的引用。
[0018]其拦截算法如下:
拦截创建对象的字节码(Java字节文件){
while不是字节码文件的末尾:
if 当前字节码为 new newarray anewarray:
记录当前要创建的对象信息;
翻译字节码为机器码; continue:
else if当前字节码为别的字码:
翻译为机器码;}
二.指针更新事件的拦截;Java语言中的指针更新指对象引用关系的改变。要追踪程序中所有的指针更新事件,必须在字节码一级对所有涉及指针更新的字节码进行拦截。在Java中指针变量的出现有四种情况:作为标量对象的引用字段、作为矢量对象的成员变量、作为类的静态字段和作为方法的局部变量。根据Java虚拟机规范,引起指针更新事件的字节码为:
1)astore,将对象的引用存入局部变量;
2)aastore,将对象的引用存入数组变量;
3)putfield,设置对象中引用类型字段的值;
4)putstatic,设置类静态引用字段的值。
[0019]对这些字节码的拦截算法和指针更新事件的处理算法如下:
记录指针新事件O{
if指针先前指向的对象存在
将该对象最后一次可达时间更新为当前时间;
记录本次指针更新事件;}
拦截指针更新事件的字节码(Java字节码文件){
while 不是字节码为 putfield| | aastore | | astore | | putstatic:
记录指针更新事件O;
翻译为机器码; continue ;
else if当前字节码为别的字节码:
翻译为机器码;}
三.对象死亡时间的计算;对象死亡即指对象由可达状态转换为不可达状态,这是由指针更新事件直接或间接导致。对象死亡可归纳为图1三类情况,不同情况中的对象死亡时间的计算也不同。
[0020](I) 一个对象有多个传入指针(被多个对象引用),从根集出发有多条路径可访问到它。当指针更新事件引起最后一个传入指针丢失(指针指向了其它对象)时导致对象立刻死亡。图1中的对象A和B。A和B的死亡时刻为丢失最后一个传入指针的时刻。
[0021](2) 一个对象有多个传入指针,但从根集出发只有一条路径可访问到它,这条路径被称为关键路径,关键路径上传入指针的丢失将导致对象立刻死亡。图1中D上方的传入指针,D的死亡时刻就是该指针丢失的时刻(虽然F到D的指针也是传入指针,但它不在关键路径上,这个指针的丢失不会引起对象的死亡)。
[0022](3) 一个对象所有的传入指针始终存在,但从根集开始可访问到该对象的所有路径都要经过一个关键对象,在这种情况下,关键的对象的死亡将导致这个对象的死亡。图1中的对象C、E和F,对于对象C,关键对象是B。对于对象E和F,关键对象是D。因此对象B
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1