专利名称:系统资源的优化利用的方法
技术领域:
本发明涉及Java虚拟机(JVM)系统范围初始化程序,并特别涉及以生 成一个要被系统范围的全部进程使用的JVM实例为前提工作的、JVM系统 范围初始化程序。
背景技术:
在我们的发明之前的许多Java虚拟机(JVM)实现中,在典型的JVM例 示期间消耗了大量的存储器和指令周期。在这点上,相同JVM和类的许多实 例被典型地加载,并且唯一地专用于特定的软件进程。如此,基本上相同JVM 和类的多个副本消耗大量存储器、处理周期和其它系统资源。
这增加了处理开销,并且系统资源的减少不利地影响高速处理。如此, 优化辅助Java应用程序以便不会不利地干扰核心事务处理资源,引发本发明。
发明内容
通过由实现Java虚拟机(JVM)系统范围初始化程序、在使用JVM的 系统中提供一种系统资源的优化利用的方法,克服了现有技术的缺点并且提 供了另外的优点,该方法包括增加多个类到JVM系统范围初始化程序;创 建分配程序,其利用系统可见的可写的存储;运行JVM系统范围初始化程序, 其初始化多个类的每个一次,用于由多个软件进程使用;根据需要更新JVM 系统范围初始化程序;以及根据需要加载另外的类。
在此也描述和要求保护了对应于上述方法的系统和计算机程序产品。
通过本发明的技术实现了另外的特征和优点。本发明的其它实施例和方 面在此详细描述,并且被认为是要求保护的发明的部分。为了更好地理解本 发明的优点和特征,参照说明书和附图。
技术影响
作为概述的发明的结果,技术上我们已经获得了解决方案,其实现了以 生成一个要由系统范围的全部进程使用的JVM实例为前提工作的、JVM系
统范围初始化程序,实现了存储器和其它系统资源显著的节约。
关于本发明的主题在说明书的结论的权利要求中被具体地指出和明确地 要求保护。从下面结合附图的详细描述中,本发明的前述和其它目的、特征 和优点是明显的,在附图中
图1图示确定哪个类应当被增加到JVM系统范围初始化程序的方法的一 个示例;
图2图示更新系统可见的JVM并且^f吏用复制写入(copy-on-write )来加 载类的方法的一个示例;以及
图3图示用于在系统范围初始化程序已经运行后、处理随后的Java进程 的方法的一个示例;
参照附图、通过示例的方式,详细的描述解释了本发明的优选实施例、 优点和特征。
具体实施例方式
现在更详细地转向附图,将看到在本发明的示例性实施例中,Java虚拟 机(JVM)系统范围初始化程序以生成一个要由系统范围的全部进程使用的 JVM实例的前提工作。
在这点上,实现了几个优点。 一个这样的优点是否则通常将必须例示 JVM的所有进程能够在很大部分上避免,该JVM能够为百万指令(每进程) 级。在示例性实施例中,这能够是系统范围的巨大的系统资源节约。
另一个优点能够是,否则通常将必须例示JVM的所有进程能够共享相同 的存储器视图,该JVM能够有兆字节(每进程)级的存储器覆盖区(footprint )。 在示例性实施例中,这能够是另 一 系统范围的巨大的系统资源节约。
另一个优点能够是JVM初始化程序的主体(bulk)只运行一次。从软 件设计的观点,这能够导致更健全的软件设计,因为系统遭受更少无法预料 的问题,问题在每秒若干JVM被例示时会出现。
另一个优点能够是在本发明的示例性实施例中,JVM的"冻结"状态 能够允许JVM自身更容易的调试。
另一个优点能够是在实现本发明中,存在允许程序员决定哪些类将由JVM系统范围初始化程序初始化一次、或留下根据需要由复制写入特征初始 化的灵活性。在这点上,本发明允许程序员更好地管理、优化和设计消耗更 少的系统资源和更有效地操作的代码。
参照图1,图示了确定哪个类应当被增加到JVM系统范围初始化程序的 方法的示例。在用于示例而不是限制的示例性实施例中,程序员能够决定确 定哪些类应当被增加到JVM系统范围初始化程序、以及哪些类应当被留下以
在每次需要它们时由应用程序初始化。该方法在决定块1002开始。
在决定块1002中,进行关于类是否是标准类并且被频繁使用的确定。如 果确定是肯定的,即类是标准类并且被频繁使用,则处理移动到块1006。如 果结果是否定的,即类不是标准类并且或者不被频繁使用,则处理移动到块 1004。
在块1004中,程序员的决定能够是将该类保持在JVM系统范围初始化 程序之外,并且如此该类将在每次需要它时由应用程序初始化。然后退出该 方法。
在块1006中,程序员能够决定将该类增加到JVM系统范围初始化程序。 如此,该类将被初始化一次并且根据需要共享。然后退出该方法。
参照图2,图示了更新系统可见的JVM并且使用复制写入来加载类的方 法的一个示例。在示例性实施例中,JVM系统范围初始化程序使用这样的特 征,其允许在程序(共享的目标或可执行的)在整个系统中第一次使用时只 执行一次的功能。此外,该"第一次调用系统范围"初始化程序将进程静态 数据复制回程序中,该静态数据在初始化程序运行期间被改变。通过复制回 该静态信息,更新现在对系统范围的所有应用程序是可见的,该系统范围的 所有应用程序需要访问已经运行该初始化程序的特定程序。
在示例性实施例中,重要是注意到"第一次调用系统范围"初始化程序 具有限制、并且不能由自身用来创建可由系统上的所有应用程序使用的JVM 实例。 一个限制是复制的各值不能是进程特定的。该限制的最普通的示例是 堆(heap)。在期间获得的堆将是无意义的,并且潜在地不能由随后引用它的 应用程序访问。发现JVM初始化充满分散在程序的静态部分中的进程范围存 储器指针不是罕见的。
在本发明的示例性实施例中,为了克服该限制,创建了利用系统范围可 写的存储的分配程序(截取正常的分配程序调用)。扩展该实现,能够使用用
于由分配程序使用的相同的JVM程序的静态数据。这使得非常容易使用与 "第一次调用系统范围"初始化程序用来将由分配程序进行的静态存储更新
复制回程序中的相同机制。这有效地从"存储器分配(malloc)"分配中捕获 所有的JVM初始化存储,并且使它们遍及系统可见。
在采用这种方法中,进行了一些关于从技术和成本/效益观点来看在生产 环境中什么真正要紧的重要的假设。显然,JVM具有只有进程可见的存储器 分配的原因,是因为期望每个进程将具有只有该进程应该访问和查看的特定 的信息。这是唯一性相对创建唯一的环境的资源成本的折衷。使用JVM系统 范围初始化程序能够减少进程唯一性,意味着所有的Java应用程序应当访问 相同的加载的类。然而,巨大的节约出现于不必每次都初始化讨论的类(其 包括JVM内的类控制结构的构造)。考虑到进程唯一性,JVM系统范围初始 化程序能够利用两个特征。 一个这样的特征是程序版本控制,以及第二个这 样的特征是复制写入。版本控制允许将相同的程序多次加载到生成系统而不 中断当前的活动,以及复制写入允许唯一的进程更新到共享的静态存储。
在本发明的示例性实施例中,复制写入是允许JVM系统范围初始化程序 与随后的进程一起工作的特征。如此,它允许多个应用程序唯一的写访问静 态数据的一个副本。从系统资源的观点来看复制写入不便宜,但其为JVM提 供了加载还没有被加载的、但只对该进程唯一的类的方法。例如,如果应用 程序环境要求有相同名称的类对该进程唯一,那么我们能够将其从JVM系统 范围初始化程序移除,并且允许该进程唯一地加载该类,并且通过使用复制 写入将其加入系统可见的JVM。
此外,为了更新系统可见的JVM,重要的是注意到在示例性实施例中, 必须重新加载该类,并且JVM系统范围初始化程序必须重新运行。这是程序 版本开始起作用允许这样的作用发生而不中断JVM的旧的版本的地方。
在操作期间,期望标准类最好不需要几个依赖于进程的版本。作为示例 而不是限制,在原始类的情况下,保持每次重新初始化这些可能没有意义。 该方法在块2002开始。
在块2002中,JVM被建立和或加载,并且处理移动到块2004。
在块2004中,创建使用系统可见的可写的存储的分配程序。处理然后移 动到块2006。
在块2006中,JVM系统范围初始化程序被运行。处理然后移动到决定
块2008。
在决定块2008中,做出关于系统可见的JVM是否需要被更新的确定。 如果结果是肯定的,即JVM需要被更新,那么处理移动到块2014。如果结 果是否定的,即JVM不需要被更新,那么系统初始化完成并且例程退出。
在块2010中,版本控制被用于重新加载JVM并重新运行JVM系统范围 初始化程序,而不中断JVM的旧的版本。处理然后返回到块2002。
参照图3,图示了用于在JVM系统范围初始化程序已经运行后、处理随 后的各Java进程的方法的一个示例。该方法在决定块3002开始。
在决定块3002中,做出关于JVM是否需要加载类的确定。如果结果是 肯定的,即JVM需要加载类,那么处理移动到块3004。如果结果是否定的, 即JVM不需要加载类,那么处理移动到块3008。
在块3004中,类被加载,并且处理移动到块3006。
在块3006中,复制写入特征被用于创建唯一的进程图像。处理然后移动 到决定块3008。
在决定块3008中,做出关于应用程序是否被终止的确定。如果结果是肯 定的,即应用程序已经-陂终止,那么例程退出。如果结果是否定的,即应用 程序还没有终止,那么处理返回到决定块3002。
整产品环境的选项。如果类是标准的并且在系统中被频繁使用,那么它能够 被增加到JVM系统范围初始化程序以被初始化一次,遍及系统节约资源。如 果类趋于是进程唯一的或不被频繁使用,那么它能够被保持在JVM系统范围 初始化程序外,以根据需要被初始化。
本发明的能力能够以软件、固件、硬件或其一些组合实现。
作为一个示例,本发明的一个或更多方面能够被包括在具有例如计算机 可使用的介质的制造的产品(例如一个或更多计算机程序产品)中。在此该 介质已经包括例如计算机可读的程序代码装置,其用于提供和促进本发明的 能力。制造的产品能够被包括作为计算机系统的部分或分开出售。
此外,能够提供至少一种由机器可读的程序存储设备,其确实地包括至 少 一个可由该机器执行以执行本发明的能力的指令程序。
在此描绘的流程图只是示例。对在此描述的这些图或步骤(或操作)可 以存在许多变化,而不偏离本发明的精神。例如,各步骤可以以不同的顺序 执行,或各步骤可以添加、删除或修改。所有这些变化被认为是要求保护的 本发明的部分
尽管已经描述了本发明的优选实施例,但本领域技术人员将理解现在 和将来,可以进行落入权利要求的范围内的各种改进和提高。这些权利要求 应当被-现为维持对第一次描述的本发明的合适的保护。
权利要求
1.一种通过实现JVM系统范围初始化程序,优化利用java虚拟机JVM的系统中的系统资源的方法,所述方法包括增加多个类到JVM系统范围初始化程序;创建使用系统可见的可写的存储的分配程序;运行所述JVM系统范围初始化程序,其初始化多个类的每个一次,用于由多个软件进程使用;根据需要更新所述JVM系统范围初始化程序;以及根据需要加载另外的类。
2. 如权利要求l所述的方法,其中更新包括通过使用程序版本更新。
3. 如权利要求l所述的方法,其中更新包括通过使用程序版本更新,以 重新加载所述JVM、以及重新运行所述JVM系统范围初始化程序而不中断 任何所述JVM之前的版本。
4. 如权利要求2所述的方法,其中根据需要加载另外的类包括通过复制 写入的方式加载类。
5. 如权利要求3所述的方法,其中根据需要加载另外的类包括通过允许 访问静态数据的 一个副本的复制写入的方式加载类。
6. —种通过实现JVM系统范围初始化程序,优化利用java虚拟机JVM 的系统中的系统资源的方法,所述方法包括增加多个类到JVM系统范围初始化程序; 创建使用系统可见的可写的存储的分配程序;运行所述JVM系统范围初始化程序,其初始化多个类的每个一次,用于 由多个软件进程使用,所述多个软件进程共享所述JVM的单个例示; 根据需要更新所述JVM系统范围初始化程序;以及 根据需要加载另外的类。
7. 如权利要求6所述的方法,其中更新包括通过使用程序版本更新。
8. 如权利要求6所述的方法,其中更新包括通过使用程序版本更新,以 重新加载所述JVM、以及重新运行所述JVM系统范围初始化程序而不中断 任何所述JVM之前的版本。
9. 如权利要求7所述的方法,其中根据需要加载另外的类包括通过复制 写入的方式加载类。
10. 如权利要求8所述的方法,其中根据需要加载另外的类包括通过允 许访问静态数据的 一个副本的复制写入的方式加载类。
11. 如权利要求9所述的方法,其中所述多个软件进程共享单个存储器 视图。
12. —种通过实现JVM系统范围初始化程序,优化使用java虚拟机JVM 的系统中的系统资源的方法,所述方法包括增加多个类到JVM系统范围初始化程序; 创建使用系统可见的可写的存储的分配程序;运行所述JVM系统范围初始化程序,其初始化多个类的每个一次,用于 由多个软件进程使用,所述多个软件进程共享单个存储器视图; 根据需要更新所述JVM系统范围初始化程序;以及 根据需要加载另外的类。
13. 如权利要求12所述的方法,其中更新包括通过使用程序版本更新。
14. 如权利要求12所述的方法,其中更新包括通过使用程序版本更新, 以重新加载所述JVM、以及重新运行所述JVM系统范围初始化程序而不中 断任何所述JVM之前的版本。
15. 如权利要求13所述的方法,其中根据需要加载另外的类包括通过复 制写入的方式加载类。
16. 如权利要求14所述的方法,其中根据需要加载另外的类包括通过允 许访问静态数据的 一个副本的复制写入的方式加载类。
17. 如权利要求12所述的方法,还包括 在终止时显示所述单个存储器视图。
全文摘要
本发明公开了一种系统资源的优化利用的方法。在本发明的示例性实施例中,Java虚拟机(JVM)系统范围初始化程序以生成一个要由系统范围的全部进程使用的JVM实例为前提工作。一个这样的优点是否则通常将必须例示JVM的所有进程能够在很大部分上避免,该JVM能够为百万指令(每进程)级,实现系统范围的巨大的系统资源节约。另一个优点能够是,否则通常将必须例示JVM的所有进程能够共享相同的存储器视图,该JVM能够有兆字节(每进程)级的存储器覆盖区,再次实现系统范围的巨大的系统资源节约。
文档编号G06F9/445GK101192169SQ20071018492
公开日2008年6月4日 申请日期2007年10月29日 优先权日2006年11月30日
发明者丹尼斯·J·法伦, 小詹姆斯·D·约翰斯顿, 科利特·A·马诺尼, 萨拉特·维缪里 申请人:国际商业机器公司