CN101030149B - 快速的基于补丁的方法调用 - Google Patents

快速的基于补丁的方法调用 Download PDF

Info

Publication number
CN101030149B
CN101030149B CN2007100799461A CN200710079946A CN101030149B CN 101030149 B CN101030149 B CN 101030149B CN 2007100799461 A CN2007100799461 A CN 2007100799461A CN 200710079946 A CN200710079946 A CN 200710079946A CN 101030149 B CN101030149 B CN 101030149B
Authority
CN
China
Prior art keywords
call
goal approach
code
state
patch
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.)
Active
Application number
CN2007100799461A
Other languages
English (en)
Other versions
CN101030149A (zh
Inventor
克里斯多弗·J·普卢默
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sun Microsystems Inc
Original Assignee
Sun Microsystems Inc
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Sun Microsystems Inc filed Critical Sun Microsystems Inc
Publication of CN101030149A publication Critical patent/CN101030149A/zh
Application granted granted Critical
Publication of CN101030149B publication Critical patent/CN101030149B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Acyclic And Carbocyclic Compounds In Medicinal Compositions (AREA)
  • Pharmaceuticals Containing Other Organic And Inorganic Compounds (AREA)
  • Debugging And Monitoring (AREA)

Abstract

公开了一种用于从编译的调用方法中提供对目标方法的快速调用的基于补丁的机制。调用方法的代码存储在存储器中。调用方法的代码包括用于调用目标方法的指令,其中,指令包括参数。响应于目标方法所经历的从当前状态到新状态的状态变化,将参数从第一值修改成第二值,其中,第二值指示正确地址以有助于目标方法在其新状态中的执行。因此,在用于调用目标方法的指令中的参数总是反映目标方法的正确状态,这为在执行指令时对目标方法的快速调用作好了准备。

Description

快速的基于补丁的方法调用
背景技术
本节中描述的方法可以被推行,但不一定是先前已经构思或推行的方法。因此,除非本文另外指出,否则本节中描述的方法相对于本申请的权利要求来说就不是现有技术,而且也不应该由于包含在本节中就被认为是现有技术。
典型的Java虚拟机(JVM)包括用于执行Java应用程序或其他基于Java的代码的解释器。当作为Java类的实例(instance)中的字节码而被执行的Java方法被调用时,解释器就访问该方法并解释地执行字节码。一些JVM可进一步提供动态自适应编译器来加速Java方法的执行。当这样的JVM检测到特定方法被频繁执行时,JVM就使用动态自适应编译器来将该方法编译成本机代码(nativecode)。JVM将本机代码存储到内存(如,代码高速缓存)的区域中,而在下一次调用该方法时,JVM就执行在内存中找到的本机代码而不是使用解释器来解释地执行该方法的字节码。为了有效利用其所分配的内存,这种JVM通常从内存中去除不再频繁使用的编译方法的本机代码。从内存中去除编译方法的可执行代码的过程在本文被称为反编译(decompilation)。
典型方法可包括对多个其他方法的调用(invocation或call)甚或其自身的调用(如,循环调用)。调用另一方法的方法在本文中称为调用方法。正被另一方法调用的方法在本文中称为目标方法。在典型的JVM中,来自于被编译的方法的方法调用要慢于所需要的,这是因为在编译时调用方法不知道目标方法的正确运行时间地址。例如,假设JVM决定编译包括对目标方法的调用的调用方法。在编译时,该JVM并不肯定地知道该目标方法的运行时间地址,这是因为(1)在对调用方法进行了编译之后目标方法的编译状态(如,编译的或未编译的)会改变,或者(2)目标方法可以是在调用方法被编译之后,可以由另一方法覆盖的虚拟方法。由于这一不确定性,JVM仅在目标方法被调用时的运行时间可以确定目标方法的正确地址;因此,在编译调用方法并将其可执行代码存储在内存中之后,必须在调用方法每次实际调用目标方法时、通过在存储在内存中的目标方法的方法块中执行查找来确定目标方法的地址。(被加载的方法的方法块通常指明方法的类型并存储关于该方法的其他运行时间信息)。
这种调用目标方法的方法可导致具有流水线结构的计算机处理器速度明显降低。在这种处理器中,流水线用于在处理器对来自于前一指令的结果进行解码、执行或写入时,预见并预先取得后续指令。这样,流水线处理器可并行处理和执行多个指令(例如,在将第一指令的结果写入内存或寄存器时,该处理器执行第二指令、对第三指令解码以及获取第四指令。在调用目标方法的上述方法中,在调用方法被编译时该目标方法的地址不确定性可造成处理器在执行调用方法的过程中会预先取得错误指令,这又会使得该处理器刷新其流水线。然而,刷新处理器流水线浪费了处理器周期并造成执行速度降低。
例如,当对调用目标方法的调用方法的代码进行编译时,有必要使用间接引用,因为并不知道,在调用所述目标方法的时刻,是否将会编译该目标方法。在一些处理器结构中,以下指令组可用于调用方法的编译代码之中,以通过间接引用来对目标方法进行调用:
#目标方法的方法块地址被预先存储在“a0”中
mov    lr,pc
ldr    pc,[a0].
上述指令中的第一条(“mov lr,pc”)将程序计数器“pc”的值存为在目标方法已经完成执行之后将在此继续执行的返回地址。例如,在ARM处理器结构上,程序计数器“pc”将会包含当前指令地址加8。第二条指令(“ldr pc,[a0]”)将目标方法的当前地址从内存中的目标方法的方法块的第一个字开始加载到程序计数器中。如果在执行时编译目标方法,则目标方法的当前地址(其存储在目标方法的方法块的第一个字中)是代码高速缓存中的目标方法地址;如果目标方法未被编译,则目标方法的当前地址就是使得将执行改向到解释器的一些协助器胶水代码(helper glue code)的地址。上述调用目标方法的指令组在具有流水线的处理器上执行不佳,这是因为该处理器由于间接引用而不能预见以及确定目标方法的当前地址。这可能会导致每次调用目标方法时都完全刷新一次处理器流水线,并且浪费掉的处理器周期数量可能等于流水线的深度。
为了减少处理器流水线刷新的可能,用于目标方法调用的过去的方法依赖于对已经被编译的目标方法进行直接方法调用。然而,当编译目标方法从被编译状态改变到未被编译的状态时会出现问题,这是因为,在目标方法被反编译以后,调用该目标方法的调用方法中的直接调用就不再指向正确的地址。为了解决这一问题,过去的方法通常依赖于对被编译的调用方法进行强制性的反编译。强制性的反编译规定无论何时目标方法的状态发生变化(例如,无论何时目标方法被覆盖或者被反编译),都对包括用于直接调用该目标方法的指令的所有编译方法进行反编译。
然而,强制性的反编译有某些显著的缺陷。一种缺陷在于强制性的反编译难于执行,特别是对于当前正在执行的方法。强制性的反编译的另一缺陷在于在所使用的内存和处理器周期方面成本很高。当反编译方法时,必须反编译有必要调用该方法的所有其他编译方法。因此,单个目标方法的状态变化可能引起相当数量的编译方法的一连串的反编译。此外,被频繁调用的反编译方法最终将不得不被重新编译,这就造成了诸如内存和处理器周期的资源的额外的使用。
基于前述,明确需要一种不引起处理器流水线刷新以及避免上述强制性的反编译的缺陷的技术。
发明内容
为了能够实现更快速的方法调用,本发明的一个实施例提供了一种技术,该技术用于修改在调用目标方法的编译的调用方法的可执行代码中的指令参数。维护调用目标方法的指令参数以在任何给定时间都反映目标方法的当前状态。参数可以是与指令相关的任何数据,例如,诸如与指令相关的操作码、与指令相关的操作数、以及操作码和一个或多个操作数的组合。响应于目标方法的状态变化,编译的调用方法中的指令参数被修改以反映目标方法的当前状态。因此,本文所述的技术要快于现有方法,这是因为调用方法不需要被反编译并且不执行目标方法的方法块中的额外的内存查找。
根据本文所述的技术,编译的调用方法包括用于调用目标方法的指令。基于目标方法是虚拟方法还是非虚拟的或静态方法,目标方法存在六种可能状态:
(1)非虚拟/静态:被编译
(2)非虚拟/静态:未被编译
(3)虚拟:被覆盖且被编译
(4)虚拟:被覆盖且未被编译
(5)虚拟:未被覆盖且被编译
(6)虚拟:未被覆盖且未被编译
与指令相关联的参数总是反映正确地址,以有助于在其当前状态的目标方法的执行。如果目标方法处于状态(1)或(5),那么参数就指明目标方法开始执行的代码高速缓存中的地址。如果目标方法处于状态(2),那么参数就引用一组代码,这些代码使得解释器执行目标方法的未编译版本。如果目标方法处于状态(3)、(4)或(6),那么参数就引用用于调用虚拟方法的一组代码。
在一个实施例中,用于本文中所述的快速的基于补丁的方法调用的技术为从调用方法的可执行代码对非虚拟的和静态的这两种目标方法所进行的补丁调用作好了准备。在该实施例中,在调用方法的可执行代码中编译包括参数的直接转移-链接(brand-and-link)指令以调用目标方法。如果目标方法当前被编译并存于代码高速缓存中,则转移-链接指令参数就指示目标方法开始执行的代码高速缓存中的地址。响应于被反编译并从代码高速缓存中被去除的目标方法,修改转移-链接指令参数值来引用一组代码,该组代码使得解释器执行目标方法的未编译版本。
在一个实施例中,用于本文中所述的快速的基于补丁的方法调用的技术还为从调用方法的可执行代码对虚拟目标方法所进行的补丁调用作好了准备。在该实施例中,在调用方法的可执行代码中使用直接转移-链接指令来调用虚拟目标方法。根据本文中所述的技术,当目标方法经历了其编译状态(如,被编译或未被编译)或者其覆盖状态(如,被覆盖或未被覆盖)之中的至少一种或多种改变时,就可以对调用虚拟目标方法的直接转移-链接指令打补丁。直接转移-链接指令可通过修改指令参数而被打补丁,其中,以反映虚拟目标方法的当前状态的方式设定并修改该参数。如果目标方法当前被至少一种其他方法所覆盖,则设置参数值以引用能够调用虚拟方法的一组代码。当执行调用虚拟方法的一组代码时,就确定将被执行的目标方法(如原始目标方法或者覆盖方法)的身份并且有助于执行识别的方法。例如,如果在执行直接转移-链接指令时对识别的目标方法进行反编译,则当执行用于调用虚拟方法的代码组时,将会使得解释器执行目标方法。如果识别的目标方法被编译并被存储到代码高速缓存中,则在执行调用虚拟方法的代码组时,就会导致执行被转移到代码高速缓存中的目标方法的可执行代码开始处。如果虚拟目标方法当前并未被任何其他方法所覆盖,并且当前正被编译并被存储到代码高速缓存中,则参数值指示代码高速缓存中的目标方法的可执行代码开始之处。响应于经历其编译状态和/或其覆盖状态之中任何状态变化的虚拟目标方法,直接转移-链接指令就可如上所述地通过修改其参数值以反映目标方法的当前状态来被打补丁。
附图说明
图1是可在其中执行本发明实施例的系统的功能框图;
图2A是示出根据其中目标方法经历了到编译状态的改变的实施例的代码高速缓存的框图;
图2B是示出根据其中目标方法经历了到未编译状态的改变的实施例的代码高速缓存的框图;
图3是示出根据其中目标方法是未被覆盖的且未被编译的虚拟方法的实施例的代码高速缓存的框图;
图4A是示出根据一个实施例的包括对静态或非虚拟目标方法进行调用的调用方法的编译的流程图;
图4B是示出根据一个实施例的对非虚拟或静态目标方法进行调用的调用方法的打补丁的流程图;
图4C是示出根据一个实施例的包括对虚拟目标方法进行调用的调用方法的编译的流程图;
图4D是示出根据一个实施例的对虚拟目标方法进行调用的调用方法的打补丁的流程图;以及
图5是可在其中实施本发明的一个实施例的通用计算机系统的框图。
具体实施方式
概述
本文所描述的快速的基于补丁的方法调用使用来自被编译的调用方法的直接方法调用,而不是间接引用。不同的处理器结构可提供不同的指令或者指令类型,它们可被用来使得直接调用更容易,包括但不限于:转移-链接指令(branch-and-link instructions)、跳转指令(jump instructions)以及跳转-链接指令(jump-and-linkinstructions)。因此,如下文所述的,用于使得来自被编译的调用方法的直接方法调用更容易的指令被认为是示例性而不是限制性的。
在一些实施例中,在调用方法的编译代码中使用直接转移-链接指令来调用目标方法。本文中所用的直接转移-链接指令通常是指在由处理器执行时就基于指令所指定的参数而直接转移执行。根据特定的处理器结构,在直接转移-链接指令中所指定的参数可以是任何引用,例如,诸如标号、指令指针、寄存器以及程序堆栈上的地址。在一些实施例中,与这样的指令相关的参数可以是与指令相关的操作码、与指令相关的操作数、或操作码和一个或多个操作数的组合。根据本文所述的技术,在直接转移-链接指令中指定的参数被保留以指明正确地址以有助于目标方法执行。例如,如果目标方法被编译,则参数就会指示代码高速缓存中目标方法的起始地址;如果目标方法未被编译,则参数就会指示一组代码的地址,该组代码使得目标方法的未编译版本被解释地执行;如果目标方法被另一方法所覆盖,则参数将会指示一组代码的地址,该组代码确定在执行直接转移-链接指令之后哪种方法将被调用。当目标方法经历状态变化时(例如,诸如,当目标方法被反编译时或者当目标方法的状态从没有被任何其他方法所覆盖的状态改变到正在被另一方法所覆盖状态时),就通过修改参数来指明正确地址以有助于在其当前状态的目标方法的执行来对调用方法的编译代码之中的直接转移-链接指令打补丁。以此方式,在目标方法改变状态时调用方法不被反编译。同时,实际有助于执行目标方法的直接转移-链接指令指明正确的后续指令,这允许处理器在执行转移-链接指令的很早以前就预先取得处理器流水线中的这些后续指令。因此,本文所述的用于快速的基于补丁的方法调用的技术就比现有方法要快,这是由于不必对调用方法进行反编译且无需在目标方法的方法块中执行额外的内存查找。
图1是可在其中实施本文所述的快速的基于补丁的方法调用的技术的一个实施例的系统功能框图。为了图示的目的,本文参照JVM对实施例进行了描述。然而应注意到,本文中所述的用于快速的基于补丁的方法调用的技术并不限于仅在JVM中执行。相反,本文中所述的概念和技术可应用于任何进程或能够动态编译并且解释地执行面向对象的类的实例的虚拟机。
参照图1,系统100包括在操作系统102上执行的JVM 104。操作系统102可以是任何类型的操作系统,包括但不限于:Unix操作系统(例如,诸如Sun Microsystems,Inc.开发的Solaris OS)、Linux操作系统(例如,诸如Debian)、以及Windows操作系统(例如,诸如微软公司开发的Windows XP)。操作系统102提供了系统100中的其他组件所依赖的初级功能。
JVM 104是包括解释器106、动态自适应编译器(DAC)108以及代码高速缓存105的处理器。虽然图1将组件105、106和108示为JVM 104的一部分,但也应注意到,如果需要的话,则这些组件可与JVM 104分开来实施。解释器106解释地执行Java应用程序或者由JVM 104支持来执行的其他基于Java的代码。JVM 104使用DAC 108对频繁由JVM执行的方法进行解释并将其存储到代码高速缓存105。代码高速缓存105是用于存储可执行代码的内存或其他存储器中的区域。在不同实施例中,系统100可在操作系统102上执行多个JVM进程,而每个JVM都包括其自己的组件;然而,为了示例性的目的,在图1中仅示出了一个这样的JVM及其组件。解释器106和动态编译器108可在JVM 104中作为不同的执行实体(例如,诸如进程或线程)来执行。代码高速缓存105可为能够被JVM 104用来存储可执行代码的任何类型的内存或其他类型的快速存储器。因此,应该将图1中的JVM 104及其组件看作是示例性的而不是限制性的。
根据一个实施例,JVM 104执行本文所述的快速的基于补丁的方法调用技术。在此实施例中,JVM 104使用DAC 108来将调用方法编译成可执行代码并将可执行代码存储到代码高速缓存105中。JVM 104还包括用于将目标方法(其可被调用方法所调用)的状态从当前状态改变到不同的新状态的一组或多组代码或者其他逻辑。响应于目标方法所经历的状态变化,JVM 104中的一组代码或其他逻辑就对从调用方法的可执行代码中调用目标方法的指令进行定位,并且对由该指令指定的参数打补丁以指明当前地址以有助于目标方法的执行。
调用非虚拟和静态方法
本文所述的快速的基于补丁的方法调用技术为从调用方法的可执行代码中对非虚拟的和静态的目标方法这两者所进行的补丁调用作好了准备。可以以相同的方式将本文所述的技术应用于非虚拟的和静态的目标方法,这是因为在编译调用方法时可以确定非虚拟和静态这两种目标方法。
在一个实施例中,在调用方法的可执行代码中使用直接转移-链接指令来调用目标方法。下面是用于调用被编译的且存储于代码高速缓存中的目标方法的这种指令的实例:
bl    <target_method_pc>。
在上述指令中,指令参数“<target_method_pc>”是指明代码高速缓存中的开始执行目标方法的地址。响应于正在被反编译并被从代码高速缓存中去除的目标方法,上述指令按以下来被打上补丁:
bl    <invokeInterpreter>。
指令参数“<invokeInterpreter>”具有引用一组代码的值,该组代码使得目标方法的未编译版本由解释器来执行。在该实施例的说明中,图2A是描述了其中目标方法经历了到编译状态的改变的代码高速缓存的框图,而图2B是描述了其中目标方法经历了到未被编译状态的改变的代码高速缓存的框图。(未被编译状态在本文中也被称为未编译状态。)
参照图2A,其描绘了代码高速缓存105。调用方法202的和目标方法208的可执行代码存储在代码高速缓存105中。如省略号211所示,也可将一个或多个其他编译方法或其他可执行代码存储在代码高速缓存105中。调用方法202包括用于调用目标方法208的直接转移-链接指令204。指令204包括引用代码高速缓存105中的目标方法208的可执行代码的开始的参数206。
在已编译调用方法202之后,响应于目标方法的状态变化(在状态变化中,目标方法刚刚被编译并存储到代码高速缓存105中),可设置参数206的值以引用目标方法208的可执行代码的开始。如果在编译调用方法202时,目标方法208已经被编译并存储到了代码高速缓存105之中,则也可以设置参数206的值以引用目标方法208的可执行代码的开始。
现参照图2B,代码高速缓存105存储调用方法202的可执行代码,以及如省略号211指示的其他可执行代码。目标方法208处于未编译状态且并没有存储在代码高速缓存105之中。直接转移-链接指令204的指令参数206存储引用一组代码210的值,当执行该组代码时就转移执行到解释器,该解释器然后执行未编译的目标方法。(invokeInterpreter代码210是根据底层(underlying)的JVM的特定实施而可能或可能不驻留在代码高速缓存105之中的协助器胶水代码;仅仅为了说明的目的,图2B中的invokeInterpreter代码被描绘在了代码高速缓存105之外。)
在已经对调用方法202进行了编译之后,响应于目标方法的状态变化(在状态变化中,目标方法刚刚被反编译并从代码高速缓存105中去除),可设置参数206的值来引用invokeInterpreter代码210。如果在编译调用方法202时,目标方法208处于未编译状态,则也可以设置参数206的值来引用invokeInterpreter代码210。
总之,在编译调用方法时,对关于目标方法的状态(如,被编译或未被编译)进行确定。如果目标方法未被编译且没有存储在代码高速缓存中,则调用方法的可执行代码中的指令(如图2A和2B中的直接转移-链接指令204)包括引用一组代码的参数(如图2B中的参数206),该组代码使目标方法的未编译版本被解释地执行。如果后来目标方法经历了被编译且被存储到代码高速缓存中的状态变化,则指令就用参数值打补丁,而该参数值引用代码高速缓存中的目标方法的可执行代码的开始(如图2A中的参数206)。
如果正在编译调用方法时,目标方法已被编译并被存储到了代码高速缓存中,则调用方法的可执行代码中的指令(如图2A和2B中的直接转移-链接指令204)就包括引用代码高速缓存中的目标方法的可执行代码的开始的参数(如图2A中的参数206)。当后来目标方法被反编译并从代码高速缓存中去除时,指令就用引用一组代码的参数值(如图2B中的参数206)打补丁,而该组代码使目标方法的未编译版本被解释地执行。
图4A是示出根据一个实施例的包括对静态或非虚拟目标方法进行调用的调用方法的编译流程图。在步骤402中,编译调用方法。作为编译调用方法的一部分,在步骤404中对关于将要被调用方法调用的目标方法是被编译的还是未被编译的进行确定。
如果在步骤404中确定了目标方法是经过编译的,则在步骤406中,设置从调用方法的可执行代码中调用目标方法的指令参数来引用代码高速缓存中的目标方法的可执行代码的开始地址。如果在步骤404中确定了目标方法是未被编译的,则在步骤408中将调用目标方法的指令参数设置成invokeInterpreter代码的地址,在执行invokeInterpreter代码时转移执行到执行目标方法的解释器。
在步骤409中,对关于调用方法是否包括对其他静态或非虚拟方法进行的其他任何调用进行确定。如果调用方法包括对其他静态或非虚拟方法的调用,则为调用方法中对这些其他静态或非虚拟目标方法的所有调用而重复步骤404到408。以此方式处理了调用方法中对静态或非虚拟目标方法的所有调用之后,在步骤410中,将经过编译的调用方法存储到代码高速缓存中。
图4B是示出根据一个实施例的对非虚拟或静态目标方法进行调用的调用方法的打补丁流程图。在步骤412中,对目标方法的状态进行改变。例如,在步骤412中,目标方法可经历从编译状态到未编译状态的改变。可选地,在步骤412中,目标方法也可经历从未编译状态到编译状态的改变。
响应于对目标方法所进行的状态变化,步骤414在所有调用方法(例如,在诸如在图4A的步骤402中被编译的调用方法)中重复对目标方法的可打补丁的调用。对于调用方法中的每个可打补丁的调用来说,在图4B的步骤416中,调用目标方法的指令被定位于该调用方法的可执行代码之中。在指令被定位之后,在步骤418中,修改指令的参数来反映目标方法的新状态。如果目标方法已经历了从编译状态到未编译状态的改变,则改变指令的参数值来引用invokeInterpreter代码。如果目标方法已经历了从未编译状态到编译状态的改变,则改变指令的参数值来引用代码高速缓存中的被编译的目标方法可执行代码的开始。
在步骤419中,对是否在相同或其他调用方法中存在用于调用目标方法的任何其他可打补丁的调用进行确定。如果还有可打补丁的调用,则为调用方法或多个方法中的那些可打补丁的调用执行步骤416和418。如果在步骤419中确定了已经修改了对目标方法的所有可打补丁的调用,则在步骤420中继续其他处理。
跟踪非虚拟和静态方法调用
在一个实施例中,执行本文描述的快速的基于补丁的方法调用技术涉及到跟踪从多个被编译的调用方法对目标方法所进行的直接引用。从被编译的调用方法对该目标方法的直接引用可以是指令的参数,这些指令用在用于调用目标方法的被编译的调用方法的可执行代码中。可以将直接引用作为目标方法和被编译的调用方法中的特定指令位置之间的关联(association)记录到内存或其他存储器中。
例如,可在目标方法和被编译的调用方法中的指令之间记录关联,其中,关联指明调用方法的可执行代码中的指令的位置。当目标方法经历了状态变化(如,从被编译到未被编译)时,关联就被用来对调用方法的可执行代码中的指令进行识别和定位。在指令以此方式被识别和定位之后,通过改变指令参数以反映目标方法的新状态可以对指令打补丁。
对目标方法和调用目标方法的被编译的调用方法中的指令之间的关联进行跟踪,可以通过在用于存储关联的内存或其他存储器中提供数据结构以及提供用于定位数据结构中的信息的查询机制来实现。例如,数据结构可以是哈希表,并且哈希函数可以用来在哈希表中对目标方法和在被编译的调用方法中的指令之间的关联进行定位。
在一个实施例中,可以将补丁记录存储到带有信息的数据结构中,该信息指示目标方法和被编译的调用方法的可执行代码中的指令之间的关联。此外,当目标方法经历状态变化时,补丁记录还可包括实际被用来修改指令的一个或多个参数的补丁数据。此外,补丁记录也可包括指示补丁记录的特定类型的信息。例如,响应于哪个补丁数据被用来给调用方法指令打补丁,补丁记录的一个或多个位或字节可指示目标方法状态变化的类型(例如,诸如编译状态变化)。
此外,执行本文所述快速的基于补丁的方法调用技术还可涉及到在对调用方法进行反编译时去除目标方法和被编译的调用方法中的指令之间的关联。
在一个实施例中,可以通过遍历在特定的被反编译的调用方法和一个或多个目标方法的指令之间所做的所有关联的列表来去除这样的关联。在该实施例中,基于特定的被反编译的调用方法的身份来确定对目标方法的所有关联的列表。一旦确定了特定的被反编译的调用方法的关联列表,就从存储它们的内存或其他存储器中除去该列表上的关联。
在另一个实施例中,可通过遍历所有被记录的关联来去除目标方法和被编译的调用方法中的指令之间的关联。在该实施例中,对每个关联进行确定由关联反映的调用方法是否已经被反编译,并且如果调用方法已经被反编译,则就将所述关联从其被记录的内存或其他存储器中去除。
调用虚拟方法
本文所述的快速的基于补丁的方法调用技术为从调用方法的可执行代码对虚拟目标方法所进行的补丁调用作好了准备。在面向对象编程中,虚拟方法是在基类(base class)中的方法,其允许被在该基类的子类中执行的另一方法所覆盖。通常,虚拟目标方法的身份直到调用方法被执行时才被知晓,这是因为只有在运行时间(runtime)才可以确定调用对象的实例类型(以及因此应该被调用的覆盖方法的身份)。
类似于上述快速的基于补丁的非虚拟方法的调用技术,在一个实施例中,直接转移-链接指令用于调用方法的可执行代码中以调用虚拟目标方法。根据本文所述的技术,在目标方法经历了其编译状态(如,被编译或者未被编译)和其覆盖状态(如,被覆盖或者未被覆盖)之中的至少一种或多种的改变时,可以对调用虚拟目标方法的直接转移-链接指令打补丁。以下是用于调用虚拟目标方法的这样的转移-链接指令的实例:
bl    <P>。
以反映虚拟目标方法的当前状态的方式来设定和修改指令参数“<P>”的值。如果目标方法当前被至少一种其他方法所覆盖,则设定参数“<P>”的值来对能够执行虚拟方法调用的一组代码进行引用。能够执行虚拟方法的虚拟调用的一组代码在下文中被称为“invokeVirtual”代码。当执行invokeVirtual代码时,确定将被执行的目标方法(例如,基于调用对象的实例类型的原始目标方法或者覆盖方法)的身份并且使得执行所识别的方法更容易。例如,如果在执行上述指令时所识别的目标方法是未被编译的,则在执行上述invokeVirtual代码时就会引起解释器执行目标方法。如果所识别的目标方法被编译并被存储到代码高速缓存中,则在执行invokeVirtual代码时就会造成执行被转移到在代码高速缓存中的目标方法的可执行代码的开始。
当最初编译调用方法时,如果虚拟目标方法(1)被编译并被存储到代码高速缓存中,以及(2)未被任何其他方法所覆盖,则将上述直接转移-链接指令中的参数“<P>”初始设成某一值,该值引用代码高速缓存中的目标方法的可执行代码的开始。如果在任何后来点,虚拟目标方法经历其编译状态和/或其覆盖状态之中任一状态的状态变化,则可通过修改参数“<P>”的值来引用invokeVirtual代码来对上述直接转移-链接指令打补丁。否则,如果在初始编译调用方法时,目标方法被至少一个其他方法所覆盖,则在一些实施例中生成一组嵌入(in-line)代码来执行目标方法的虚拟调用。在这些实施例中,如果在任何后来点,虚拟调用方法都经历任一状态变化,则由于在所述方法保持被覆盖时所述一组嵌入代码执行速度快并展现更好的性能,则并不试图进行打补丁。如果在最初编译调用方法时,目标方法未被编译并未被任何其他方法所覆盖,则将上述直接转移-链接指令中的参数“<P>”设定成invokeVirtual代码的地址。如果在任何后来点,虚拟目标方法都经历了其编译状态的改变并且变成被编译的、但尚未被其他任何方法所覆盖,则通过修改参数“<P>”的值来反映目标方法的新状态(例如,由于目标方法在其新状态中被编译,则参数“<P>”的值就可被设定成代码高速缓存中的目标方法的可执行代码的开始)来对上述直接转移-链接指令打补丁。
图3是示出根据其中目标方法是未被覆盖的且未被编译的虚拟方法的实施例的代码高速缓存的框图。图3中,调用方法302的可执行代码存储在代码高速缓存105中。如省略号311所示,一个或多个其他编译方法或其他可执行代码也可存储到代码高速缓存105中。调用方法302包括用于调用虚拟目标方法的直接转移-链接指令304。图3反映了其中目标方法未被编译并且未被任何其他方法所覆盖的虚拟目标方法的状态。指令304包括引用一组invokeVirtual代码310的参数306。invokeVirtual代码310是根据底层的JVM的特定实施而可能或可能不驻留在代码高速缓存105中的协助器胶水代码。(仅为了说明的目的,在图3中,将invokeVirtual代码绘制在代码高速缓存105之外。)当被执行时,invokeVirtual代码310执行目标方法的虚拟调用。例如,如果目标方法是未编译的,则执行就被转移到执行所述方法的未编译版本的解释器。在一些实施例中,响应于经历状态变化以便在新状态中目标方法被编译并被存储到代码高速缓存105中的虚拟目标方法,可以修改参数306的值来引用代码高速缓存中的目标方法的可执行代码的开始。
在一些实施例中,如果在最初正在编译调用方法时由至少一种其他方法覆盖虚拟目标方法,则在调用方法的可执行代码中生成一组嵌入代码以用于执行目标方法的虚拟调用。在这些实施例中,即使后来虚拟目标方法经历了状态变化以使得目标方法不再被任何其他方法所覆盖,也不会尝试打补丁,这是因为,一旦目标方法被覆盖,其通常保持被覆盖状态,在目标方法保持被覆盖时,嵌入代码就生成目标方法的更快速调用并避免消耗处理资源来追踪目标方法状态变化。
图4C是示出根据一个实施例的包括对虚拟目标方法进行调用的调用方法的编译流程图。在步骤422中,编译调用方法。作为编译调用方法的一部分,在步骤423中对将要被调用方法调用的虚拟目标方法是否被一个或多个其他方法覆盖进行确定。
如果在步骤423中确定了虚拟方法由至少一种其他方法覆盖,则在步骤425中生成一组嵌入代码并将其插入到调用方法中。当执行所述一组嵌入代码时就执行目标方法的虚拟调用。这种虚拟调用可包括例如:首先确定是否原始目标方法或覆盖方法将被执行,然后促进执行所述经过识别的方法。在步骤425中生成嵌入代码之后,执行步骤427。如果在步骤423中确定了虚拟目标方法未被任何其他方法所覆盖,则执行步骤424。
在步骤424中,对虚拟目标方法是被编译还是未被编译进行确定。如果在步骤424中确定了虚拟目标方法被编译,则在步骤426中,设置从调用方法的可执行代码中调用目标方法的指令的参数,以引用在代码高速缓存中的目标方法的可执行代码的开始地址。如果在步骤424中确定了虚拟目标方法未被编译,则执行步骤429并将指令参数设成invokeVirtual代码地址,在某些实施例中invokeVirtual代码地址可以是用于调用虚拟方法的一组已生成的代码。
在步骤427中,对调用方法是否包括对其他虚拟目标方法的任何其他调用进行确定。如果调用方法包括对其他虚拟目标方法的调用,则为调用方法中对这些其他虚拟目标方法的所有调用重复步骤423到426。在以此方式处理了调用方法中的对虚拟目标方法的所有调用之后,在步骤428中,将被编译的调用方法存储到代码高速缓存中。
图4D是示出根据一个实施例的对虚拟目标方法进行调用的调用方法的打补丁流程图。在步骤430中,对虚拟目标方法的状态进行改变。例如,在步骤430中,虚拟目标方法可经历其编译状态的改变。可选地,或者此外,在步骤430中,目标方法可经历其覆盖状态的改变。
响应于对虚拟目标方法所进行的状态改变,在步骤431中,对关于虚拟目标方法先前是否被覆盖进行确定。例如,在一些实施例中,可以将覆盖标志存储在虚拟目标方法中;在这些实施例中,无论何时虚拟目标方法首次被覆盖,都可以设置覆盖标志,然后可以检查覆盖标志来确定该虚拟目标方法是否先前已经被覆盖。如果在步骤431中做出了该虚拟目标方法先前已经被覆盖的确定,则这将表明无论何时调用了目标方法,调用目标方法的所有调用方法中的指令已经被设置以引用invokeVirtual代码。因此,在该实施例中,调用目标方法的所有调用方法中的指令不需要打补丁,并且可以执行步骤442以继续其他处理。
如果在步骤431中做出了虚拟目标方法先前未被覆盖的确定,则在步骤432中做出关于在新状态中目标方法是否被另一方法覆盖的确定。
如果在步骤432中做出了在新状态中虚拟目标方法被至少一种其他方法所覆盖的确定,则步骤434A就重复对所有调用方法(诸如图4C步骤422中被编译的调用方法)中的虚拟目标方法的可打补丁的调用。对于调用方法中的每个可打补丁的调用,在图4D的步骤436A中,调用目标方法的指令都被定位于所述调用方法的可执行代码之中。指令被定位之后,在步骤438A中,修改指令的参数来引用invokeVirtual代码,当执行invokeVirtual代码时,促进在其新状态中执行虚拟目标方法。在步骤440A中,做出了在相同或其他调用方法中是否存在用于调用虚拟目标方法的其他任何可打补丁的调用的确定。如果还有可打补丁的调用,则为在调用方法或多个调用方法中的那些可打补丁的调用来执行步骤436A和438A。如果在步骤440A中做出了对虚拟目标方法进行的所有调用已经被修改的确定,则步骤442就继续其他处理。
如果在步骤432中做出了在新状态中虚拟目标方法未被任何其他方法所覆盖的确定,则在步骤433中做出对目标方法是否在新状态中被编译的确定。如果在步骤433中做出了目标方法在新状态中未被编译的确定,则如上所述执行继续进行步骤434A到440A。
如果在步骤433中做出了在新状态中虚拟目标方法被编译的确定,则意味着目标方法尚未被另一方法所覆盖以及刚刚将其编译状态改变为正被编译并存储到代码高速缓存中。因此,执行步骤434B来重复对所有调用方法(诸如在图4C的步骤422中所编译的调用方法)中的虚拟目标方法所进行的可打补丁的调用。对于调用方法中的每个可打补丁的调用,在图4D的步骤436B中,调用目标方法的指令都被定位于所述调用方法的可执行代码之中。指令被定位以后,在步骤438B中,将指令的参数设置为代码高速缓存中的目标方法的可执行代码的地址。其后,在步骤440B中做出在相同或其他调用方法中是否存在用于调用虚拟目标方法的任何其他可打补丁的调用的确定。如果还有可打补丁的调用,则为调用方法或多个调用方法中的那些可打补丁的调用来执行步骤436B和438B。如果在步骤440B中做出了对虚拟目标方法的所有可打补丁的调用已经被修改的确定,则步骤442就继续其他处理。
跟踪虚拟方法调用
在一个实施例中,实施用于本文所述的虚拟方法调用的快速的基于补丁的方法调用技术涉及:跟踪从多个被编译的调用方法到虚拟目标方法的直接引用。此外,实施该技术还涉及:跟踪由一种或多种其他方法对虚拟目标方法进行的覆盖。
在一个实施例中,可根据上述用于跟踪非虚拟方法调用的技术来跟踪从被编译的调用方法到目标方法的直接引用。例如,可记录虚拟目标方法和被编译的调用方法中的指令之间的关联,其中,关联表明调用方法的可执行代码中的指令的位置。当虚拟目标方法经历了状态变化(如,从未被覆盖和编译状态到被覆盖或者未被编译状态)时,所存储的关联可用来识别和定位在一个或多个调用方法的可执行代码中的一个或多个指令。在以此方式识别和定位一个或多个指令之后,就可通过改变指令的参数来反映目标方法的当前状态来给所述指令打补丁。类似于上述用于跟踪非虚拟方法调用的技术,在内存或其他快速存储器中的任何数据结构都可用来存储这样的关联。除了跟踪虚拟目标方法和被编译的调用方法中的指令之间的关联以外,当对调用方法进行反编译时,一些实施例还为去除目标方法和被编译的调用方法中的指令之间的关联作好了准备。
在一个实施例中,可以通过维护目标方法的方法块中的一组覆盖信息来实现跟踪由一种或多种其他方法对虚拟目标方法进行的覆盖。覆盖信息表明在特定的时间点,虚拟目标方法是否被覆盖。因此,根据本文所述的技术,可在任何特定时间点检查覆盖信息来确定目标方法是否被一种或多种其他方法所覆盖。覆盖信息初始可被设置成指示目标方法未被覆盖。其后,无论何时加载覆盖目标方法的方法,都相应地修改目标方法的数据结构中的覆盖信息以指示目标方法已经被覆盖。
在一些实施例中,目标方法中的覆盖信息可表示为覆盖标志。无论何时覆盖目标方法的方法被加载以用于执行,在所述目标方法中的覆盖标志就都被设置成指示目标方法被覆盖。因此,在这些实施例中,为了确定目标方法的覆盖状态,本文所述的技术为检查与目标方法相关联的覆盖标志作好了准备。
在一些实施例中,用于目标方法的覆盖信息可表示为初始被设成零的覆盖计数。无论何时覆盖目标方法的方法被加载以用于执行,与目标方法相关联的覆盖计数就会递增。无论何时覆盖目标方法的方法被卸载并且与该目标方法相关联的覆盖计数存储了正值,覆盖计数就会递减。以此方式,在任何特定时间点,覆盖计数都指示目标方法的当前覆盖状态。因此,在这些实施例中,为了确定目标方法的覆盖状态,本文所述的技术就为检查与目标方法相关联的覆盖计数作好了准备(例如,正的覆盖计数值表明目标方法被至少一种其他方法所覆盖,零值表明目标方法未被覆盖)。
硬件概述
在一个实施例中,操作系统102、JVM 104、解释器106和DAC108采取由一个或多个处理器执行的指令组的形式。图5是示出了可以在其上执行这些指令组的计算机系统500的框图。计算机系统500包括:总线502,用于促进信息交换;以及与总线502连接的一个或多个处理器504,用于处理信息。计算机系统500还包括连接到总线502的诸如随机存取存储器(RAM)或其他动态存储装置的主存储器506,其用于存储信息和将被处理器504执行的指令。主存储器506还可用于在处理器504执行指令期间存储临时变量或其他中间信息。计算机系统500还可包括连接到总线502的只读存储器(ROM)508或其他静态存储装置,用于存储用于处理器504的静态信息和指令。提供了诸如磁盘或光盘的存储装置510,其连接到总线502,用于存储信息和指令。
计算机系统500可经由总线502连接到用于将信息显示给计算机用户的显示器512。包括字母数字和其他键的输入装置514连接到总线502,用于将信息和命令选择传输到处理器504。另一种用户输入装置是诸如鼠标、跟踪球或光标方向键的光标控制器516,其用于将方向信息和命令选择传输到处理器504,并用于控制在显示器512上的光标移动。该输入装置通常具有在第一轴(例如x)和第二轴(例如y)这两个轴上的两个自由度,这就允许所述装置在一个平面内指定位置。
在计算机系统500中,总线502可以是使信息、信号、数据等能够在各种组件之间进行交换的任何机构和/或介质。例如,总线502可以是携带电信号的一组导线。总线502也可以是在一个或多个的组件之间传送无线信号的无线介质(例如空气)。总线502还可以是连接一个或多个组件的网络连接。使信息、信号、数据等能够在各种组件之间进行交换的任何机构和/或介质都可以用作总线502。
总线502还可以是这些机构/介质的组合。例如,处理器504可以和存储装置510进行无线通信。在这种情况下,从处理器504和存储装置510的立场来看,总线502将会是诸如空气的无线介质。此外,处理器504可以和ROM 508电容性地通信。此外,处理器504可以经由网络连接和主存储器506进行通信。在这种情况下,总线502将会是网络连接。此外,处理器504可以经由一组导线和显示器512进行通信。在这种情况下,总线502将会是这一组导线。因此,取决于各种组件如何互相通信,总线502就可以采取不同的形式。如图5中所显示的总线502在功能上表示能够使信息、信号、数据等在各种组件之间进行交换的所有机构和/或介质。
本发明涉及用于执行本文所述的用于快速的基于补丁的方法调用技术的计算机系统500的使用。根据本发明的一个实施例,响应于执行包含在主存储器506中的一个或多个指令的一个或多个序列的处理器504,由计算机系统500来执行这些技术。这种指令可以从诸如存储装置510的另一个机器可读的介质读入到主存储器506中。执行包含在主存储器506中的指令序列使得处理器504执行本文描述的处理步骤。在可选实施例中,可以用硬连线电路代替软件指令或将硬连线电路与软件指令相结合来实施本发明。因此,发明的实施例并不限于硬件电路和软件的任何具体组合。
本文使用的术语“机器可读介质”指的是参与提供使机器以特定方式运转的数据的任何介质。在使用计算机系统500来实施的一个实施例中,例如,各种机器可读的介质参与将指令提供给处理器504以用于执行。这种介质可以采用多种形式,包括但不限于非易失性介质、易失性介质和传输介质。非易失性介质包括例如,诸如存储装置510的光盘或磁盘。易失性介质包括诸如主存储器506的动态存储器。传输介质包括同轴线缆、铜线和光纤,包括构成总线502的导线。传输介质也可以采用声波或光波的形式,诸如在无线电波和红外数据通信中产生的那些波。
机器可读介质的通常形式包括:例如,软盘、软磁盘、硬盘、磁带或任何其他磁介质、CD-ROM、DVD或任何其他光存储介质、穿孔卡、纸带、任何其他具有孔状图案的物理介质、RAM、PROM、EPROM、FLASH-EPROM、任何其他存储芯片或盒式磁带、下文中描述的载波,或计算机能读取的任何其他介质。
各种形式的机器可读介质可参与将一个或多个指令的一个或多个序列传送到处理器504以用于执行。例如,指令可最初承载在远程计算机的磁盘上。远程计算机能够将指令装载进其动态存储器并使用调制解调器通过电话线发送这些指令。计算机系统500的本地调制解调器能够接收电话线上的数据并使用红外发射器将数据转换为红外信号。红外探测器能够接收红外信号中携带的数据并且适当的电路能够将数据放到总线502上。总线502将数据传送到主存储器506,处理器504从主存储器506中提取数据并执行指令。可以在处理器504执行之前或之后,可选地将由主存储器506所接收的指令存储在存储装置510上。
计算机系统500还包括连接到总线502的通信接口518。连接到与本地网522相连的网络链路520的通信接口518提供双路数据通信。例如,通信接口518可以是综合服务数字网络(ISDN)卡或调制解调器,用于提供到相应类型的电话线的数据通信连接。作为另一个实例,通信接口518可以是局域网(LAN)卡,用于提供到兼容的LAN的数据通信连接。也可以实施无线链路。在任何这样的实施中,通信接口518都发送和接收带有表示各种类型信息的数字数据流的电信号、电磁信号或光信号。
网络链路520通常通过一个或多个网络向其他数据装置提供数据通信。例如,网络链路520可以通过本地网522提供到主机524或到由互联网服务提供商(ISP)526所操作的数据设备的连接。ISP
526又通过现在通常称作“互联网”528的全球分组数据通信网络提供数据通信服务。本地网络522和互联网528都使用携带数字数据流的电信号、电磁信号或光信号。通过各种网络的信号、网络链路520上的并通过通信接口518(将数字数据传送到计算机系统500和从计算机系统500传送数字数据)的信号是传输信息的载波的示例性形式。
计算机系统500能够通过网络、网络链路520和通信接口518发送消息和接收数据(包括程序代码)。在互联网实例中,服务器530可通过互联网528、ISP 526、本地网522和通信接口518传输用于应用程序的请求的代码。
当接收到代码时,所接收的代码就可以由处理器504执行并且/或者存储到存储装置510中或其他非易失性存储器中以用于以后执行。以此方式,计算机系统500可以获得载波形式的应用程序代码。
在这点上,应该注意到,尽管已经参照具体实施例描述了本发明,但是不应认为本发明受到这样的限制。在不脱离本发明精神的情况下,得益于本公开的本领域普通技术人员可以对本发明进行各种修改。因此,本发明不应被用于说明本发明的具体实施例所限制,而仅由发布的权利要求及其等同物的范围所限制。

Claims (16)

1.一种机器执行的基于补丁的方法调用的方法,包括:
将多个调用方法的代码存储到存储器中,其中,所述多个调用方法中每一个的代码包括一指令,该指令基于由所述指令所指定的参数直接将执行转移到目标方法;
在所述目标方法的状态变化之前,记录所述目标方法与所述多个调用方法中每一个的直接将执行转移到所述目标方法的所述指令之间的关联;
响应于所述目标方法的从当前状态到新状态的状态变化,使用所述关联以将所述多个调用方法中每一个的指令识别为将响应于所述状态变化而被打补丁的特定指令;
对所述多个调用方法中每一个的参数打补丁以表明有助于从所述多个调用方法中的每一个调用方法直接转移到新状态中的所述目标方法的更新的地址;以及
基于参数值执行所述多个调用方法中至少一个的指令。
2.根据权利要求1所述的机器执行的基于补丁的方法调用的方法,其中,所述当前状态是未编译状态而所述新状态是所述目标方法在其中已被编译成可执行代码的编译状态,并且其中,所述参数值包括对所述目标方法的所述可执行代码的引用。
3.根据权利要求1所述的机器执行的基于补丁的方法调用的方法,其中,所述当前状态是所述目标方法在其中已被编译成可执行代码的编译状态而所述新状态是未编译状态,并且其中,所述参数值包括对使所述目标方法的未编译版本被解释地执行的一组代码的引用。
4.根据权利要求1所述的机器执行的基于补丁的方法调用的方法,进一步包括:
确定所述多个调用方法中每一个是否已被反编译并且已被从所述存储器中去除;以及
响应于确定所述多个调用方法中每一个已被反编译,去除所述目标方法与所述指令之间的所述关联。
5.根据权利要求1所述的机器执行的基于补丁的方法调用的方法,进一步包括:
在将所述多个调用方法的所述代码存储到所述存储器中之前:
编译所述多个调用方法中每一个以得到所述多个调用方法中每一个的所述代码;
确定所述目标方法的当前状态是否是所述目标方法已在其中被编译成可执行代码的编译状态;以及
响应于确定所述目标方法的当前状态是所述编译状态,设置所述多个调用方法中每一个所述参数以包括对所述目标方法的可执行代码的引用。
6.根据权利要求1所述的机器执行的基于补丁的方法调用的方法,进一步包括:
在将所述多个调用方法的代码存储到所述存储器中之前:
编译所述多个调用方法中每一个以得到所述多个调用方法中每一个的代码;
确定所述目标方法的当前状态是否是未编译状态;以及
响应于确定所述目标方法的当前状态是所述未编译状态,设置所述多个调用方法中每一个的参数以包括对使得所述目标方法的未编译版本被解释地执行的一组代码的引用。
7.根据权利要求1所述的机器执行的基于补丁的方法调用的方法,其中:
所述目标方法是虚拟方法,其中,所述虚拟方法是在基类中的方法,其允许被在该基类的子类中执行的子类方法所覆盖;
所述当前状态是其中所述目标方法位于原始地址的第一状态并且所述新状态是其中所述目标方法位于所述更新的地址的第二状态;以及
所述参数值包括对用于调用虚拟方法的一组代码的引用。
8.根据权利要求7所述的机器执行的基于补丁的方法调用的方法,进一步包括:
当所述目标方法位于所述更新的地址时,记录第一信息;以及
检查所述第一信息以确定所述目标方法是否已经历了所述状态变化。
9.根据权利要求8所述的机器执行的基于补丁的方法调用的方法,其中:
所述第一信息是存储在与所述目标方法相关的方法块中的覆盖标志;以及
记录所述第一信息包括:当所述原始地址被所述更新的地址所更新时设置所述覆盖标志。
10.根据权利要求8所述的机器执行的基于补丁的方法调用的方法,其中:
所述第一信息是存储在与所述目标方法相关的方法块中的覆盖计数;以及
记录所述第一信息包括:当所述原始地址被所述更新的地址所更新时就递增所述覆盖计数。
11.根据权利要求1所述的机器执行的基于补丁的方法调用的方法,其中:
所述目标方法是虚拟方法,其中,所述虚拟方法是在基类中的方法,其允许被在该基类的子类中执行的子类方法所覆盖;以及
权利要求1所述的机器执行的基于补丁的方法调用的方法进一步包括:在将所述多个调用方法的代码存储到所述存储器中之前,执行以下步骤:
编译所述多个调用方法中每一个以得到所述多个调用方法中每一个的代码;
确定所述目标方法的当前状态是否是其中所述目标方法位于原始地址的第一状态;以及
响应于确定所述目标方法的当前状态是所述第一状态:
如果在所述第一状态中所述目标方法已被编译成可执行代码,则设置所述多个调用方法中每一个的所述参数以包括对所述目标方法的可执行代码的第一引用;以及
如果在所述第一状态中所述目标方法未被编译成可执行代码,则设置所述参数以包括对用于调用虚拟方法的一组代码的第二引用。
12.根据权利要求1所述的机器执行的基于补丁的方法调用的方法,其中:
所述目标方法是虚拟方法,其中,所述虚拟方法是在基类中的方法,其允许被在该基类的子类中执行的子类方法所覆盖;以及
权利要求1所述的机器执行的基于补丁的方法调用的方法进一步包括:在将所述多个调用方法的代码存储到存储器中之前,执行以下步骤:
编译所述多个调用方法中每一个以得到所述多个调用方法中每一个的代码;
确定所述目标方法的当前状态是否是其中所述目标方法位于所述更新的地址的第一状态;以及
响应于确定所述目标方法的当前状态是所述第一状态,则设置所述多个调用方法中每一个的参数以包括对一组代码的第一引用,所述一组代码确定在执行所述指令时将直接转移到原始地址和所述更新的地址之中的哪一个。
13.根据权利要求12所述的机器执行的基于补丁的方法调用的方法,其中,所述一组代码是插入所述多个调用方法的代码之中的嵌入代码。
14.根据权利要求1所述的机器执行的基于补丁的方法调用的方法,其中,所述指令是转移-链接处理器指令。
15.根据权利要求1所述的机器执行的基于补丁的方法调用的方法,其中:
在虚拟机中执行所述机器执行的基于补丁的方法调用的方法,所述虚拟机包括用于将对象方法从字节码编译成可执行代码的动态自适应编译器;以及
所述存储器是分配给所述虚拟机的内存中的区域,其中,内存中的所述区域被配置为用于存储由所述动态自适应编译器编译的所述对象方法。
16.根据权利要求15所述的机器执行的基于补丁的方法调用的方法,其中,所述虚拟机是JAV虚拟机。
CN2007100799461A 2006-02-28 2007-02-27 快速的基于补丁的方法调用 Active CN101030149B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US11/365,146 US8099724B2 (en) 2006-02-28 2006-02-28 Fast patch-based method calls
US11/365,146 2006-02-28

Publications (2)

Publication Number Publication Date
CN101030149A CN101030149A (zh) 2007-09-05
CN101030149B true CN101030149B (zh) 2012-10-17

Family

ID=38050212

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2007100799461A Active CN101030149B (zh) 2006-02-28 2007-02-27 快速的基于补丁的方法调用

Country Status (6)

Country Link
US (1) US8099724B2 (zh)
EP (1) EP1826668B1 (zh)
JP (2) JP2007234022A (zh)
CN (1) CN101030149B (zh)
AT (1) ATE423346T1 (zh)
DE (1) DE602007000544D1 (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8458670B2 (en) * 2007-09-27 2013-06-04 Symantec Corporation Automatically adding bytecode to a software application to determine network communication information
US8762952B2 (en) * 2010-12-14 2014-06-24 Bmc Software, Inc. Recording method calls that led to an unforeseen problem
WO2013101121A1 (en) * 2011-12-29 2013-07-04 Intel Corporation Managed instruction cache prefetching
JP5976930B2 (ja) * 2012-08-08 2016-08-24 インテル コーポレイション バーチャルファンクションを無効にするコールのためのサポートを含むisaブリッジング
CN105335200B (zh) * 2015-11-24 2019-05-07 小米科技有限责任公司 系统升级方法及装置
US10474446B2 (en) * 2016-09-16 2019-11-12 Bank Of America Corporation Installation tool for adhering to enterprise requirements
CN109710396B (zh) 2017-10-26 2023-08-22 华为技术有限公司 一种信息采集及内存释放的方法及装置

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6151703A (en) * 1996-05-20 2000-11-21 Inprise Corporation Development system with methods for just-in-time compilation of programs

Family Cites Families (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4970639A (en) * 1988-05-20 1990-11-13 International Business Machines Corporation Virtual machine architecture independent program loader
KR100529416B1 (ko) * 1996-01-24 2006-01-27 선 마이크로시스템즈 인코퍼레이티드 스택기반컴퓨터를위한명령폴딩방법및장치
US6321323B1 (en) * 1997-06-27 2001-11-20 Sun Microsystems, Inc. System and method for executing platform-independent code on a co-processor
US6170083B1 (en) * 1997-11-12 2001-01-02 Intel Corporation Method for performing dynamic optimization of computer code
US6233678B1 (en) * 1998-11-05 2001-05-15 Hewlett-Packard Company Method and apparatus for profiling of non-instrumented programs and dynamic processing of profile data
GB9825102D0 (en) * 1998-11-16 1999-01-13 Insignia Solutions Plc Computer system
US6233725B1 (en) * 1998-12-03 2001-05-15 International Business Machines Corporation Method and apparatus to coordinate and control the simultaneous use of multiple just in time compilers with a java virtual machine
US6295642B1 (en) * 1999-04-29 2001-09-25 International Business Machines Corporation Method and apparatus for partial just in time compiling in a data processing system
US6429860B1 (en) * 1999-06-15 2002-08-06 Visicomp, Inc. Method and system for run-time visualization of the function and operation of a computer program
JP2001154855A (ja) * 1999-09-13 2001-06-08 Matsushita Electric Ind Co Ltd プログラム変換装置
US6721875B1 (en) * 2000-02-22 2004-04-13 Hewlett-Packard Development Company, L.P. Method and apparatus for implementing a single-syllable IP-relative branch instruction and a long IP-relative branch instruction in a processor which fetches instructions in bundle form
US6779188B1 (en) * 2000-09-28 2004-08-17 International Business Machines Corporation Apparatus and method for improved devirtualization of method calls
US7032230B2 (en) * 2001-08-27 2006-04-18 International Business Machines Corporation Efficient virtual function calls for compiled/interpreted environments
US6934943B2 (en) * 2001-10-18 2005-08-23 Hewlett-Packard Development Company Optimization of control transfers to dynamically loaded modules
US6915513B2 (en) * 2001-11-29 2005-07-05 Hewlett-Packard Development Company, L.P. System and method for dynamically replacing code
US6928536B2 (en) * 2001-11-29 2005-08-09 Hewlett-Packard Development Company, L.P. Dynamic execution layer interface for replacing instructions requiring unavailable hardware functionality with patch code and caching

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6151703A (en) * 1996-05-20 2000-11-21 Inprise Corporation Development system with methods for just-in-time compilation of programs

Also Published As

Publication number Publication date
EP1826668A1 (en) 2007-08-29
JP2007234022A (ja) 2007-09-13
CN101030149A (zh) 2007-09-05
EP1826668B1 (en) 2009-02-18
US20070234311A1 (en) 2007-10-04
ATE423346T1 (de) 2009-03-15
JP2014002790A (ja) 2014-01-09
US8099724B2 (en) 2012-01-17
DE602007000544D1 (de) 2009-04-02
JP5845221B2 (ja) 2016-01-20

Similar Documents

Publication Publication Date Title
CN101030149B (zh) 快速的基于补丁的方法调用
CN100478888C (zh) 用于安装和更新解释编程语言应用的方法和系统
US5559884A (en) Method and system for generating and auditing a signature for a computer program
CN107391104B (zh) 一种客户端与react native代码的更新依赖管理方法、装置及系统
CN107273176B (zh) 一种适配硬件架构的编译方法及装置
US9092293B2 (en) Method and system for selecting a program for download
CN101681294B (zh) 用于存储器事务分组的方法和系统
KR101854975B1 (ko) 패키지 파일에 대한 기능 확장 방법 및 시스템
US7822723B2 (en) Method, system, program and data structure for controlling access to sensitive functions
EP0855056B1 (en) Object-oriented method maintenance mechanism that does not require cessation of the computer system
CN1609746A (zh) 用于提供基于时间和权的灵活容许硬件id的系统和方法
CN100514294C (zh) 避免数据处理设备中的数据不一致性的方法和装置
CN105117621A (zh) 代码混淆的控制流平展化
EP1722313A2 (en) Method for creating unique identification for copies of executable code and management thereof
CN1460208A (zh) 使用主叫用户地址的安全软件smi调度
CN115469894A (zh) 一种应用程序的安装控制方法、装置、设备及存储介质
US10747514B2 (en) Reduced save and restore instructions for call-clobbered registers
CN109190367A (zh) 利用沙箱运行应用程序安装包的方法及装置
CN106843857A (zh) 基于srp实现代码库转换sdk的方法和装置
EP1734459A2 (en) Method for creating unique identification for copies of executable code and management thereof
CN106778270B (zh) 一种恶意应用程序的检测方法及系统
US8589303B2 (en) Asset management apparatus and asset management method
JP5670269B2 (ja) プログラムの流用検出方法
KR101845155B1 (ko) 어플리케이션 패키지를 제공하는 방법 및 시스템, 그리고 어플리케이션을 실행하는 방법 및 시스템
US10671397B2 (en) Reduced save and restore instructions for call-clobbered registers

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