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

文档序号:9826085阅读:来源:国知局
的死亡时刻就是C的死亡时刻,D的死亡时刻就是E和F的死亡时刻。
[0023]因此可在每次指针更新时,通过在指针的源对象记录指针更新的时刻以做为目的对象的最后一次可达时间,从而计算目的对象的死亡时刻,具体算法如下:
计算对象死亡时间O{
置当前传播时间为最大值;
将所有不可达对象按最后一次可达时间进行排序(按升序);
将所有不可达对象按最后一次可达时间从d,N大顺序压栈; while栈不为空当前对象=栈项对象:
if当前对象的最后一次可达时间〈_当前传播时间
更新当前传播时间为当前对象的最后一次可达时间;
for当前对象的每个字段
if该字段是引用类型且不为Null
if该字段所指向对象最后一次可达时间〈当前传播时间
将该字段所指向对象的最后一次可达时间置为当前传播时间;
将该字段所指向对象压栈:
1
[0024]图2所示,由于对象D上方的关键指针被更新,所以导致对象E和F跟随对象Dl同时死亡。下面借助连通块的概念,介绍该算法如何把财象D的最后一一次可达时间传播给连通块内的其余对象E和F。假设对象D、E、F和M的最后一次可达时间按照先后顺序排序Qt2H1Hu所有不可达对象已经按最后一次可达时间从小到大的顺序压栈。
[0025]图2中的对象按照引用关系可划分为两个连通块,即含有对象D、E、F的连通块和含有对象M的连通块。从栈中弹出栈顶对象D,此时当前传播时间为t3。
[0026]依据算法,对象E的最后一次可达时间t2早于t3,故将E的最后一次可达时间更新为t3,同时把E压栈。
[0027]图3中此时栈中元素自顶往下为E、E、F、M0然后弹出对象E,发现E的引用字段所指向的对象F的最后一次可达时h小于t3,将F的时间最后一次可达时间为t3,同时将对象F压栈,此时如图4所示,栈中元素自顶往下为F、E、F和M。此时D所在连通块的最后一次可达时间传播结束。
[0028]接着弹出当前栈顶元素F,F的引用字段所指向对象D的最后一次可达时间不等于当自订的传播时t3,因此不必更新。这是由于F所在连通块就是D所在连通块,而该连通块最后一次可达时间的传播已结束,这里弹出对象F不会引起对整个连通块的重复传播。如图5所示,此时栈中元素自项向下为E、F、M。
[0029]同理,依次弹出E、F都不会触发传播,直到D所在连通块中元素全部弹空。栈的状态变化分别如图6和图7所示。
[0030]最后弹出M,此时上一个连通块处理完毕,继续转到下一个连通块即M所在的连通块进行最后一次可达时间的传播。如图8所示,由于M所在连通块只有M自己(M没有引用字段),故弹出M后栈为空,至此算法结束。
[0031]从算法的工作过程可以发现,每次对象的最后可达时间更新后都会被雎栈,以便将最后可达时间传播给它所引用的对象。如果在算法开始不按照最后一次可达时间将对象进行升序排序,在算法的工作过程中就会引起时间的重复传播,因而增大了算法的时间复杂度。
【主权项】
1.一种基于JAVA的E—Merlin追踪算法主要特征是对象创建事件的拦截、指针更新事件的拦截和对象死亡时间的计算三部分。2.根据权利要求1中的对象创建事件的拦截主要捕捉程序中所有对象的创建事件,需要在Java字节码一级对所有涉及对象分配的字节码进行拦截。3.根据权利要求2所要求则是由1)116¥,创建一个标量对象;2)116?^?^7,创建一个矢量对象且数据成员为基本数据类型;3)anewarray,创建一个矢量对象且数据成员类型为对象的引三种定义组成。4.根据权利要求3所要求其函数为: 拦截创建对象的字节码(Java字节文件){ while不是字节码文件的末尾:if 当前字节码为 new I I newarray I I anewarray: 记录当前要创建的对象信息; 翻译字节码为机器码; continue: else if当前字节码为别的字码: 翻译为机器码;}。5.根据权利要求1中指针更新事件的拦截要追踪程序中所有的指针更新事件,必须在字节码一级对所有涉及指针更新的字节码进行拦截。6.根据权利要求5则其引起指针更新事件的字节码为: 1)astore,将对象的引用存入局部变量; 2)aastore,将对象的引用存入数组变量; 3)putfield,设置对象中引用类型字段的值; 4)putstatic,设置类静态引用字段的值。7.根据权利要求6中所示则其函数为: 记录指针新事件O{ if指针先前指向的对象存在 将该对象最后一次可达时间更新为当前时间; 记录本次指针更新事件;} 拦截指针更新事件的字节码(Java字节码文件){while 不是字节码为 putfield| | aastore | | astore | | putstatic: 记录指针更新事件O; 翻译为机器码; continue ; else if当前字节码为别的字节码: 翻译为机器码;}。8.根据权利要求1对象死亡时间的计算由可达状态转换为不可达状态。9.根据权利要求8其方法:计算对象死亡时间O{ 置当前传播时间为最大值; 将所有不可达对象按最后一次可达时间进行排序(按升序);将所有不可达对象按最后一次可达时间从d,N大顺序压栈;while栈不为空当前对象=栈项对象:if当前对象的最后一次可达时间〈_当前传播时间更新当前传播时间为当前对象的最后一次可达时间;for当前对象的每个字段if该字段是引用类型且不为Nullif该字段所指向对象最后一次可达时间〈当前传播时间将该字段所指向对象的最后一次可达时间置为当前传播时间;将该字段所指向对象压栈:1
【专利摘要】一种基于JAVA的E—Merlin追踪算法是E-Merlin追踪算法增加了采用基于真实时间的时间量,并对对象从生成到死亡的全部生命行为进行了全程追踪。全程追踪包括一个对象分配时间、分配的原因、对象类型、对象大小(字节数)、死亡时间、存活期间内发生了哪些指针更新事件以及这些事件发生的时间。
【IPC分类】G06F9/44, G06F9/455
【公开号】CN105589685
【申请号】CN201410576964
【发明人】杨际荣
【申请人】镇江华扬信息科技有限公司
【公开日】2016年5月18日
【申请日】2014年10月27日
当前第2页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1