用于利用自动存储器管理系统减少应用程序的存储器占用量的系统和方法

文档序号:6656641阅读:154来源:国知局
专利名称:用于利用自动存储器管理系统减少应用程序的存储器占用量的系统和方法
技术领域
本发明主要地涉及计算机应用程序的存储器管理。具体而言,本发明涉及用于使用自动化存储器管理减少应用程序的存储器占用量(footprint)的系统和方法。
背景技术
这一部分旨在于提供在权利要求中记载的本发明的背景或者环境。这里的描述可以包括能够寻求的但不是必然地先前就已经设想过或者寻求过的概念。因此,除非这里另有指明,在这一部分中描述的内容既不是先于本申请权利要求的技术,也不因为被包含于这一部分中而被认可为是现有技术。
Java是由Sun Microsystems在20世纪90年代开发的简易的、面向对象的、分布式的、解释性的、鲁棒的、安全的、架构中立的、便携的、多线程的、动态的、顺应时髦词语(buzzword-compliant)的、通用性的编程语言。Java类似于C++,既没有操作符过载(尽管它确实具有方法过载),也没有多重继承和扩充自动强制。它具有被称为无用单元(garbage)收集的自动存储器管理。
Java程序可以在小型计算机上独立运行。解译器和类(class)支持约占40千字节;附加的标准库和线程支持(实质上是自含微核)则添加了附加的175Kb。Java利用用于动态方法解析的Objective C的工具来扩展C++的面向对象的工具。Java具有用于例如HTTP和FTP的TCP/IP协议的例程扩展库。Java应用可以如在本地文件系统上一样容易地经由URL跨越因特网来访问对象。
Java编译器和连接器实行强类型检验——必须明确地确定类型的过程。Java利用基于公共密钥加密的认证来支持无病毒、无篡改系统的创建。Java编译器生成可在任何支持Java运行期系统的处理器上执行的架构中立性的对象文件。对象代码由字节代码指令构成,这些指令被设计成既易于在任何机器上解译又容易转换成本机机器代码。
Java的无用单元收集堆是Java系统的主要魅力所在,因为它消除了或者至少是减少了普通的编程错误、存储器漏洞的可能。遗憾的是,无用单元收集堆必然地比普通的存储器管理需要更多的存储器。这归因于如下事实在无用单元对象的生成(当对象不再被引用、因此可以释放它的空间时)与无用单元收集器线程在系统中发现足够的空余时间并且能够为新的分配回收无用单元对象的空间这一时刻之间有一段时间。因此,Java程序比常规程序占据更多存储器。这一存储器要求对于在移动终端业界中采用Java而言是一个重大阻碍。Java对象库是这详一种对象库,即某些普通操作(如串操纵)生成大量无用单元对象。减少Java的存储器占用量可以带来很大益处。
目前已经有对于解决Java存储器要求的尝试。例如,Java运行期已经包括越来越高效的无用单元收集器,一代又一代的无用单元收集器就是本领域技术发展的现状(参见http://java.sun.com/docs/hotspot/gc1.4.2/faq.html)。本机Java编译器已经使用数据流分析来发现可以在堆栈上分配哪些对象以取代无用单元堆(参见Choi,Gupta,Serrano,Sreedhar和Midkiff(IBM T.J WatsonResearch Center)Escape analysis for Java.OOPSLA99,Denver 1999)。所尝试的另一解决方案要求程序员标记什么对象可以在什么堆区段上分配(参见JSR-1,Real-time specification for Java,http://www.jcp.org/en/jsr/detail?id=1)。Microsoft.NET框架使用与Java类似的无用单元收集系统。其它编程语言使用字节代码和无用单元收集,例如包括C#、Lisp、Objective-C、PHP、Perl、Python、Smalltalk、VBA、Visual Basic和VBScript。
因此,需要通过显著地减少所产生的无用单元来减轻无用单元收集器的工作,由此允许程序运行得更快和需要更少的存储器。另外,需要减少存储器占用量以促进在移动终端业界中的采用。还需要一种用于减少应用程序的存储器占用量的系统和方法。

发明内容
一般而言,这里描述的示例性的实施例通过减少所产生的无用单元来减轻无用单元收集器的工作。这些实施例将Java字节代码的数据流分析与Java虚拟机(JVM)的扩展相结合。向Java字节代码添加如下信息,该信息明确地描述了在程序的某一位置可以释放哪个对象。例如,特殊字节代码可以被插入到原始字节代码中以明确地释放未使用的对象。结果是,无用单元收集器看不到被明确地回收的对象,而该对象在它不再被使用之后不保留存储器。JVM的存储器占用量减少而响应性更佳,这是由于无用单元收集器具有较少的工作,所以它更少地和在时间上更短地中断应用程序。
一个示例性的实施例涉及一种减少在面向对象的编程环境中产生的存储器占用量的方法。此方法包括分析经编译的代码以标识待回收的对象;以及修改经编译的代码以包括用以对于从所述分析中发现的对象进行回收的指令。
另一示例性的实施例涉及一种用于在面向对象的编程环境中减少存储器占用量的系统。该系统包括预处理器,配置用以在面向对象代码中发现非逸出(no escape)点,并且将未使用对象标志插入到代码中以释放在面向对象的代码中的未使用的对象;执行面向对象的代码的虚拟机;以及释放无用单元收集堆中的对象的无用单元收集器,该无用单元收集堆包含来自于所执行的面向对象的代码中的使用过的对象。具有未使用对象标志的代码不进入无用单元收集堆中并且不必由无用单元收集器释放。
另一示例性的实施例涉及一种具有在其上执行的面向对象的编程代码的设备。该设备包括存储器,配置用以包含面向对象的代码;处理器,对面向对象的代码执行数据流分析以确定可以回收的对象,其中该处理器在可以回收的对象中插入特别指令;以及无用单元收集堆,配置用以存储不需要的对象直至所述不需要的对象可以被释放为止。该无用单元收集堆是存储器中的空间,并且该无用单元收集堆不包含在数据流分析中确定的对象。
另一示例性的实施例涉及一种用以减少执行面向对象的代码所需要的存储器的计算机程序产品。该计算机程序产品包括用以将特别字节代码插入到原始字节代码中以标识待回收的对象的计算机代码,其中所标识的对象不再被使用;以及用以回收所标识的对象使得所标识的对象在不再被使用之后不保留存储器的计算机代码。
又一示例性的实施例涉及一种减少面向对象的代码的存储器需求的模块。该模块包括存储器结构和预处理器。该存储器结构包含无用单元收集堆。该预处理器对面向对象的代码执行数据流分析以确定可以被回收的对象,并且在可以回收的对象中插入特别字节代码。具有特别字节代码的对象不放置于无用单元收集堆中而是被明确地释放。


图1是对根据示例性的实施例的无用单元减少系统进行描绘的大体框图;图2是对操作中的示例性无用单元减少系统进行描绘的示图;图3是对包括图1的无用单元减少系统的通信系统进行描绘的示图。
具体实施例方式
现存有若干种不同编程语言,这些编程语言解译和包括利用无用单元收集的自动存储器管理。在最为流行的编程语言之中的是JavaTM、Visual C#、.NETTM、Lisp、Objective-C、PHP、Perl、Python、Smalltalk、VBA、Visual BasicTM和VBScriptTM。在以下的示例性实施例中使用了Java,但是相同的方法也可以应用于其它适当的语言。
Java虚拟机(JVM)是将Java字节代码解译成机器代码的程序。正是JVM使得Java可以移植。例如位于华盛顿州Redmond的MicrosoftCorporation或者位于加利福尼亚州Santa Clara的Sun Microsystems销售商为它们的操作系统写入JVM,而任何Java程序都可以在那一JVM上运行。
JVM是抽象的计算机器。它像实际的计算机器那样具有指令集并且在运行期操纵各种存储器区域。JVM对Java编程语言一无所知,唯一知道的就是特定的二进制格式即类文件格式。类文件包含JVM指令(或者字节代码)和符号表以及其它辅助性信息。
为安全考虑,JVM对类文件中的代码施行强格式和结构性约束。然而,具有可以根据有效的类文件来表达的功能的任何语言都可以由JVM掌控。为一种普遍可以获得的独立于机器的平台所吸引,其它语言的实施者正在转向将JVM作为用于他们的语言的传递媒介。
现在参照附图,图1图示了在无用单元减少过程中执行的操作。可以根据实施例来执行附加的、更少的或者不同的操作。在操作14中在可以回收某些对象时对源代码12进行数据流分析以确定代码中的点。源代码12是Java字节代码程序。数据流预处理器在操作16中将特殊字节代码插入到原始源代码12中。该特殊字节代码允许回收源代码12。在操作18中,无用单元收集器看不到具有插入的特殊字节代码的对象。
所回收的来自源代码12的对象在它不再被使用之后不保留存储器。结果,JVM存储器占用量降低并且响应性更佳,这是由于无用单元收集器具有更少的工作,所以它不那么频繁地中断应用程序而中断也更为短暂。
图2图示了无用单元减少系统20。字节代码22由编译器24处理,然后通过预处理器26运行。编译器24可以是正好及时的编译器。预处理器26发现无逸出点,并且插入在块28中明确地释放未使用的对象的字节代码。Java虚拟机(JVM)29运行字节代码22并且支持释放某些对象的插入字节代码。
预处理器26对编译代码的修改可以包括插入可以用来推断何时可以回收对象的数据结构。例如,该数据结构可以是表,其中对于每一Java类都有一个这样的表,该表包含在什么位置对哪一对象解除分配的信息。
虽然不是优选的但是可供选择的是,方法调用可以插入到Java源文件中以实现对象回收。另一可供选择的实施是在Java代码安装于目标系统上时执行数据流分析。这一解决方案具有不打破代码兼容性的优点,因为只有JVM能够执行新的字节代码语句时才利用新的指令来扩展Java字节代码。
图3图示了包括这里所述的无用单元减少特征的通信系统50。这里所描述的示例性的实施例可以应用于包括具有语音识别应用程序的电子设备以及服务器的任何通信系统,其中在该电子设备与该服务器之间可以传输数据。
通信系统50包括终端设备(TE)装置52、接入点(AP)54、服务器56和网络58。TE装置52可以包括存储器(MEM)、中央处理单元(CPU)、用户接口(UI)和输入-输出接口(I/O)。存储器可以包括用于存储控制CPU的应用程序的非易失性存储器和用于数据处理的随机存取存储器。可以通过在CPU中执行在存储器中存储的编程指令来实施上下文控制模块。I/O接口可以包括无线局域网的网络接口卡,例如基于IEEE 802.11标准的网络接口卡之一。
TE装置52可以经由接入点54连接到网络58(例如局域网(LAN)、因特网、电话网)以及进而连接到服务器56。TE装置52也可以例如使用电缆、红外线或者射频数据传输直接地与服务器56进行通信。服务器56可以为TE装置52提供各种处理功能。
TE装置52可以是在其中执行语音识别的任何便携式电子设备,例如个人数字助理(PDA)设备、远程控制器或者耳机和麦克风的组合。TE装置52可以是计算机或者移动台使用的补充性装置,在该情况下可以经由计算机或者移动台来设置去往服务器56的数据传输。在示例性的实施例中,TE装置52是与公共陆地移动网络进行通信的移动台,其中服务器56也在功能上连接到该公共陆地移动网络。连接到网络58的TE装置52包括用于与网络58进行无线通信的移动台功能。网络18可以是任何已知无线网络,例如支持GSM服务的网络、支持GPRS(通用分组无线电服务)的网络、或者例如根据3GPP(第3代合作伙伴计划)标准的UMTS(通用移动电信系统)网络的第三代移动网络。服务器56的功能也可以实施于移动网络中。TE装置56可以是仅用于通话的移动电话,或者它也可以包含PDA(个人数字助理)功能。
尽管已经描述了本发明的若干实施例,但是应当理解到对于本发明所涉及的本领域中的技术人员而言诸多修改和变化将是可以想到的。例如,虽然所述特定实施例和实施方式预想了针对例如电话的通信设备来使用无用单元减少功能,但是其它电子设备也可以包括这里描述的功能。另外,尽管使用了Java编程语言来描述示例性的实施例,但是任何面向对象的编程语言也可以包括该功能。本发明不限于特定实施例而是延及仍然落入所附权利要求的范围和精神之内的各种修改、组合和互换。
权利要求
1.一种减少在编程环境中产生的存储器占用量的方法,所述方法包括分析经编译的代码以标识待回收的对象;修改所述经编译的代码以包括用以对于从所述分析中发现的对象进行回收的指令。
2.根据权利要求1所述的方法,还包括基于插入到所述修改的指令在运行期回收所述标识的对象。
3.根据权利要求1所述的方法,其中修改所述经编译的代码使用预处理器来完成。
4.根据权利要求1所述的方法,其中修改所述经编译的代码使用正好及时的编译器来完成。
5.根据权利要求1所述的方法,其中修改所述经编译的代码包括插入字节代码。
6.根据权利要求1所述的方法,其中所述经编译的代码是Java字节代码。
7.根据权利要求1所述的方法,其中修改所述经编译的代码包括插入方法调用。
8.根据权利要求1所述的方法,其中经编译的代码的修改包括插入可以用来推断何时可以回收对象的数据结构。
9.根据权利要求1所述的方法,其中经编译的代码的所述修改由运行所述修改代码的Java虚拟机支持。
10.一种用于在面向对象的编程环境中减少存储器占用量的系统,所述系统包括预处理器,配置用以在面向的对象代码中发现非逸出点,并且将未使用对象标志插入到所述代码中以释放在所述面向对象的代码中的未使用的对象;执行所述面向对象的代码的虚拟机;以及释放无用单元收集堆中的对象的无用单元收集器,所述无用单元收集堆包含来自于所执行的面向对象的代码中的使用过的对象,其中具有所述未使用对象标志的代码不进入所述无用单元收集堆中并且不必由所述无用单元收集器释放。
11.根据权利要求10所述的系统,其中虚拟机是Java虚拟机。
12.根据权利要求10所述的系统,还包括编译所述面向对象的代码的编译器。
13.根据权利要求10所述的系统,其中所述预处理器执行数据流分析以确定可以被回收的对象,所述确定的对象具有插入其中的所述未使用对象标志。
14.一种具有在其上执行的面向对象的编程代码的设备,所述设备包括存储器,配置用以包含面向对象的代码;处理器,对所述面向对象的代码执行数据流分析以确定可以被回收的对象,其中所述处理器插入与可以被回收的对象有关的特别指令;以及无用单元收集堆,配置用以存储不需要的对象直至所述不需要的对象可以被释放为止,其中所述无用单元收集堆是所述存储器中的空间,并且所述无用单元收集堆不包含在数据流分析中所确定的。
15.根据权利要求14所述的设备,其中所述面向对象的代码是Java字节代码。
16.根据权利要求14所述的设备,其中当所述面向对象的代码被安装时执行所述数据流分析。
17.根据权利要求14所述的设备,其中回收所述标识的对象是基于由所述处理器插入的指令在运行期被回收。
18.根据权利要求14所述的设备,其中所述处理器插入的所述特别指令包括插入字节代码。
19.根据权利要求14所述的设备,其中所述处理器插入的所述特别指令包括插入方法调用。
20.根据权利要求14所述的设备,其中所述处理器插入的所述特别指令包括插入可以用来推断何时可以回收对象的数据结构。
21.根据权利要求14所述的设备,还包括用以解译字节代码的虚拟机。
22.根据权利要求21所述的设备,其中所述虚拟机支持由处理器插入的所述特别指令。
23.根据权利要求14所述的设备,还包括将Java字节代码解译成机器代码的Java虚拟机。
24.一种计算机程序产品,用以减少执行面向对象的代码所需要的存储器,所述计算机程序产品包括用以将特别字节代码插入到原始字节代码中以标识待回收的对象的计算机代码,其中所标识的对象不再被使用;以及用以回收所述标识的对象使得所述标识的对象在不再被使用之后不保留存储器的计算机代码。
25.根据权利要求24所述的计算机程序产品,还包括用以执行数据流分析以确定待回收的对象的计算机代码。
26.根据权利要求25所述的计算机程序产品,其中当所述面向对象的代码被安装时执行所述数据流分析。
27.根据权利要求24所述的计算机程序产品,其中所述特别字节代码在所述原始字节代码被编译之后被插入。
28.一种减少面向对象的代码的存储器要求的模块,所述模块包括存储器结构,包含无用单元收集堆;以及预处理器,对所述面向对象的代码执行数据流分析以确定可以回收的对象,其中所述预处理器在可以回收的对象中插入特别字节代码,其中具有所述特别字节代码的对象不放置于所述无用单元收集堆中而是被明确地释放。
29.根据权利要求28所述的模块,其中所述面向对象的代码是Java代码。
30.根据权利要求28所述的模块,其中当所述面向对象的代码被安装时执行所述数据流分析。
31.根据权利要求28所述的模块,还包括支持所述特别字节代码的Java虚拟机。
全文摘要
所描述的技术通过减少所产生的无用单元来减轻无用单元收集器的工作。这些实施例将本机编译器的数据流分析与Java虚拟机(JVM)的扩展相组合。特别字节代码被插入到原始字节代码中以明确地释放未使用的对象。结果,无用单元收集器看不到被明确地回收的对象,而该对象在它不再被使用之后不保留存储器。JVM的存储器占用量减少而响应性更佳,这是由于存储单元收集器具有较少的工作,所以它更少地和在时间上更短地中断应用程序。
文档编号G06F9/45GK101027650SQ200580027766
公开日2007年8月29日 申请日期2005年6月7日 优先权日2004年6月22日
发明者G·帕利尔 申请人:诺基亚公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1