一种基于Java虚拟机的延时动态对象更新方法

文档序号:6377125阅读:258来源:国知局
专利名称:一种基于Java虚拟机的延时动态对象更新方法
技术领域
本发明属于计算机应用领域,具体是一种基于Java虚拟机的低中断的延时动态对象更新方法。
背景技术
Java是一种面向对象语言。运行中的Java程序可以看做是由对象以及对象之间的交互组成。Java程序的动态更新可以看做是对对象的更新。Java虚拟机按照对象模型去实现对象,每一个对象都包含两个字的对象头。一个对象头字用于存储一些状态信息,例如对象锁的状态,垃圾回收标志,哈希值等。另一个对象头字存储指向与该对象类型相关的运行时刻类元数据,运行时刻的动态类型检查、虚方 法调用、接口方法调用等都是通过这个类元数据获得具体的动态信息。当前很多基于Java虚拟机动态更新系统并不能够支持对对象的更新,例如Hotspot JVM的Hotswap机制。一些系统虽然能够对对象进行更新但是存在一些不足的地方,例如需要进行遍历堆区中的所有对象,造成很大的更新中断时间。这些系统采用即时的对象更新方法,利用垃圾回收协助对象更新,进行一次全堆区的垃圾回收,加上执行自定义对象更新方法,造成系统中断时间比较长,可能会导致额外的损失。动态更新的操作需要中断当前系统,安装新的类,之后对对象进行更新。动态对象更新时需要解决以下三个问题。I.在运行时刻,找出当前堆区的所有类型发生改变的对象。2.当对象空间变大时需要为更新后的对象申请新的更大的空间,修复那些原先指向旧对象空间的指针指向新的对象。保证引用一致性的最简单的方法就是在一个原子过程实现这个操作。3.利用旧对象的值去对新对象的值进行初始化。这涉及到开发者编写自定义更新方法。即时动态更新方法一般利用Java虚拟机的垃圾回收去扫描整个对象图,找出变化的对象,接着利用垃圾回收能够移动对象的特性更新指针。延时的方法则将对需要更新的对象的检测推迟到更新中断之后的程序常态运行时。在更新中断之后的常态运行时,对非法对象的首次访问将会首先陷入一个对象更新例程,非法对象因此被更新为普通的对象。延时的对象更新主要面临如下三个问题。I.常态运行时刻对非法对象的检测会导致程序运行速度变慢。2.对象空间变大时,没有有效的方法更新指针。3.编写自定义方法面临的上下环境复杂,需要对此做出限制。本发明提出的延时对象更新方法可以很好的解决上述三个问题。它可以有效减少运行时刻对非法对象的检测,支持对对象空间增大的对象更新,同时给出一个编写transformer 的方法。

发明内容
本发明所要解决的技术问题是提供一种基于Java虚拟机的低中端延时动态对象更新方法,该方法通过将对象更新操作推迟到更新中断之后的常态运行时刻执行,降低更新中断时间,从而提高了更新的效率。本发明的技术方案为一种基于Java虚拟机的低中端延时动态对象更新方法,主要包含如下步骤
I.在动态更新中断时刻,加载新类替换旧类,将旧类元数据设置为非法状态。2.如果新类对象空间增大,则创建辅助的类元数据。 3.在更新中断之后的常态运行时刻插入非法对象检测点,对非法对象进行检测。4.在常态运行时刻将非法对象更新为普通的新对象。有益效果本发明提出的延时对象更新方法可以很好的解决现有技术中出现的问题,有效减少运行时刻对非法对象的检测,支持对对象空间增大的对象更新,同时给出一个编写transformer的方法。


