CN101963914A - 一种基于字节码文件重构的Java类在线更新方法 - Google Patents
一种基于字节码文件重构的Java类在线更新方法 Download PDFInfo
- Publication number
- CN101963914A CN101963914A CN2010105441021A CN201010544102A CN101963914A CN 101963914 A CN101963914 A CN 101963914A CN 2010105441021 A CN2010105441021 A CN 2010105441021A CN 201010544102 A CN201010544102 A CN 201010544102A CN 101963914 A CN101963914 A CN 101963914A
- Authority
- CN
- China
- Prior art keywords
- class
- new
- skew
- offset
- old
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 254
- 230000007246 mechanism Effects 0.000 claims abstract description 10
- 230000008859 change Effects 0.000 claims description 33
- 230000008569 process Effects 0.000 claims description 31
- 238000004458 analytical method Methods 0.000 claims description 16
- 238000013459 approach Methods 0.000 claims description 16
- 230000003068 static effect Effects 0.000 claims description 8
- 230000001965 increasing effect Effects 0.000 claims description 5
- 238000007430 reference method Methods 0.000 claims description 4
- 230000000052 comparative effect Effects 0.000 claims description 3
- 238000006073 displacement reaction Methods 0.000 claims description 3
- 208000031872 Body Remains Diseases 0.000 claims description 2
- 238000004422 calculation algorithm Methods 0.000 claims description 2
- 238000004364 calculation method Methods 0.000 claims description 2
- 238000002372 labelling Methods 0.000 claims description 2
- 230000005012 migration Effects 0.000 claims description 2
- 238000013508 migration Methods 0.000 claims description 2
- 230000015572 biosynthetic process Effects 0.000 description 3
- 238000013527 convolutional neural network Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000011156 evaluation Methods 0.000 description 2
- 230000006870 function Effects 0.000 description 2
- 238000004883 computer application Methods 0.000 description 1
- 230000002708 enhancing effect Effects 0.000 description 1
- 239000012467 final product Substances 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 239000000047 product Substances 0.000 description 1
- 238000004064 recycling Methods 0.000 description 1
- 230000008439 repair process Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于字节码文件重构的Java类在线更新方法,该方法在对Java程序进行动态更新时对二进制文件进行分析、重构,结合一种新的VM动态加载类机制,以减少运行时刻动态更新对机器码的重编译所带来的开销,提高更新的效率。
Description
技术领域
本发明属于计算机应用领域,具体是一种基于字节码文件重构的高效Java类在线更新方法。
背景技术
软件是人的脑力劳动创造出来的产物。世界上没有完美的软件,开发者也很难一蹴而就,完成交付一个不需要改进的软件系统。软件总需要开发者对其进行不断维护,例如bug的修复、效率的改进、功能的增强以及代码重构等。
传统软件更新需要终止正在运行的软件,然后某些场合,尤其比较重要的软件系统,终止正在运行的软件的代价很大。为此,一种在线软件更新技术就显的十分重要。基于JVM(Java虚拟机)的软件更新系统,由于虚拟机的易于修改特性而具有很高的研究价值。
在机器上运行Java程序要经过编写源码,编译源码,启动JVM加载类文件运行等步骤。Java语言主要是由类组成,而类主要是由域和方法定义组成。在JVM加载类文件后,JVM将把读取的字节码文件映射成相应的运行时刻元数据。这是对二进制文件在运行时刻的第一层处理。当需要执行方法时,JVM会调用他的在线编译器将字节码编译成相应机器码,CPU读取这些机器指令执行相应功能。JVM会在内存分配的堆区中创建对象,对象对应的类型信息和类元数据相关,这些信息主要描述了对象空间各偏移对应的域,以及该对象能够运行的实例方法。
动态更新系统为保持更新的一致性,定义了一个基本语义:更新前不运行新代码,更新后不运行旧代码。除此之外在更新过程中也要保证基本的类型安全。
动态更新系统一般需要一个更新准备步骤,主要是通过分析比较新旧版本程序发生的改变并将这些信息输出到文件中,同时程序员也可能需要编写一些更新补丁。
根据新旧版本Java类发生的改变不同,在分析阶段主要将需要处理的Java类划分为如下三种:
1.当类的父类、接口集合、域集合、方法集合发生改变时,需要将该类利用JVM的动态加载机制重新加载进虚拟机,将类定义以及域定义、方法定义映射成相应的运行时刻元数据。这种类定义发生改变的更新称为类更新。
2.当类定义没有发生改变仅有方法的实现发生改变时,这时只要为需要将方法对应的VM元数据进行更新即可。这种类定义未变化但存在方法字节码改变更新称为方法体更新。
3.当类定义和方法字节码没有任何改变,但由于存在方法引用了类更新的类,则需要将相应方法的机器码进行更新。这种字节码没有发生改变,但引用了类更新类的方法更新称为引用方法更新。
不同的更新会导致运行时刻元数据发生更改,而动态更新就是要替换运行时刻元数据。对上述分析得到的不同更新,在运行在线更新时需要采取不同的处理方式:
1.类更新:
类更新使得运行时刻类元数据需要重新生成,与此同时方法字节码也发生改变,方法机器码也随之改变。由于类型的唯一性,在替换新类是需要将旧类定义从运行时刻类型管理机制中移除。具体为:
1运行系统中移除旧类元数据→2动态加载新类→3生成新的类元数据、域元数据、方法元数据→4编译方法
2.方法体更新:
方法体更新使得方法的字节码发生改变,与此同时方法的字节码也发生改变。
具体为:
1替换方法元数据中的字节码部分→2重新编译方法
3.引用方法更新:
引用方法的机器码中有部分指令的操作数发生改变,这个时候一种简单的解决方法就是重新编译整个方法,但这显然不是最佳方法。具体为:
1重新编译方法。
更新需要程序运行到一个安全点,而安全点需要能够停止所有用户线程,并扫描用户线程,判定线程运行栈中没有受限方法。机器码发生改变的方法是受限方法,此外,用户也可以根据程序逻辑指定受限方法。当某方法被删除后,为了确保更新语义,这些方法也要被标记为受限的方法。
引用方法更新的机器码需要修复,一般做法是重新编译。这类方法的特点:一是字节码没有发生改变,二是引用了类更新类。虽然它的字节码没有改变,引用的方法也皆存在于新旧版本中,但由于JVM的动态类加载机制会将新类对应的元数据分配到新的偏移,这就导致引用方法更新的方法的机器码需要重新编译了。如果可以确保这种偏移更新前后不发生改变,那么引用方法更新导致的重编译就可以免去,提高更新的效率。本文提出一种方法结合分析并重构字节码二进制文件,在运行时刻调整动态加载类的机制,来达到减少引用方法更新带来的重编译。
发明内容
本发明所要解决的技术问题是提供一种基于字节码文件重构的Java类在线更新方法,该方法通过在运行时刻调整动态加载类的机制,降低运行时刻元数据的变更,减少了引用方法更新带来的重编译,从而提高了更新的效率。
本发明所述的一种基于字节码文件重构的Java类在线更新方法,其主要包含以下步骤:
1)分析新旧版本程序中二进制字节码文件,找出类更新、类方法体更新、类引用方法更新所针对的类;
2)根据分析结果在运行时刻找寻合适的更新点;
3)在运行时刻,根据类发生的更新,对其做相应的更新操作,具体为:
3.1)对于类更新的类,将新类替换旧类;
3.2)对于类方法体更新的类,将其定义的方法重新读取并初始化可用;
3.3)对于类引用方法更新的类,将存在相应引用的方法重新编译;
4)将堆区中类型改变的类实例转换成新类型实例。
上述步骤1)的过程为:
基于JVM的更新的分析工具对所有类遍历两遍,
第一次遍历:
1.1)根据旧版本中类在新版中出现的情况,对旧版本类进行分类,标记出减少的类和新旧版本中都存在的类;对新旧版本中都存在的类,进一步标记出类定义变化和类定义不变化的类;
1.2)根据旧版本中类存在的类中方法在新版中出现的情况,标记出减少的方法、都存在但方法体变化的方法,以及都存在且方法体不变的方法;
第二次遍历:
1.3)对那些存在于新旧版本中且方法体保持不变的方法,标记出引用类定义改变的类的方法;
标记输出结果:
1.4)将步骤1.1)中减少的类、类定义变化的类中的所有方法,类定义不变的类中方法体发生改变的方法、方法体不变但引用类定义改变的类的方法标记为受限方法;
15)将步骤1.4)中标记出的受限方法中,字节码不变的方法标记为字节码不变的受限方法。
上述步骤1.1)标记类的具体步骤为:在旧版本中取一类C,判断其在新版本中是否存在同样的C类,若不存在则标记C为减少的类;若存在,则进一步比较类的定义是否发生改变,而判断类定义是否发生改变的步骤为:
1.1.1)判断二进制文件中的类基本信息是否发生改变,若父类为减少的类则标记该类类继承关系变化;
1.1.2)判断并标记域存在域在运行时刻偏移是否能保持不变,根据相应VM平台的实例域的布局计算出实例域在堆区对象实例空间中的偏移,该偏移与域出现在二进制文件中的顺序相关,对编译器生成的二进制字节码文件进行重构,调整域出现的顺序;
1.1.3)在1.1.2)调整布局之后,必要时判断并标记出类的实例大小是否发生改变;
1.1.4)判断并标记方法存在方法在运行时刻偏移是否能保持不变,根据相应VM平台实例方法偏移算法计算出偏移,该偏移与方法出现在二进制文件中的顺序有关,必要时对编译器生成的二进制字节码文件进行重构,调整方法出现的顺序;
1.1.5)若有以上之一发生改变,则判定该类定义改变;否则判定为类定义不变,将调整过的字节码写入文件中。
上述步骤1.1.2)的调整并判断域偏移是否发生改变的详细步骤是:
前提:调整过程中如果发现填补空位导致增大对象实例大小,则停止调整。
a)将旧类域进行布局,并将域按照偏移排序;
b)从排序后的列表中按序取出一域f,若在新类中不存在相同定义域f’则继续取下一域;
c)否则,若其能在不破坏前提的情况下将该域f’分配f同样的偏移,则将其放入布局上下文中,从步骤b)继续;
d)否则,标记该域位移改变,将其放入布局上下文中从步骤b)继续。
上述步骤1.1.4)的调整并判断方法偏移是否发生改变的详细步骤是:
a)先分别将新旧两类实例方法在方法表中的偏移确定,得到方法表mtable与mtable’;
b)在旧类方法表mtable中取出一个方法m,若新类中方法m′偏移与之相同,即m.offset==m’.offset,则继续去旧类中取下一个方法;
c)否则,若该旧类方法在旧类方法表中的偏移m.offset是属于新类方法表中父类继承方法范围,则标记该方法偏移变化;
d)否则,若该旧类方法在旧类方法表中的偏移m.offset是属于该类定义方法范围,则将新类中方法偏移与新类方法表中该偏移处方法偏移交换,即
mtable’[m’.offset]=mtable’[m.offset];
mtable’[m’.offset].offset=m’.offset;
mtable’[m.offset]=m’;
m’.offset=m.offset;
e)否则,若该旧类方法在旧类方法表中的偏移超出新类方法表长度,则扩展新类方法表大小,将新类方法表同一方法偏移
Extend(mtable’);
mtable’[m’.offset]=null;
mtable’[m.offset]=m’;
m’.offset=m.offset。
上述步骤1.2)中,标记类存在类的方法的具体步骤是在类存在类中取出一方法,判断其在新版本类中是否存在同样的方法:
1.2.1)若不存在,则标记该方法为减少的方法;
1.2.2)若存在则对方法存在方法判断进一步判断方法体是否改变的步骤为:
a)按序取新旧版本方法的指令insnOld,insnNew;
b)若insnOld与insnNew不是同一条指令,则判定该方法体发生改变;
c)若insnOlde与insnNew是同一条指令,则若其没有引用Constant Pool,则按指令格式比较该指令各域;若引用了Constant Pool,则取出ConstantPool中的内容进行比较;若比较结果不同,则判定该方法体发生改变。
步骤1.3)中,标记引用结构发生改变类的具体步骤为:
1.3.1)取出一条指令,
1.3.2)若该指令是new/anewarray/multianewarray,若其访问的目标类的实例域大小在上述步骤1.1.3)中被判定发生改变,则标记该方法为引用结构变化类的方法;
1.3.3)若该指令是instanceof/checkcast,若其访问的目标类的继承结构在上述1.1.1)步骤中被判定发生变化,则标记该方法为引用结构变化类的方法;
1.3.4)若该指令是getfield/putfield/getstatic/putstatic/invokevirtual/invokespecial之一,若其访问的目标方法、目标域的偏移在上述步骤1.1.2)和11.4)中被判定发生改变,则标记该方法为引用结构变化类的方法。
步骤3.1)的详细过程是:
3.1.1)移除旧版本的类;
3.1.2)修改ClassLoader的path已找到新类对应的字节码数据流;
3.1.3)通过动态类加载机制加载新类,加载类之后,把旧类的VM元数据属性置换给新类,修改类型系统中类型Id,将旧类Id赋给新类;
3.1.4)修改静态数据表中静态域和方法的偏移,将相应位置处数据替换成新类对应的指针;实例域和实例方法的偏移通过分析调整字节码二进制文件;
3.1.5)调整之后进行初始化、实例化等后续操作。
本发明在对Java程序进行动态更新时对二进制文件进行分析、重构的基础上,结合一种新的VM动态加载类机制,以减少运行时刻动态更新对机器码的重编译所带来的开销,提高更新的效率。
附图说明
图1显示了根据Java类发生的更新不同进行不同的更新操作。
图2显示了本发明的分析工具对类层次的标记流程,
图3显示了本发明的分析工具对类结构进行分析标记的流程,
图4显示了本发明的分析工具对方法体进行分析标记的流程,
图5显示了本发明的分析工具找出引用更新方法的流程,
图6是实施例中一次Java程序更新前后不同版本程序中类的内容,
图7是图6中类A、B的方法表,
图8是图6中类B方法m3的字节码。
具体实施方式
以下结合具体实施例对本发明作进一步描述。
如图6所示为一次Java程序更新前后不同版本程序中类的内容。其中左图列出的为版本一程序中的类,右图中列出的是版本二程序中的类。
在分析的阶段,采用图2所示之流程,首先将版本一中类按照继承关系进行拓扑排序,于是取出进行比较的顺序为A→B→C→D→E。
按照图2之流程,取出A判断出版本二中存在同样的类A’,接着判断类A的类结构是否发生改变。按照图3之流程,A的父类更新前后都是Object类未变化,A类域未变化,对象大小也同样未变化,A类增加了方法,所以类结构发生变化。通过进一步分析比较,可以判断A类方法m1的偏移可以保持不变。将类A标记成类存在但结构变化的类,接着按照图4之流程比较A中方法实现,但由于这里没有给出A中方法的实现,关于图4之比较方法流程将在比较类C的时候阐述。
按照图2之流程,比较完A之后接着取出类B进行分析,发现版本二中存在同样的类B’,接着判断类B的结构是否发生改变。按照图3之流程,B类的父类A类被被标记为类存在但结构发生改变,B受其影响必然被同样标记为类存在但结构发生改变的。按照图3之流程继续判断B改变的细节,发现B中增加了新实例域j,减少了静态域s,实例域i更新前后不变,且其偏移可以通过调整保持不变。之后,判断类实例大小,由于减少了是静态域,增加了实例域,所以B类实例大小增大。按照图3之流程继续判断类B的方法偏移情况,发现类B移除了方法m2的实现,并覆写了父类A中的方法m1,方法m3保持不变。B类中方法的偏移均可以保持,如图7所示。接着将会按照图4之流程比较A中方法的实现,B中方法m3的字节码如图8所示。按照图4之流程,比较m3的前两条指令时通过opcode即可判断为相同指令。第三条指令均有操作数且相同,但由于该指令的操作数引用了ConstantPool中的符号,所以需要取出该符号进行比较发现不同,于是比较至此即可判断方法m3更新前后发生了改变。
按照图2之流程,比较完类B之后取出类C进行分析,发现版本二中存在同样的类C’,接着判断类C的结构是否发生改变。按照图3之流程,类C的父类、域、方法均未改变,于是类C被标记为类存在且结构未变。继续比较类C的方法m1的,按照图4之流程,同样可判断m1方法发生改变,将类C中方法m1标记为受限方法。
按照图2之流程,比较完类C之后取出类D进行分析,发现版本二中存在同样的类D’,接着判断类C的结构是否发生改变。分析可发现D类更新前后完全一致,但D类引用了类B。将在后续的第二次遍历中,按照图5之流程,找出需要重新编译的方法。按照图2之流程,比较完类D之后取出类E进行分析,发现版本二中并不存在类E,所以类E中所有方法均标记为受限方法。
按照图2之流程,比较完类E之后第一遍遍历结束。接着进行第二次遍历来找出需要重新编译的方法。按照图5之流程,在分析D中方法m时,发现该方法引用了B中的方法m1、m2、m3的位移均未发生改变。但在分析D的初始化方法时,发现B的对象大小发生改变,所以该构造方法需要重新编译,将该初始化方法标记为可OSR的受限方法。
所有分析结束后,我们需要重构类A和类B的二进制字节码文件,以保证在运行时刻加载时可以保证相应方法和域的位移不变。
在运行时刻更新时,按照图1之流程加载并更新程序。A与类B需要重新加载类并生成新的VM元数据,以及编译新的方法;类C需要将方法m1重新编译;类D需要将其初始化方法重新编译;类E将其移除即可,这一点可以有JVM的垃圾回收管理机制来完成。
我们的静态分析工具在分析阶段确定所有类的方法表,并通过一系列调整手段尽量保证更新前后都存在的方法位移不变,并将结果反馈到原始二进制文件中。通过我们的静态分析工具,可以有效的降低那些字节码发生改变但机器码需要重新编译的方法的数量。
Claims (8)
1.一种基于字节码文件重构的Java类在线更新方法,其特征在于包含以下步骤:
1)分析新旧版本程序中二进制字节码文件,找出类更新、类方法体更新、类引用方法更新所针对的类;
2)根据分析结果在运行时刻找寻合适的更新点;
3)在运行时刻,根据类发生的更新,对其做相应的更新操作,具体为:
3.1)对于类更新的类,将新类替换旧类;
3.2)对于类方法体更新的类,将其定义的方法重新读取并初始化可用;
3.3)对于类引用方法更新的类,将存在相应引用的方法重新编译;
4)将堆区中类型改变的类实例转换成新类型实例。
2.根据权利要求1所述的基于字节码文件重构的Java类在线更新方法,其特征在于上述步骤1)的过程为:
基于JVM的更新的分析工具对所有类遍历两遍,
第一次遍历:
1.1)根据旧版本中类在新版中出现的情况,对旧版本类进行分类,标记出减少的类和新旧版本中都存在的类;对新旧版本中都存在的类,进一步标记出类定义变化和类定义不变化的类;
1.2)根据旧版本中类存在的类中方法在新版中出现的情况,标记出减少的方法、都存在但方法体变化的方法,以及都存在且方法体不变的方法;
第二次遍历:
1.3)对那些存在于新旧版本中且方法体保持不变的方法,标记出引用类定义改变的类的方法;
标记输出结果:
1.4)将步骤11)中减少的类、类定义变化的类中的所有方法,类定义不变的类中方法体发生改变的方法、方法体不变但引用类定义改变的类的方法标记为受限方法;
1.5)将步骤14)中标记出的受限方法中,字节码不变的方法标记为字节码不变的受限方法。
3.根据权利要求2所述基于字节码文件重构的Java类在线更新方法,其特征在于上述步骤1.1)标记类的具体步骤为:在旧版本中取一类C,判断其在新版本中是否存在同样的C类,若不存在则标记C为减少的类;若存在,则进一步比较类的定义是否发生改变,而判断类定义是否发生改变的步骤为:
1.1.1)判断二进制文件中的类基本信息是否发生改变,若父类为减少的类则标记该类类继承关系变化;
1.1.2)判断并标记域存在域在运行时刻偏移是否能保持不变,根据相应VM平台的实例域的布局计算出实例域在堆区对象实例空间中的偏移,该偏移与域出现在二进制文件中的顺序相关,对编译器生成的二进制字节码文件进行重构,调整域出现的顺序;
1.1.3)在1.1.2)调整布局之后,必要时判断并标记出类的实例大小是否发生改变;
1.1.4)判断并标记方法存在方法在运行时刻偏移是否能保持不变,根据相应VM平台实例方法偏移算法计算出偏移,该偏移与方法出现在二进制文件中的顺序有关,必要时对编译器生成的二进制字节码文件进行重构,调整方法出现的顺序;
1.1.5)若有以上之一发生改变,则判定该类定义改变;否则判定为类定义不变,将调整过的字节码写入文件中。
4.根据权利要求3所述的基于字节码文件重构的Java类在线更新方法,其特征在于上述步骤1.1.2)的调整并判断域偏移是否发生改变的详细步骤是:前提:调整过程中如果发现填补空位导致增大对象实例大小,则停止调整,
a)将旧类域进行布局,并将域按照偏移排序;
b)从排序后的列表中按序取出一域f,若在新类中不存在相同定义域f’则继续取下一域;
c)否则,若其能在不破坏前提的情况下将该域f’分配f同样的偏移,则将其放入布局上下文中,从步骤b)继续;
d)否则,标记该域位移改变,将其放入布局上下文中从步骤b)继续。
5.根据权利要求3所述的基于字节码文件重构的Java类在线更新方法,其特征在于上述步骤1.1.4)的调整并判断方法偏移是否发生改变的详细步骤是:
a)先分别将新旧两类实例方法在方法表中的偏移确定,得到方法表mtable与mtable’;
b)在旧类方法表mtable中取出一个方法m,若新类中方法m′偏移与之相同,即m.offset==m’.offset,则继续去旧类中取下一个方法;
c)否则,若该旧类方法在旧类方法表中的偏移m.offset是属于新类方法表中父类继承方法范围,则标记该方法偏移变化;
d)否则,若该旧类方法在旧类方法表中的偏移m.offset是属于该类定义方法范围,则将新类中方法偏移与新类方法表中该偏移处方法偏移交换,即
mtable’[m’.offset]=mtable’[m.offset];
mtable’[m’.offset].offset=m’.offset;
mtable’[m.offset]=m’;
m’.offset=m.offset;
e)否则,若该旧类方法在旧类方法表中的偏移超出新类方法表长度,则扩展新类方法表大小,将新类方法表同一方法偏移
Extend(mtable’);
mtable’[m’.offset]=null;
mtable’[m.offset]=m’;
m’.offset=m.offset。
6.根据权利要求2所述的基于字节码文件重构的Java类在线更新方法,其特征在于上述步骤1.2)中,标记类存在类的方法的具体步骤是在类存在类中取出一方法,判断其在新版本类中是否存在同样的方法:
1.2.1)若不存在,则标记该方法为减少的方法;
1.2.2)若存在则对方法存在方法判断进一步判断方法体是否改变的步骤为:
a)按序取新旧版本方法的指令insnOld,insnNew;
b)若insnOld与insnNew不是同一条指令,则判定该方法体发生改变;
c)若insnOlde与insnNew是同一条指令,则若其没有引用Constant Pool,则按指令格式比较该指令各域;若引用了Constant Pool,则取出ConstantPool中的内容进行比较;若比较结果不同,则判定该方法体发生改变。
7.根据权利要求2所述的基于字节码文件重构的Java类在线更新方法,其特征在于步骤1.3)中,标记引用结构发生改变类的具体步骤为:
1.3.1)取出一条指令,
1.3.2)若该指令是new/anewarray/multianewarray,若其访问的目标类的实例域大小在上述步骤1.1.3)中被判定发生改变,则标记该方法为引用结构变化类的方法;
1.3.3)若该指令是instanceof/checkcast,若其访问的目标类的继承结构在上述1.1.1)步骤中被判定发生变化,则标记该方法为引用结构变化类的方法;
1.3.4)若该指令是getfield/putfield/getstatic/putstatic/invokevirtual/invokespecial之一,若其访问的目标方法、目标域的偏移在上述步骤1.1.2)和11.4)中被判定发生改变,则标记该方法为引用结构变化类的方法。
8.根据权利要求1中所述的基于字节码文件重构的Java类在线更新方法,其特征为步骤3.1)的详细过程是:
3.1.1)移除旧版本的类;
3.1.2)修改ClassLoader的path已找到新类对应的字节码数据流;
3.1.3)通过动态类加载机制加载新类,加载类之后,把旧类的VM元数据属性置换给新类,修改类型系统中类型Id,将旧类Id赋给新类;
3.1.4)修改静态数据表中静态域和方法的偏移,将相应位置处数据替换成新类对应的指针;实例域和实例方法的偏移通过分析调整字节码二进制文件保持不变;
3.1.5)调整之后进行类的初始化、实例化等后续操作。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010544102.1A CN101963914B (zh) | 2010-11-12 | 2010-11-12 | 一种基于字节码文件重构的Java类在线更新方法 |
PCT/CN2011/072410 WO2012062081A1 (zh) | 2010-11-12 | 2011-04-02 | 一种基于字节码文件重构的Java类在线更新方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010544102.1A CN101963914B (zh) | 2010-11-12 | 2010-11-12 | 一种基于字节码文件重构的Java类在线更新方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101963914A true CN101963914A (zh) | 2011-02-02 |
CN101963914B CN101963914B (zh) | 2013-02-27 |
Family
ID=43516796
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010544102.1A Active CN101963914B (zh) | 2010-11-12 | 2010-11-12 | 一种基于字节码文件重构的Java类在线更新方法 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN101963914B (zh) |
WO (1) | WO2012062081A1 (zh) |
Cited By (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2012062081A1 (zh) * | 2010-11-12 | 2012-05-18 | 南京大学 | 一种基于字节码文件重构的Java类在线更新方法 |
CN102736905A (zh) * | 2011-04-12 | 2012-10-17 | 深圳市金蝶中间件有限公司 | 一种动态替换类中字段的方法 |
CN102831057A (zh) * | 2012-08-13 | 2012-12-19 | 于秀山 | 一种用功能图分析软件功能变更及其影响的方法 |
CN103942051A (zh) * | 2014-04-15 | 2014-07-23 | 新浪网技术(中国)有限公司 | 基于paas平台的应用部署方法和装置 |
CN103973475A (zh) * | 2013-02-05 | 2014-08-06 | 腾讯科技(深圳)有限公司 | 差异补丁包生成方法及下载方法、服务器、客户端 |
CN104380250A (zh) * | 2014-05-21 | 2015-02-25 | 华为技术有限公司 | 一种动态创建可附加和可拆除二进制文件的系统和方法 |
CN105068852A (zh) * | 2015-09-22 | 2015-11-18 | 普元信息技术股份有限公司 | 云计算环境下实现Java类在线热更新的系统与方法 |
WO2015176492A1 (en) * | 2014-05-21 | 2015-11-26 | Huawei Technologies Co., Ltd. | A system and method thereof for creating dynamically attachable and detachable binary files |
CN105809028A (zh) * | 2015-01-21 | 2016-07-27 | 三星电子株式会社 | 在移动设备中运行相同应用的多个实例的装置和方法 |
CN106020822A (zh) * | 2016-05-18 | 2016-10-12 | 腾讯科技(成都)有限公司 | 面向Pool对象的弱引用实现方法和装置 |
CN106605212A (zh) * | 2015-02-13 | 2017-04-26 | 甲骨文国际公司 | 在动态链接的运行时环境中的模块化共同版本管理 |
CN106708494A (zh) * | 2015-11-18 | 2017-05-24 | 北京神州泰岳软件股份有限公司 | Jar升级方法及装置 |
CN108027722A (zh) * | 2015-11-20 | 2018-05-11 | 谷歌有限责任公司 | 在编译和部署中动态更新应用 |
CN109445807A (zh) * | 2017-08-28 | 2019-03-08 | 腾讯科技(深圳)有限公司 | 实现应用程序更新的方法、装置和计算机可读存储介质 |
CN110704082A (zh) * | 2019-09-25 | 2020-01-17 | 许昌许继软件技术有限公司 | 一种监控平台的持续化集成方法及系统 |
CN111880806A (zh) * | 2020-07-23 | 2020-11-03 | 深圳融卡智能科技有限公司 | 应用执行方法与应用执行系统 |
USRE48311E1 (en) | 2015-01-21 | 2020-11-17 | Samsung Electronics Co., Ltd. | Apparatus and method for running multiple instances of a same application in mobile devices |
CN112363954A (zh) * | 2020-12-08 | 2021-02-12 | 南京大学 | 基于对象状态一致性的软件动态更新测试方法 |
CN115904551A (zh) * | 2022-11-18 | 2023-04-04 | 中科世通亨奇(北京)科技有限公司 | 使用bean动态替换spring中Class的方法及装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101174217A (zh) * | 2007-11-22 | 2008-05-07 | 上海交通大学 | Java程序可动态更新化实现方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101963914B (zh) * | 2010-11-12 | 2013-02-27 | 南京大学 | 一种基于字节码文件重构的Java类在线更新方法 |
-
2010
- 2010-11-12 CN CN201010544102.1A patent/CN101963914B/zh active Active
-
2011
- 2011-04-02 WO PCT/CN2011/072410 patent/WO2012062081A1/zh active Application Filing
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101174217A (zh) * | 2007-11-22 | 2008-05-07 | 上海交通大学 | Java程序可动态更新化实现方法 |
Non-Patent Citations (4)
Title |
---|
《The ACM SIGPLAN Conference on Programming Language Design and Implementation(PLDI)》 20090630 Suriya Subramanian等 "Dynamic Software Updates: A VM-centric Approach" 第1-12页 1-8 第44卷, 第6期 * |
20090910 GUTIANXIAO "代码动态更新" 全文 1-3,6-8 , * |
GUTIANXIAO: ""代码动态更新"", <URL:HTTP://MOON.NJU.EDU.CN/TRAC/DILEPIS/WIKI/DCODEDOC> * |
SURIYA SUBRAMANIAN等: ""Dynamic Software Updates: A VM-centric Approach"", 《THE ACM SIGPLAN CONFERENCE ON PROGRAMMING LANGUAGE DESIGN AND IMPLEMENTATION(PLDI)》 * |
Cited By (30)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2012062081A1 (zh) * | 2010-11-12 | 2012-05-18 | 南京大学 | 一种基于字节码文件重构的Java类在线更新方法 |
CN102736905B (zh) * | 2011-04-12 | 2015-04-15 | 深圳市金蝶中间件有限公司 | 一种动态替换类中字段的方法 |
CN102736905A (zh) * | 2011-04-12 | 2012-10-17 | 深圳市金蝶中间件有限公司 | 一种动态替换类中字段的方法 |
CN102831057A (zh) * | 2012-08-13 | 2012-12-19 | 于秀山 | 一种用功能图分析软件功能变更及其影响的方法 |
CN102831057B (zh) * | 2012-08-13 | 2015-02-11 | 于秀山 | 一种用功能图分析软件功能变更及其影响的方法 |
CN103973475B (zh) * | 2013-02-05 | 2018-07-06 | 腾讯科技(深圳)有限公司 | 差异补丁包生成方法及下载方法、服务器、客户端 |
CN103973475A (zh) * | 2013-02-05 | 2014-08-06 | 腾讯科技(深圳)有限公司 | 差异补丁包生成方法及下载方法、服务器、客户端 |
CN103942051B (zh) * | 2014-04-15 | 2017-04-05 | 新浪网技术(中国)有限公司 | 基于paas平台的应用部署方法和装置 |
CN103942051A (zh) * | 2014-04-15 | 2014-07-23 | 新浪网技术(中国)有限公司 | 基于paas平台的应用部署方法和装置 |
WO2015176492A1 (en) * | 2014-05-21 | 2015-11-26 | Huawei Technologies Co., Ltd. | A system and method thereof for creating dynamically attachable and detachable binary files |
CN104380250A (zh) * | 2014-05-21 | 2015-02-25 | 华为技术有限公司 | 一种动态创建可附加和可拆除二进制文件的系统和方法 |
CN104380250B (zh) * | 2014-05-21 | 2017-09-08 | 华为技术有限公司 | 一种动态创建可附加和可拆除二进制文件的系统和方法 |
CN105809028A (zh) * | 2015-01-21 | 2016-07-27 | 三星电子株式会社 | 在移动设备中运行相同应用的多个实例的装置和方法 |
CN105809028B (zh) * | 2015-01-21 | 2021-09-14 | 三星电子株式会社 | 在移动设备中运行相同应用的多个实例的装置和方法 |
USRE48311E1 (en) | 2015-01-21 | 2020-11-17 | Samsung Electronics Co., Ltd. | Apparatus and method for running multiple instances of a same application in mobile devices |
CN106605212A (zh) * | 2015-02-13 | 2017-04-26 | 甲骨文国际公司 | 在动态链接的运行时环境中的模块化共同版本管理 |
CN106605212B (zh) * | 2015-02-13 | 2021-03-30 | 甲骨文国际公司 | 在动态链接的运行时环境中的模块化共同版本管理 |
CN105068852A (zh) * | 2015-09-22 | 2015-11-18 | 普元信息技术股份有限公司 | 云计算环境下实现Java类在线热更新的系统与方法 |
CN106708494A (zh) * | 2015-11-18 | 2017-05-24 | 北京神州泰岳软件股份有限公司 | Jar升级方法及装置 |
CN106708494B (zh) * | 2015-11-18 | 2020-11-27 | 北京神州泰岳软件股份有限公司 | Jar升级方法及装置 |
CN108027722A (zh) * | 2015-11-20 | 2018-05-11 | 谷歌有限责任公司 | 在编译和部署中动态更新应用 |
CN108027722B (zh) * | 2015-11-20 | 2021-09-17 | 谷歌有限责任公司 | 在编译和部署中动态更新应用 |
CN106020822B (zh) * | 2016-05-18 | 2019-03-26 | 腾讯科技(成都)有限公司 | 面向Pool对象的弱引用实现方法和装置 |
CN106020822A (zh) * | 2016-05-18 | 2016-10-12 | 腾讯科技(成都)有限公司 | 面向Pool对象的弱引用实现方法和装置 |
CN109445807A (zh) * | 2017-08-28 | 2019-03-08 | 腾讯科技(深圳)有限公司 | 实现应用程序更新的方法、装置和计算机可读存储介质 |
CN110704082A (zh) * | 2019-09-25 | 2020-01-17 | 许昌许继软件技术有限公司 | 一种监控平台的持续化集成方法及系统 |
CN111880806A (zh) * | 2020-07-23 | 2020-11-03 | 深圳融卡智能科技有限公司 | 应用执行方法与应用执行系统 |
CN111880806B (zh) * | 2020-07-23 | 2023-11-21 | 无锡融卡科技有限公司 | 应用执行方法与应用执行系统 |
CN112363954A (zh) * | 2020-12-08 | 2021-02-12 | 南京大学 | 基于对象状态一致性的软件动态更新测试方法 |
CN115904551A (zh) * | 2022-11-18 | 2023-04-04 | 中科世通亨奇(北京)科技有限公司 | 使用bean动态替换spring中Class的方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN101963914B (zh) | 2013-02-27 |
WO2012062081A1 (zh) | 2012-05-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101963914B (zh) | 一种基于字节码文件重构的Java类在线更新方法 | |
Dmitriev | Towards flexible and safe technology for runtime evolution of java language applications | |
Krall et al. | CACAO—A 64‐bit JavaVM just‐in‐time compiler | |
US6973646B1 (en) | Method for compiling program components in a mixed static and dynamic environment | |
US5325533A (en) | Engineering system for modeling computer programs | |
Würthinger et al. | Dynamic code evolution for Java | |
US7543309B2 (en) | Efficient linking and loading for late binding and platform retargeting | |
US8434099B2 (en) | Efficient linking and loading for late binding and platform retargeting | |
US7565665B2 (en) | Efficient linking and loading for late binding and platform retargeting | |
US6728963B1 (en) | Highly componentized system architecture with a loadable interprocess communication manager | |
CN1119756C (zh) | 用于进行静态初始化的方法和系统 | |
CN106663019A (zh) | 处理值类型 | |
CN102243595B (zh) | 基于MMU架构的Java Card系统组件更新方法 | |
US7949848B2 (en) | Data processing apparatus, method and computer program product for reducing memory usage of an object oriented program | |
US10346310B2 (en) | Cache block apparatus and methods | |
US20090133042A1 (en) | Efficient linking and loading for late binding and platform retargeting | |
US7581216B2 (en) | Preserving platform independence with native accelerators for performance critical program objects | |
US20050028132A1 (en) | Application specific optimization of interpreters for embedded systems | |
Aslam et al. | Introducing TakaTuka: a Java virtualmachine for motes | |
US7159222B1 (en) | Highly componentized system architecture with object mutation | |
Cech Previtali et al. | Aspect-based dynamic software updating: a model and its empirical evaluation | |
Stadler et al. | Lazy continuations for Java virtual machines | |
Wang et al. | Hop, skip, & jump: Practical on-stack replacement for a cross-platform language-neutral VM | |
Hlopko et al. | Towards a Runtime Code Update in Java. | |
EP0811192B1 (en) | Operating system runtime supporting release-to-release binary compatibility |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20200624 Address after: No. 41-1, Qianfo Shandong Road, Lixia District, Jinan City, Shandong Province Patentee after: SHANDONG CIVIC SE COMMERCIAL MIDDLEWARE Co.,Ltd. Address before: 210093 No. 22, Hankou Road, Nanjing, Jiangsu Patentee before: NANJING University |