CN102081546A - 通过分隔额外信息来内存优化虚拟机代码的方法和*** - Google Patents
通过分隔额外信息来内存优化虚拟机代码的方法和*** Download PDFInfo
- Publication number
- CN102081546A CN102081546A CN2010105432287A CN201010543228A CN102081546A CN 102081546 A CN102081546 A CN 102081546A CN 2010105432287 A CN2010105432287 A CN 2010105432287A CN 201010543228 A CN201010543228 A CN 201010543228A CN 102081546 A CN102081546 A CN 102081546A
- Authority
- CN
- China
- Prior art keywords
- code
- information
- extraneous information
- virtual machine
- extraneous
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4434—Reducing the memory space required by the program code
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及一种通过从可执行的虚拟机代码或解释代码中划分出额外信息来优化内存的方法、计算机程序产品和***。该额外信息可以单独保存,或者可以在需要时从初始代码中访问,以便调试或服务于字段中的代码。在保持用于调试以及为字段中的代码提供服务所必需的处理的额外信息的可访问性的同时,通过减少内存足迹,该方法优化了内存使用率。
Description
技术领域
本发明主要涉及虚拟机代码,尤其涉及通过从可执行代码中划分额外信息来内存优化虚拟机代码。
背景技术
虚拟机技术的优点已得到广泛认可。在这些优点中,有一个优点是其能在单个主机平台上运行多个虚拟机,这样做可以更好地使用硬件能力,同时确保每个用户都享有“完整的”计算机特征。随着计算机软件复杂度的增加以及在日常生活和商业活动中对于软件***的依赖度的增长,用户期望具有很高的软件运行性能。由于虚拟机软件通常是在内存受限的***例如在PDA和智能电话这类内存往往少于传统计算机***的无线设备上运行的,因此这种虚拟机软件的性能尤其重要。由此,人们努力减少虚拟机代码在运行时使用的内存,例如将本地函数调用减至最少、限制本地代码中提供的功能的类型、减小应用的大小、以及要求有效的编码。对于优化软件性能而言,减小内存使用率仍旧是一个关键目标。
发明内容
因此,本发明的实施例包括一种用于优化虚拟机或解释代码的方法、计算机程序产品和***,包括:接收包含多个程序指令以及第一额外信息的代码,其中该代码用供虚拟机运行的语言编写,并且其中第一额外信息是第一类型的不可执行信息;通过移除第一额外信息以及将其替换成引用第一额外信息的位置的键值(key)来修改该代码;以及执行经过修改的代码,并且如果在运行过程中发生请求第一额外信息的事件,则响应于所述事件使用该键值来定位处于所述位置的额外信息,并且从所述位置加载第一额外信息。
特别地,在通过结合附图来考虑下文中的详细描述时,可以清楚了解本发明实施例的上述及其他特征和优点,其中不同附图中的相同附图标记被用于表示相同的组件。
附图说明
图1是示出了根据本发明实施例的包含虚拟机的例示计算机***的框图。
图2是示出了根据本发明第一实施例的例示的划分及内存优化处理的框图。
图3是示出了根据本发明第一实施例的图2划分处理作用于例示Java类文件的效果的框图。
图4A和4B是示出了根据本发明第一实施例的划分及内存优化处理的流程图。
图5是示出了根据本发明第二实施例的例示划分及内存优化处理的框图。
图6是示出了根据本发明第二实施例的图5划分处理作用于例示Java类文件的效果的框图。
图7A和7B是描述根据本发明第二实施例的划分及内存优化处理的流程图。
具体实施方式
现在参考附图,图1示出的是一个根据本发明实施例的例示计算机***。图1显示的计算机***10包括处理器12、内存14、网络适配器16以及Java虚拟机20,所有这些组件全都通过***总线18可通信地耦接在一起。内存14可以用任何常规或其他的存储器或存储设备(例如RAM、缓存、闪存等等)来实现,并且可以包括任何适当的存储容量。网络适配器16可以被实现为使得计算机***10能够借助任何数量的任何适当通信介质(例如WAN、LAN、因特网、内部网、有线网络、无线网络等等)通过共享内存或是采用其他任何适当的方式来与一个或多个其他***通信。本实施例的计算机***可以包括借助于任何常规或其他协议而在网络或其他通信信道上通信、并且可以使用任何类型的连接(例如有线、无线等等)来进行访问的任何常规或其他通信设备。
Java虚拟机20包含各种组件,例如类加载器21、异常处理机(exception handler)模块22、差错报告模块23、包含解释器25和即时(JIT)编译器26的运行引擎24、类库27以及内存28。应该理解的是,虽然这里论述的虚拟机20是Java虚拟机,但是本发明并不局限于Java技术,而是可以结合其他技术和虚拟机来实施,例如CPython虚拟机、.NET以及公用语言运行时、Parrot虚拟机、Rubinius虚拟机或是其他任何适当的虚拟机。
类加载器21加载代码,例如Java类(.class)或Java归档(.jar)文件之类的字节码文件,或是CIL字节码文件。该代码包含了从任何适合与虚拟机一起使用的语言中编译的程序指令,举例来说,适合与CPython虚拟机结合使用的语言包括Python,适合与Java虚拟机(JVM)结合使用的语言包括Java、Clojure、Fan、Groovy、IBMNetRexx、JavaFX Script、JavaScript、JRuby、Jython、JSchemeMacromedia ColdFusion、Rhino、Scala等等,适合与.NET公用语言运行时(CLR)一起使用的语言包括C#、C++/CLI、Cobra、F#、Fan、IronPython、IronRuby、J#、JScript.NET、受管JScript、Mondrian、Nemerle、VB.NET等等,适合与Parrot虚拟机一起使用的语言包括Perl 6,以及适合与Rubinius虚拟机一起使用的语言包括Ruby。该语言可以是解释语言或编译语言,举例来说,与JVM一起使用的语言可以是JavaScript或Groovy,其中JavaScript通常是解释性的,而Groovy则通常是编译性的。
计算机***10既可以采用处理***的形式来实现,也可以采用软件的形式来实现。计算机***10可以由任何数量的常规或其他计算机***或设备(例如计算机终端、个人计算机(如IBM兼容机、AppleMacIntosh、平板电脑、膝上型计算机等等)等等)、蜂窝电话、个人数字助理(例如Palm Pre、Treo、iPhone等等)等等来实现,并且可以包括任何商用操作***(例如AIX、Linux、OSX、Sun Solaris、Unix、Windows等等)以及任何商用或定制软件(例如浏览器软件、通信软件、字处理软件等等)。这些***可以包括多种类型的显示和输入设备(例如键盘、鼠标、语音识别等等),以便输入和/或查看信息。如果是在软件中实现的(例如作为虚拟映像),那么计算机***10既可以在可记录介质(例如磁性、光学、软盘、DVD、CD等等)上得到,也可以采用从信源经由通信介质(例如公告板、网络、LAN、WAN、内部网、因特网等等)下载的载波或信号的形式。
图2-4描述的是本发明第一实施例的不同方面。在本实施例中,代码是通过从可执行代码中分离出额外信息以及通过单独存储额外信息而被划分的,由此可执行代码可以正常加载,而额外信息则可以只在需要的时候延迟加载。在保持用于调试以及为字段中的代码提供服务所必需的其他处理的额外信息的可访问性的同时,通过减少内存足迹,该方案优化了内存使用率。
图2示出的是根据本发明第一实施例可由图1***实施的例示划分和内存优化处理。在本处理中,诸如Java类文件或CIL代码文件之类的代码30由后编译模块40接收,并且在后编译模块40,代码30中的额外信息被识别。该额外信息是不可执行信息,例如调试信息221、注释信息222或源信息223。通过移除额外信息产生经过修改的代码35,以及将额外信息保存在某个数据存储位置,例如数据库60、共享类缓存、嵌套内部类、或是独立的二进制对象,可以修改代码30。在经过修改的代码35中***用于标识所述存储位置的唯一标识键值。
在运行时,经过修改的代码35被正常加载到虚拟机20中。如果在运行时需要该额外信息,则***可以定位并仅加载特定任务所需要的恰当类型的额外信息。举个例子,如果发生故障,那么异常处理进程22和差错报告机制23会请求调试信息221,以便抛出异常并报告差错,但其不需要注释信息222和源信息223。同样,如果代码使用了反射,那么反射进程可以请求源信息223,但是不会请求调试信息221。在图示的示例中,差错报告机制23是Java堆栈跟踪报告方法,该方法请求四个信息来产生堆栈跟踪70:类、方法、文件和行号。通常,该信息是由虚拟机在构造异常的时候填入的,但在这些实施例中,文件和行号会作为调试信息221的一部分而被移除,而所述调试信息则是保存在数据库60中的。相应地,异常处理进程22和差错报告机制23使用键值来找出保存了调试信息221的存储位置60,然后则通过加载调试信息221来填充堆栈追踪70。
现在参考图3,该图显示了一个例示的Java类文件30,其中所述Java类文件30具有10个主要分量:幻数(magic number)201、版本202、常量池203、访问标记204、本类205、超类206、接口207、字段208、方法209以及属性210。属性可以包括调试信息221、注释信息222以及源信息223。例示的Java类文件30是通过从程序指令中划分出额外信息以及将额外信息保存在存储位置60而被修改的,在本范例中,所述额外信息是调试信息221、注释信息222以及源信息223。在经过修改的Java类文件35中,额外信息被键值224所取代,其中该键值标识的是存储该额外信息的存储位置。
在Jvava技术的上下文中,调试信息221可以包括如下属性:
SourceFile:(依照类)没有路径的源文件名,例如ClassName.java;
SourceDebugExtension:通常是未使用的;
LineNumberTable:(依照方法)供调试器单步调试以及供异常堆栈跟踪以打印行号的行号(将字节码索引映射成源文件中的行号);
LocalVariableTable:(依照方法)在单步调试时用于调试器的本地变量的名称;以及
LocalVariableTypeTable:(依照方法)对于一般类型(并且仅仅对于一般类型)来说,源文件中的本地变量的类型不同于VM中的类型。例如,当源文件类型可以是一般散列表<整数,字串>时,虚拟机将会看到散列表。
对于代码中的程序指令的正常运行来说,该信息并不是必需的,这是因为它仅仅用于调试和堆栈跟踪,并且在运行程序的过程中是不起作用的。
在Java技术的上下文中,注释信息222可以包括如下属性:
AnnotationDefault;
RuntimeVisibleAnnotations;
RuntimeInvisibleAnnotations;
RuntimeVisibleParameterAnnotations;以及
RuntimeInvisibleParameterAnnotations。
此外,在Java技术的上下文中,源信息223可以包括如下属性:
EnclosingMethod:标识本地类的围绕方法;
Signature:标识用于类的一般签名、字段类型以及方法签名;
Deprecated:标识弃用的项目;
Synthetic:标识编译器产生的项目;以及
InnerClasses:标识内部和外部类关系(包括嵌套和匿名)
对于代码中的程序指令的正常运行来说,该信息并不是必需的,这是因为运行虚拟机是不需要该信息的。该信息通常只用于反射。相应地,虽然移除该信息有可能会影响到大量使用反射的方法,但是一般来说,大多数的程序不会受到这种移除处理的影响。
现在转到图4A和4B,该图概括性地显示了第一实施例的用于划分和内存优化处理的处理300和400。处理300可以在运行时之外的时间执行(例如在加载类的时候),而处理400则通常是在运行时执行的。以图1的***为例,在处理300中,该***在步骤310中接收代码,例如经过后处理器解析的代码,并且在步骤320标识所述代码中的额外信息。在步骤330,***从代码中移除额外信息,并且在步骤340中将移除的额外信息存入一个数据存储位置。在步骤350,***在代码中***一个键值,以便引用所述额外信息的位置。在一个***、例如IBM J9***中,该处理可以由某种工具来执行,例如Java优化器(JAPT)类操作工具。
在可选步骤360,***改写代码,以使其间接而不是直接地访问额外信息,例如,通过修改多个程序指令中的一个或多个,可以拦截异常处理进程,并且可以使用键值将其重定向到存储位置。该步骤是可选的,这是因为所述进程也可以采用其他方式来执行,例如修改类库来变更本地函数的操作,以便透明地加载所存储的额外信息,例如Throwable.getStackTrace()、Class.getDeclaredAnnotations()以及Class.getGenericInterfaces()。举个例子,对于堆栈跟踪来说,通过修改类库,可以在StackTraceElement中存储程序计数器。该程序计数器是标引发生了StackTraceElement所代表的方法调用的字节码指令的索引,并且其被用于找到行号调试信息结构中的行号。在可选步骤370中,经过修改的代码可以保存在缓冲存储器中,例如共享类缓存,由此以后可以从共享类缓存中加载类,以便减少任何加载时间损失。
如图4B所示,在运行时,***在步骤410中加载经过修改的代码,然后在步骤420中确定是否发生了需要额外信息的事件,例如故障或反射处理。如果没有的话,该处理400结束。如果有的话,那么在步骤430,***使用键值来定位存储位置中的期望额外信息,并且在步骤440中加载该信息。然后,内存优化处理结束,并且***可以使用取回的额外信息来执行任何期望的操作。所定位和加载的额外信息可以是一种或多种额外信息,例如先前描述的调试信息、注释信息以及源信息。***可以只加载特定目的所需要的额外信息,举例来说,如果***正在创建堆栈跟踪,那么它可以定位并只加载填充堆栈跟踪所需要的调试信息,或者如果***使用了反射,那么它可以定位并只加载执行反射所需要的源信息。
图5-7描述的是本发明第二实施例的不同方面。在该实施例中,代码是通过从可执行代码中分离出额外信息以及丢弃额外信息而被划分的。如果需要的话,可以从初始代码加载额外信息。在保持用于调试以及为字段中的代码提供服务所必需的其他处理的额外信息的可访问性的同时,通过减少内存足迹,该方案优化了内存使用率。
图5示出的是根据本发明第二实施例可以由图1***执行的例示划分和内存优化处理。在该处理中,诸如Java类文件或CIL代码文件之类的代码30由虚拟机20中的定制类加载器21接收,在虚拟机20中,所述代码30中的额外信息被标识。该额外信息是不可执行的信息,例如调试信息、注释信息或源信息。代码30是通过移除额外信息来产生经过修改的代码35而被修改的,并且在经过修改的代码35中***用于标识初始代码30的位置的唯一标识键值。
在运行时,经过修改的代码35被正常加载到虚拟机20中。如果在运行时需要额外信息,则***可以定位并且仅加载特定任务所需要的恰当类型的额外信息。举例来说,如果发生故障,那么异常处理进程22和差错报告机制23会请求调试信息,以便抛出异常并报告差错,但其不需要注释信息和源信息。异常处理进程22和差错报告机制23使用键值来找出存储初始代码30的存储位置,并且从文件中加载调试信息,由此可以填充堆栈跟踪。同样,如果代码使用了反射,那么反射进程可以请求源信息,但是不会请求调试信息。如果初始代码是从服务器产生或下载的,而不是在本地存在的,那么可以再次产生或下载所述初始代码。
现在参考图6,该图显示的是具有10个基本分量的例示Java类文件30:幻数201、版本202、常量池203、访问标记204、本类205、超类206、接口207、字段208、方法209以及属性210。属性可以包括调试信息221、注释信息222以及源信息223。例示的Java类文件30是通过从程序指令中划分出额外信息以及将其丢弃在回收站80或是所收集的无用信息中而被修改的,在本范例中,所述额外信息是调试信息221、注释信息222以及源信息223。在经过修改的Java类文件35中,额外信息被键值224取代,该键值标识的是存储原始代码30或者可从例如通过下载其取回原始代码30的位置。
现在转到图7A和7B,该图概括性显示了第二实施例的划分和内存优化处理的处理500和600。处理500可以在运行时之外的时间执行,或者可以由***在运行时(例如在加载类的时候)执行。处理600通常是在运行时执行的。以图1的***为例,在处理500中,该***在步骤510加载初始代码,例如类加载器加载的代码,并且在步骤520中标识代码中的额外信息。在步骤530,***从代码中移除额外信息,并且在步骤540中将一个键值***所述代码,以便引用存储了包含额外信息的初始代码或者可供取回所述代码的位置。在例如IBM J9***的***中,该处理可以由某种工具来执行,例如Java优化器(JAPT)类操作工具,或者在运行时,它可以由运行时J9***作为扩展加载处理的一部分来执行。在由运行时***执行时,经过修改的代码代表的是保存在虚拟机内部并且可选地保存在缓存内部的代码。
在可选步骤550,***改写所述代码,以使其间接而不是直接地访问额外信息,举例来说,通过修改多个程序指令中的一个或多个,可以拦截异常处理进程,并且可以使用键值将其重定向到存储的代码。该步骤是可选的,这是因为所述进程也可以采用其他方式来执行,例如修改类库来变更本地函数的操作,以便透明地从所存储的代码加载额外信息,例如Throwable.getStackTrace()、Class.getDeclaredAnnotations()以及Class.getGenericInterfaces()。举个例子,对于堆栈跟踪来说,通过修改类库,可以在StackTraceElement中存储程序计数器。该程序计数器是标引发生了StackTraceElement所代表的方法调用的字节码指令的索引,并且其被用于找到行号调试信息结构中的行号。在可选步骤560中,经过修改的代码可以被存入缓冲存储器,例如共享类缓存,由此以后可以从共享类缓存中加载所述类,以便减小加载时间损失。
如图7B所示,在运行时,***在步骤610中加载经过修改的代码,然后在步骤620中确定是否发生了需要额外信息的事件,例如故障或反射处理。如果没有的话,该处理600结束。如果有的话,那么在步骤630,***使用键值来定位存储初始代码或从其可以取回初始代码的位置中的期望额外信息,并且在步骤640中加载该信息。然后,内存优化处理结束,并且***可以使用取回的额外信息来执行任何期望的操作。所定位和加载的额外信息可以是一种或多种额外信息,例如先前描述的调试信息、注释信息以及源信息。***可以只加载特定目的所需要的额外信息,举例来说,如果***正在创建堆栈跟踪,那么它可以定位并只加载填充堆栈跟踪所需要的调试信息,或者如果***使用了反射,那么它可以定位并只加载执行反射所需要的源信息。
本领域技术人员应该理解,本发明的这些方面可以作为***、方法或计算机程序产品来实现。相应地,本发明的这些方面可以采用全硬件实施例的形式、全软件实施例的形式(包括固件、驻留软件、微代码等等)或是组合了软件和硬件方面的实施例来实现,所有这些在这里可以统称为“电路”、“模块”或“***”。此外,本发明的这些方面可以采用在包含了计算机可读程序代码的一个或多个计算机可读介质上实现的计算机程序产品的形式。
可以使用一种或多种计算机可读介质的任何组合。计算机可读介质可以是计算机可读信号介质或计算机可读存储介质。举例来说,计算机可读介质可以是电子、磁性、光学、电磁、红外或半导体***、装置或设备,亦或是前述各项的任何组合,但其并不局限于此。计算机可读存储介质的更具体的示例(非穷举列表)包括下列各项:具有一条或多条线路的电连接,便携式计算机碟片,硬盘,随机存取存储器(RAM),只读存储器(ROM),可擦写可编程只读存储器(EPROM或闪存),光纤,便携式紧凑型只读存储器(CD-ROM),光学存储设备,磁性存储设备,或是前述各项的任何适当组合。在本文档的语境中,计算机可读存储介质可以是任何包含或存储了可供指令执行***、装置或设备使用或与之结合使用的程序的有形介质。
计算机可读信号介质可以包括那些包含了计算机可读程序代码的传播数据信号,其中举例来说,所述信号可以处于基带或者作为载波的一部分。这种传播信号可以采用多种形式中的任何一种,包括但不局限于电磁信号、光信号或是其任何适当的组合。计算机可读信号介质可以是并非计算机可读存储介质但却可以传递、传播或传送供指令执行***、装置或设备使用或与之结合的程序的任何计算机可读介质。包含在计算机可读介质上的程序代码可以使用任何恰当的介质来传送,包括但不局限于无线、有线、光缆、RF等等,或是前述各项的任何组合。
用于执行本发明的各个方面的操作的计算机程序代码可以用一种或多种编程语言的任何组合来编写,包括:面向对象的编程语言,例如Java、Smalltalk、C++等等,以及常规编程语言,例如“C”编程语言或类似的编程语言。程序代码既可以完全在用户计算机上运行,也可以部分在用户计算机上运行,还可以作为独立软件包而部分在用户计算机以及部分在远程计算机上运行,或者完全在远程计算机或服务器上运行。在后一种情况中,远程计算机可以通过包括局域网(LAN)或广域网(WAN)在内的任何类型的网络与用户计算机相连,或者可以(例如通过使用因特网服务供应商的因特网)与外部计算机相连。
应该理解,用于本发明实施例的计算机***的软件可以用任何期望的计算机语言实施,并且可以由计算机领域的普通技术人员根据说明书中包含的功能性描述以及附图中示出的流程图来开发。作为示例,该软件可以用C#、C++、Python、Java或PHP编程语言来实现。更进一步,这里关于执行各种功能的软件的任何引用主要是指在软件控制下执行这些功能的计算机***或处理器。
作为替换,本发明实施例的计算机***可以用任何类型的硬件和/或其他处理电路来实现。计算机***的不同功能可以采用任何方式分布在任何数量的软件模块或单元、处理或计算机***和/或电路中,其中计算机或处理***既可以采用处于彼此本地的方式部署,或者采用彼此远离的方式部署,并且是可以借助任何适当的通信介质通信(例如LAN、WAN、内部网、因特网、硬件、调制解调器连接、无线等等)的。
本发明的这些方面是参考根据本发明实施例的流程图例证和/或方法、装置(***)以及计算机程序产品的框图来描述的。应该理解流程图例证和/或框图中的每一个方框以及流程图例证和/或框图中的方框的任何组合都可以由计算机程序指令来实施。这些计算机程序指令可以被提供给通用计算机、专用计算机或其他可编程数据处理设备的处理器,以产生一机器,使得借助计算机或其他可编程数据处理设备的处理器运行的指令创建用于实施流程图和/或框图的一个或多个方框中规定的功能/操作的手段。
这些计算机程序产品还可以保存在计算机可读介质中,其中所述介质可以指导计算机、其他可编程数据处理装置或其他设备以特定的方式运作,以使保存在计算机可读介质中的指令产生包含指令的制品,其中该指令实施的是流程图和/或框图的一个或多个方框中规定的功能/操作。计算机程序指令还可以加载到计算机、其他可编程数据处理装置或其他设备中,以便在计算机、其他可编程装置或其他设备上执行一系列操作步骤,从而产生计算机实施的处理,由此,在计算机或其他可编程装置上运行的指令提供用于实施流程图和/或框图的一个或多个方框中规定的功能/操作。
适合存储和/或执行程序代码的处理***可以由任何常规或其他计算机或处理***来实施,其中所述***优选地配备了显示器或监视器,基础(例如包括处理器、内存和/或内部或外部通信设备(例如调制解调器、网卡等等)以及可选输入设备(例如键盘、鼠标或其他输入设备))。该***可以包括通过***总线直接或间接耦合到内存部件的至少一个处理器。内存部件可以包括在实际执行程序代码的过程中使用的本地存储器,大容量存储器,以及通过为至少某个程序代码提供临时存储来减少运行过程中必须从大容量存储器中取回代码的次数的缓存存储器。输入/输出或I/O设备(包括但不局限于键盘、显示器、指示设备等等)既可以直接耦合到***,也可以通过居间的I/O控制器而被间接地耦合到***。网络适配器还可以耦合到***,以使***能够通过居间的私有或公共网络而被耦合到其他处理***、或远端打印机或存储设备。调制解调器、电缆调制解调器和以太网卡仅仅是当前可用的网络适配器中的少量适配器。
附图中的流程图和框图示出了根据本发明不同实施例的***、方法和计算机程序产品的可行实施方式的架构、功能和操作。就此而论,流程图或框图中的每一个方框都可以代表一个模块、分段或代码部分,包含用于实施一个或多个指定的逻辑功能的一个或多个可执行指令。此外还应该指出,在一些替换的实施方式中,方框中标注的功能有可能不是按照附图给出的顺序发生的。例如,连续显示的两个方框实际有可能是以基本同时的方式运行的,或者这些方框有时可以按照相反的顺序运行,这一点取决于所涉及的功能。应该指出的是,框图和/或流程图例证中的每一个方框以及方框和/或流程图例证中的方框的组合可以由执行规定的功能或操作的基于硬件的专用***实施,或者由专用硬件和计算机指令的组合来实施。
这里使用的术语旨在描述特定的实施例,而不是对本发明加以限制。除非在上下文中以别的方式清楚规定,否则这里使用的单数形式“一”、“一个”、“该”也包含了复数的形式。此外还应该理解,本说明书中使用的术语“包括”和/或“包含”规定的是存在所陈述的特征、整体、步骤、操作、部件和/或组件,但是并不排除一个或多个特征、整体、步骤、操作、部件、组件和/或其群组的存在或添加。
下列权利要求中的相应结构、材料、操作以及所有装置或步骤加功能部件的等同物旨在包含与特别要求保护的其他要求保护的部件相结合来执行功能的任何结构、材料或操作。本发明的描述是出于例证和描述目的给出的,但是并不仅限于所公开的发明形式。对本领域技术人员来说,在没有脱离本发明的范围和精神的情况下,很多的修改和变更都是显而易见的。选择和描述这些实施例是为了最好地说明本发明的原理以及实际应用,并使本领域的其他普通技术人员能够理解具有与所设想的特定用途相适合的不同修改方式的本发明的不同实施例。
Claims (16)
1.一种用于优化虚拟机或解释代码的方法,包括:
接收包含多个程序指令以及第一额外信息的代码,其中所述代码用供虚拟机运行的语言编写,并且其中所述第一额外信息是第一类型的不可执行信息;
通过移除所述第一额外信息以及将其替换成引用所述第一额外信息的位置的键值来修改所述代码;以及
执行经过修改的代码,并且如果在运行过程中发生请求所述第一额外信息的事件,则响应于所述事件使用所述键值来定位处于所述位置的第一额外信息,并且从所述位置加载所述第一额外信息。
2.根据权利要求1所述的方法,其中所述事件是故障,并且所述第一类型的不可执行信息是调试信息。
3.根据权利要求2所述的方法,还包括:
修改所述多个程序指令中的一个或多个,以便拦截异常处理进程,并且使用键值将所述异常处理进程重定向到所述第一额外信息的位置。
4.根据权利要求1所述的方法,其中所述代码包括第二额外信息,并且其中所述第二额外信息是第二类型的不可执行信息,以及第一和第二类型的不可执行信息是不同的。
5.根据权利要求4所述的方法,其中第二类型的不可执行信息是源信息或注释信息。
6.根据权利要求1所述的方法,其中所述代码是Java类文件或Java归档(JAR)文件,以及所述多个程序指令是Java字节码指令。
7.根据权利要求1所述的方法,其中所述代码是.NET代码文件,并且所述多个程序指令是公用中间语言(CIL)字节码指令。
8.根据权利要求1所述的方法,其中所述语言是解释语言。
9.根据权利要求1所述的方法,其中所述位置是存储位置,并且所述方法还包括:
将移除的第一额外信息保存在所述存储位置中。
10.根据权利要求1所述的方法,其中所述位置是保存代码的存储位置,并且其中所述加载包括从所述存储位置加载代码。
11.根据权利要求1所述的方法,其中所述位置是可以取回所述代码的位置,并且其中所述加载包括从所述位置取回代码。
12.一种***,包括:
处理器,其被配置成具有用于执行如下处理的逻辑:
在虚拟机环境中加载包含多个程序指令以及第一额外信息的代码,其中所述代码用供虚拟机运行的语言编写,并且其中所述第一额外信息是第一类型的不可执行信息;
通过移除所述第一额外信息以及将其替换成引用所述第一额外信息的位置的键值来修改所述代码;以及
执行经过修改的代码,并且如果在运行过程中发生请求所述第一额外信息的事件,则响应于所述事件,使用所述键值来定位处于所述位置的第一额外信息,并且从所述位置加载所述第一额外信息。
13.根据权利要求12所述的***,其中所述事件是故障,并且所述第一类型的不可执行信息是调试信息,以及其中所述处理器还被配置成具有执行下列处理的逻辑:
修改所述多个程序指令中的一个或多个,以便拦截异常处理进程,并且使用键值将所述异常处理进程重定向到所述第一额外信息的位置。
14.根据权利要求12所述的***,其中所述位置是存储位置,并且其中所述处理器还被配置成具有执行下列处理的逻辑:
将移除的第一额外信息保存在所述存储位置中。
15.根据权利要求12所述的***,其中所述位置是保存代码或者从其可以取回所述代码的位置,并且其中所述加载包括:从所述位置加载包含所述第一额外信息的代码。
16.根据权利要求12所述的***,其中所述虚拟机是公用语言运行时(CLR)虚拟机或Java虚拟机(JVM)。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US12/627,206 | 2009-11-30 | ||
US12/627,206 US8627303B2 (en) | 2009-11-30 | 2009-11-30 | Memory optimization of virtual machine code by partitioning extraneous information |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102081546A true CN102081546A (zh) | 2011-06-01 |
CN102081546B CN102081546B (zh) | 2013-12-18 |
Family
ID=44069822
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010105432287A Active CN102081546B (zh) | 2009-11-30 | 2010-11-15 | 通过分隔额外信息来内存优化虚拟机代码的方法和*** |
Country Status (4)
Country | Link |
---|---|
US (1) | US8627303B2 (zh) |
JP (1) | JP5602597B2 (zh) |
KR (1) | KR101699981B1 (zh) |
CN (1) | CN102081546B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103413069A (zh) * | 2013-07-08 | 2013-11-27 | 北京深思数盾科技有限公司 | 一种保护面向对象语言编写的软件的方法 |
CN103413073A (zh) * | 2013-07-09 | 2013-11-27 | 北京深思数盾科技有限公司 | 一种保护java可执行程序的方法及设备 |
CN103413075A (zh) * | 2013-07-10 | 2013-11-27 | 北京深思数盾科技有限公司 | 一种通过虚拟机保护java可执行程序的方法及设备 |
CN106469043A (zh) * | 2015-08-17 | 2017-03-01 | Arm 有限公司 | 例外处理事件的追踪 |
CN106796525A (zh) * | 2015-02-23 | 2017-05-31 | 华为技术有限公司 | 按需加载动态脚本语言代码以减少内存使用 |
CN107924302A (zh) * | 2015-07-17 | 2018-04-17 | 英航斯公司 | 一种用于在经编译软件内修改机器指令的方法和*** |
CN112566307A (zh) * | 2019-09-10 | 2021-03-26 | 酷矽半导体科技(上海)有限公司 | 安全显示***及安全显示方法 |
CN115328690A (zh) * | 2022-10-13 | 2022-11-11 | 北京登临科技有限公司 | 异常处理方法、计算机可读介质及电子设备 |
Families Citing this family (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8701088B2 (en) * | 2010-05-28 | 2014-04-15 | Red Hat, Inc. | Generating backtracing information for software debugging of software programs running on virtual machines |
JP5466601B2 (ja) * | 2010-08-31 | 2014-04-09 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コード生成方法、システム及びプログラム |
US8375443B1 (en) * | 2011-09-27 | 2013-02-12 | Google Inc. | Code annotations for preventing access to unsafe functionality |
US9027075B2 (en) * | 2011-09-29 | 2015-05-05 | Oracle International Corporation | Enforcing security rules at runtime |
US9183113B2 (en) | 2011-09-29 | 2015-11-10 | Oracle International Corporation | Debugging analysis in running multi-user systems |
US9111033B2 (en) | 2012-04-17 | 2015-08-18 | International Business Machines Corporation | Compiling source code for debugging with user preferred snapshot locations |
US8910126B2 (en) | 2012-04-18 | 2014-12-09 | International Business Machines Corporation | Compiling source code for debugging with variable value restoration based on debugging user activity |
US9274772B2 (en) | 2012-08-13 | 2016-03-01 | Microsoft Technology Licensing, Llc. | Compact type layouts |
US9122794B2 (en) | 2012-10-30 | 2015-09-01 | Oracle International Corporation | System and method for debugging domain specific languages |
US9104797B1 (en) * | 2013-03-21 | 2015-08-11 | Intuit Inc. | Efficient cloud-based annotation of crash reports |
US9146834B2 (en) | 2013-08-22 | 2015-09-29 | Oracle International Corporation | Targeted cloud-based debugging |
US9721092B2 (en) | 2014-03-27 | 2017-08-01 | International Busines Machines Corporation | Monitoring an application in a process virtual machine |
US9916220B2 (en) * | 2015-03-26 | 2018-03-13 | EMC IP Holding Company LLC | Smart logging of trace data for storage systems |
US9626171B2 (en) | 2015-07-24 | 2017-04-18 | Oracle International Corporation | Composing a module system and a non-module system |
US10078497B2 (en) | 2015-07-24 | 2018-09-18 | Oracle International Corporation | Bridging a module system and a non-module system |
US10104090B2 (en) * | 2015-08-25 | 2018-10-16 | Oracle International Corporation | Restrictive access control for modular reflection |
US10191753B2 (en) | 2016-03-30 | 2019-01-29 | Oracle International Corporation | Generating verification metadata and verifying a runtime type based on verification metadata |
US10394528B2 (en) | 2016-03-30 | 2019-08-27 | Oracle International Corporation | Returning a runtime type loaded from an archive in a module system |
US10360008B2 (en) | 2016-09-16 | 2019-07-23 | Oracle International Corporation | Metadata application constraints within a module system based on modular encapsulation |
US10387142B2 (en) | 2016-09-16 | 2019-08-20 | Oracle International Corporation | Using annotation processors defined by modules with annotation processors defined by non-module code |
JP6845429B2 (ja) | 2017-03-15 | 2021-03-17 | 富士通株式会社 | コンパイラプログラム、情報処理装置およびコンパイル方法 |
US10848410B2 (en) | 2017-03-29 | 2020-11-24 | Oracle International Corporation | Ranking service implementations for a service interface |
WO2021021126A1 (en) | 2019-07-30 | 2021-02-04 | Hewlett-Packard Development Company, L.P. | Hash map of executable control blocks |
JP2023018290A (ja) * | 2021-07-27 | 2023-02-08 | 富士通株式会社 | 解析プログラム、解析装置、及び解析方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1387265A1 (en) * | 2002-08-02 | 2004-02-04 | Telefonaktiebolaget L M Ericsson (Publ) | Optimised code generation |
CN1499363A (zh) * | 2002-10-24 | 2004-05-26 | 国际商业机器公司 | 在调试异构体系结构中的集成可执行程序时设置断点的方法和设备 |
CN1531680A (zh) * | 2001-02-09 | 2004-09-22 | Ħ��������˾ | 在程序控制流中实现改变的装置和方法 |
EP1491999A2 (en) * | 2003-06-26 | 2004-12-29 | Microsoft Corporation | Software development infrastructure |
CN101042671A (zh) * | 2007-04-24 | 2007-09-26 | 上海华龙信息技术开发中心 | 一种用于数字信号处理器的调试***及其调试方法 |
CN101162439A (zh) * | 2006-10-13 | 2008-04-16 | 中兴通讯股份有限公司 | 一种基于嵌入式应用***实现硬件寄存器的方法 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3352893B2 (ja) * | 1996-12-11 | 2002-12-03 | 株式会社日立製作所 | デバッグ情報作成方法、デバッグ方法及びデバッグシステム |
WO2000034866A1 (fr) * | 1998-12-07 | 2000-06-15 | Sony Corporation | Ordinateur, support d'enregistrement stockant un programme de traitement d'exceptions et procede de traitement d'exceptions |
JP2001236243A (ja) * | 2000-02-22 | 2001-08-31 | Nec Microsystems Ltd | デバッグ方法、および、デバッグ用プログラムを記録した記録媒体 |
JP4192519B2 (ja) * | 2002-07-24 | 2008-12-10 | 株式会社日立製作所 | 情報処理方法および装置 |
WO2004040445A1 (en) | 2002-10-29 | 2004-05-13 | Freescale Semiconductor, Inc. | Method and apparatus for selectively optimizing interpreted language code |
US7631356B2 (en) * | 2005-04-08 | 2009-12-08 | Microsoft Corporation | System and method for foreign code detection |
US8453132B2 (en) | 2006-07-28 | 2013-05-28 | Hewlett-Packard Development Company, L.P. | System and method for recompiling code based on locality domain and thread affinity in NUMA computer systems |
US7475214B2 (en) | 2006-08-16 | 2009-01-06 | International Business Machines Corporation | Method and system to optimize java virtual machine performance |
US8286152B2 (en) | 2007-08-22 | 2012-10-09 | International Business Machines Corporation | Systems, methods, and computer products for just-in-time compilation for virtual machine environments for fast application startup and maximal run-time performance |
US20090172648A1 (en) * | 2007-12-28 | 2009-07-02 | Gerginov Georgi A | Byte code analysis library |
-
2009
- 2009-11-30 US US12/627,206 patent/US8627303B2/en active Active
-
2010
- 2010-11-15 CN CN2010105432287A patent/CN102081546B/zh active Active
- 2010-11-23 KR KR1020100116594A patent/KR101699981B1/ko active IP Right Grant
- 2010-11-25 JP JP2010262977A patent/JP5602597B2/ja active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1531680A (zh) * | 2001-02-09 | 2004-09-22 | Ħ��������˾ | 在程序控制流中实现改变的装置和方法 |
EP1387265A1 (en) * | 2002-08-02 | 2004-02-04 | Telefonaktiebolaget L M Ericsson (Publ) | Optimised code generation |
CN1499363A (zh) * | 2002-10-24 | 2004-05-26 | 国际商业机器公司 | 在调试异构体系结构中的集成可执行程序时设置断点的方法和设备 |
EP1491999A2 (en) * | 2003-06-26 | 2004-12-29 | Microsoft Corporation | Software development infrastructure |
CN101162439A (zh) * | 2006-10-13 | 2008-04-16 | 中兴通讯股份有限公司 | 一种基于嵌入式应用***实现硬件寄存器的方法 |
CN101042671A (zh) * | 2007-04-24 | 2007-09-26 | 上海华龙信息技术开发中心 | 一种用于数字信号处理器的调试***及其调试方法 |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103413069A (zh) * | 2013-07-08 | 2013-11-27 | 北京深思数盾科技有限公司 | 一种保护面向对象语言编写的软件的方法 |
CN103413073A (zh) * | 2013-07-09 | 2013-11-27 | 北京深思数盾科技有限公司 | 一种保护java可执行程序的方法及设备 |
CN103413073B (zh) * | 2013-07-09 | 2016-01-20 | 北京深思数盾科技有限公司 | 一种保护java可执行程序的方法及设备 |
CN103413075A (zh) * | 2013-07-10 | 2013-11-27 | 北京深思数盾科技有限公司 | 一种通过虚拟机保护java可执行程序的方法及设备 |
CN103413075B (zh) * | 2013-07-10 | 2016-05-04 | 北京深思数盾科技股份有限公司 | 一种通过虚拟机保护java可执行程序的方法及设备 |
CN106796525A (zh) * | 2015-02-23 | 2017-05-31 | 华为技术有限公司 | 按需加载动态脚本语言代码以减少内存使用 |
CN106796525B (zh) * | 2015-02-23 | 2019-11-19 | 华为技术有限公司 | 按需加载动态脚本语言代码以减少内存使用 |
CN110941456A (zh) * | 2015-02-23 | 2020-03-31 | 华为技术有限公司 | 按需加载动态脚本语言代码以减少内存使用 |
CN107924302A (zh) * | 2015-07-17 | 2018-04-17 | 英航斯公司 | 一种用于在经编译软件内修改机器指令的方法和*** |
CN107924302B (zh) * | 2015-07-17 | 2021-03-30 | 英航斯公司 | 一种用于在经编译软件内修改机器指令的方法和*** |
CN106469043A (zh) * | 2015-08-17 | 2017-03-01 | Arm 有限公司 | 例外处理事件的追踪 |
CN106469043B (zh) * | 2015-08-17 | 2022-01-25 | Arm 有限公司 | 例外处理事件的追踪 |
CN112566307A (zh) * | 2019-09-10 | 2021-03-26 | 酷矽半导体科技(上海)有限公司 | 安全显示***及安全显示方法 |
CN112566307B (zh) * | 2019-09-10 | 2022-11-04 | 酷矽半导体科技(上海)有限公司 | 安全显示***及安全显示方法 |
CN115328690A (zh) * | 2022-10-13 | 2022-11-11 | 北京登临科技有限公司 | 异常处理方法、计算机可读介质及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
KR20110060822A (ko) | 2011-06-08 |
KR101699981B1 (ko) | 2017-01-26 |
US8627303B2 (en) | 2014-01-07 |
JP5602597B2 (ja) | 2014-10-08 |
JP2011118901A (ja) | 2011-06-16 |
US20110131561A1 (en) | 2011-06-02 |
CN102081546B (zh) | 2013-12-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102081546B (zh) | 通过分隔额外信息来内存优化虚拟机代码的方法和*** | |
KR102059705B1 (ko) | 적응식 이식가능 라이브러리 | |
US10209972B2 (en) | Executing optimized local entry points | |
US10169011B2 (en) | Comparisons in function pointer localization | |
CN110096338A (zh) | 智能合约执行方法、装置、设备及介质 | |
US10310829B2 (en) | Compiling optimized entry points for local-use-only function pointers | |
US10360005B2 (en) | Local function call tailoring for function pointer calls | |
US20180329699A1 (en) | Linking Optimized Entry Points for Local-Use-Only Function Pointers | |
US10579353B2 (en) | Loading optimized local entry points for local-use-only function pointers | |
US10534594B2 (en) | Optimized entry points and local function call tailoring for function pointers | |
US20220035614A1 (en) | Method and electronic device for deploying operator in deep learning framework | |
US20180113698A1 (en) | Executing optimized local entry points and function call sites | |
US20180113689A1 (en) | Local Function Call Site Optimization | |
CN110059456B (zh) | 代码保护方法、代码保护装置、存储介质与电子设备 | |
US20180113697A1 (en) | Executing Local Function Call Site Optimization | |
US20120272214A1 (en) | Interface method resolution for virtual extension methods | |
CN110688096B (zh) | 包含插件的应用程序的构建方法、装置、介质及电子设备 | |
US20150339139A1 (en) | Enhanced java array | |
CN114138281A (zh) | 软件工程的编译方法、装置、设备及介质 | |
US10936290B2 (en) | Compile-time folding of assumed constant values | |
US9720660B2 (en) | Binary interface instrumentation | |
CN112905211A (zh) | 固件升级文件更新方法、***、设备及存储介质 | |
CN109343892A (zh) | 一种用于检测文件的方法、装置及计算机设备 | |
US11157252B2 (en) | Assessment of the benefit of post-inlining program transformation in inlining decisions | |
CN114579135B (zh) | 一种安装包生成方法及装置 |
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 |