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

一种基于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值