图I本发明实施例的动态类更新以及对象更新的整个流程。图2本发明实施例的更新后的类结构。图3本发明实施例的对空间未增长对象的更新。图4本发明实施例的对空间增长对象的更新,构造MixObjects。图5本发明实施例的垃圾回收将Mix-Objects合并成普通对象。
具体实施例方式以下结合附图和具体实施例对本发明作进一步详细阐述。图I本发明实施例的动态类更新以及对象更新的整个流程。本发明的基于Java虚拟机的低中端延时动态对象更新方法,主要包含如下步骤
步骤一、在动态更新中断时刻,加载新类替换旧类,将旧类元数据设置为非法状态;
将旧类元数据设置为非法状态的具体步骤为
1.D设置旧类元数据中的虚方法表中方法入口地址指向对象更新例程。1.2)设置旧类元数据中的接口实现信息为空。1.3)设置旧类元数据中的父类为新类。这样,更新之后旧类设置为非法类,它在类型系统中的位置如图2所示。步骤二、如果新类对象空间增大,则创建辅助的类元数据;
创建辅助的类元数据的具体步骤为
2.I)拷贝一份新类元数据,该拷贝即为辅助类元数据的雏形。2.2)设置拷贝类元数据对象大小为旧类型对象大小。2. 3)设置拷贝类元数据对象引用类型域信息为仅包含能放置在旧类对象空间中的域。辅助类在类型系统中的位置如图2所示。
步骤三、在更新中断之后的常态运行时刻插入非法对象检测点,对非法对象进行检测;
插入非法检测点的具体步骤为
3.I)在该对象表现为父类对象时的访问前移除非法对象检测。3.2)进行控制流分析,消除冗余的显式非法对象检测。
3. 3)移除虚方法调用、接口方法调用处得非法对象检测,这部分检测是隐式的。3.4)插入剩下显式的对象检测。步骤四、在常态运行时刻将非法对象更新为普通的新对象;
在运行时刻将对象更新为普通的新对象的具体步骤为
如图2所示,如果该对象需要申请新空间,则创建一个新对象,将该对象与旧对象链接起来,旧对象的类元数据更新为辅助类元数据,旧对象的状态字设置为有Mix-Ob ject,且将申请的新对象地址编码进该状态字,形成一对未初始化的Mix-Objects。如图3所示,如果不需要申请新空间,则将旧对象的类元数据设置为新类元数据,形成一个为初始化的新对象。在得到的新空间上执行对象更新方法。上述步骤中执行的对象更新方法的编写准则是
第一、在运行更新方法时,运行系统保证了没有其他线程对该对象访问。第二、旧对象空间中旧类域的值会被拷贝到栈中成为局部变量,所有对旧类旧域的访问会转换为对局部变量的访问。第三、对新类域的写入读取操作分两种情况1)对溢出的域(必须被放在MixObjects的新对象空间中的域)需要进行一次重定向;2)对其它域则正常访问。图4本发明实施例的对空间增长对象的更新,构造MixObjects。如图5所示,垃圾回收将Mix-Objects合并成普通对象。将非一般的普通新对象Mix-Objects更新为普通对象的具体步骤是
1)当垃圾回收器要移动非一般的普通新对象Mix-Objects对象的时只移动Mix-Objects中的新对象,
2)将Mix-Objects中的旧对象值拷贝到新对象中。3)当对其他对象更新指向Mix-Objects的指针时,使其指向Mix-Objects新对象对应的地址。这里存在两次转发。虽然本发明通过具体实施例和附图进行了描述,但实施例并非用来限定本发明。本领域技术人员可在本发明的精神范围内,做出各种变形和改进,其同样在本发明的保护范围之内。因此本发明的保护范围应当以本申请的权利要求保护所界定的相同或等同的范围为准。
权利要求
1.一种基于Java虚拟机的低中断延时动态对象更新方法,其特征在于,包含如下步骤 步骤一、在动态更新中断时刻,加载新类替换旧类; 步骤二、在更新中断之后的常态运行时刻插入非法对象检测点,对非法对象进行检测; 步骤三、在常态运行时刻检测到非法对象时将其更新为非一般的新对象; 步骤四、将非一般的新对象更新为普通对象。
2.根据权利要求I所述的基于Java虚拟机的低中断延时动态对象更新方法,其特征在于,所述步骤一的具体步骤为 1.1)加载新类替换旧类; I. 2)如果需要对象更新,将旧类元数据设置为非法状态; I. 3)如果新类对象空间增大,则创建辅助的类元数据。
3.根据权利要求2所述的基于Java虚拟机的低中断延时动态对象更新方法,其特征在于,所述步骤I. 2的具体步骤为 I. 2. I)设置旧类元数据中的虚方法表中方法入口地址指向对象更新例程; I. 2. 2)设置旧类元数据中的接口实现信息为空; 1.2.3)设置旧类元数据中的父类为新类。
4.根据权利要求2所述的基于Java虚拟机的低中断延时动态对象更新方法,其特征在于,所述步骤I. 3的具体步骤为 I. 3. I)拷贝一份新类元数据,该拷贝即为辅助类元数据的雏形; I. 3. 2)设置拷贝类元数据对象大小为旧类型对象大小; 1.3. 3)设置拷贝类元数据对象引用类型域信息为仅包含能放置在旧类对象空间中的域。
5.根据权利要求I所述的基于Java虚拟机的低中断延时动态对象更新方法,其特征在于,所述步骤二的插入非法对象检测点的具体步骤为 2.I)在该对象表现为父类对象时的访问前移除非法对象检测; 2.2)进行控制流分析,消除冗余的显式非法对象检测; 2.3)移除虚方法调用、接口方法调用处得非法对象检测,这部分检测是隐式的; 2.4)插入剩下显式的对象检测。
6.根据权利要求I所述的基于Java虚拟机的低中断延时动态对象更新方法,其特征在于,所述步骤三的常态运行时刻将对象更新为普通的新对象的具体步骤为 3.I)如果该对象需要申请新空间,则创建一个新对象,将该对象与旧对象链接起来,旧对象的类元数据更新为辅助类元数据,旧对象的状态字设置为有Mix-Object,且将申请的新对象地址编码进该状态字,形成一对未初始化的Mix-Objects ; 3.2)如果不需要申请新空间,则将旧对象的类元数据设置为新类元数据,形成一个为初始化的新对象; 3.3)在得到的新空间上执行对象更新方法。
7.根据权利要求6所述的基于Java虚拟机的低中断延时动态对象更新方法,其特征在于,所述步骤3. 3中执行对象更新方法的编写准则是.3.3.1)在运行更新方法时,运行系统保证了没有其他线程对该对象访问; .3.3.2)旧对象空间中旧类域的值会被拷贝到栈中成为局部变量,所有对旧类旧域的访问会转换为对局部变量的访问; .3.3.3)对新类域的写入读取操作分两种情况1)对溢出的域(必须被放在MixObjects的新对象空间中的域)需要进行一次重定向;2)对其它域则正常访问。
8.根据权利要求I所述的基于Java虚拟机的低中断延时动态对象更新方法,其特征在于,所述步骤四的将非一般的普通新对象更新为普通对象的具体步骤为 .4.1)当垃圾回收器要移动非一般的普通新对象Mix-Objects对象时只移动Mix-Objects中的新对象; .4. 2)将Mix-Objects中的旧对象值拷贝到新对象中; .4. 3)当对其他对象更新指向Mix-Objects的指针时,使其指向Mix-Objects新对象对应的地址。
9.根据权利要求8所述的基于Java虚拟机的低中断延时动态对象更新方法,其特征在于,所述步骤4. 3中,这里存在两次转发。
全文摘要
本发明公开了一种基于Java虚拟机的低中断延时动态对象更新方法,包含如下步骤1)在动态更新中断时刻,加载新类替换旧类;将旧类元数据设置为非法状态;2)如果新类对象空间增大,则创建辅助的类元数据;3)在更新中断之后的常态运行时刻插入非法对象检测点,对非法对象进行检测;4)在常态运行时刻检测到非法对象时将其更新为非一般的新对象;5)将非一般的新对象更新为普通对象。该方法在对Java程序进行动态更新时对象更新的操作延迟到更新中断以后的常态运行时刻进行,以减少动态更新对系统的中断时间,提高更新的效率。
文档编号G06F9/455GK102880490SQ20121034659
公开日2013年1月16日 申请日期2012年9月19日 优先权日2012年9月19日
发明者马晓星, 曹春, 吕建, 顾天晓 申请人:南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1