用于管理计算机系统中内存的方法和装置与流程

文档序号:11991132阅读:237来源:国知局
用于管理计算机系统中内存的方法和装置与流程
本发明涉及管理计算机系统中的内存。

背景技术:
计算机系统一般使用虚拟内存管理系统。虚拟内存管理系统使用动态的内存分配处理和垃圾回收(collection)处理从而分别分配和收回(reclaim)内存分配。垃圾回收处理被安排为标识已分配但无法使用的内存分配,清除其存储的相关联的内存对象,并且返回标识的内存分配用于通过重分配来再次使用(reuse)。垃圾回收处理要求大量的处理能力且可延迟计算机的其它处理。可以提高应用程序的内存效率,以便产生更少的被丢弃的内存对象让垃圾回收处理清除。然而,在运行在给定计算机上的多个系统或应用程序的情况下,标识被丢弃的内存对象的源是困难和耗时的。

技术实现要素:
本发明的实施例提供了一种用于管理计算机系统中内存的方法,其中在任何给定时间使用的内存位置被表示为第一对象图中的内存对象集,所述第一对象图包括通过对每个所述内存对象的引用而关联的系统根对象,所述方法包括下述步骤:创建用于所述内存的第二根对象,以便形成用于所述内存的第二对象图;以及响应于从所述第一对象图解除引用(dereference)第一对象,将所述解除引用的第一对象与所述第二对象图关联,以便所述第二对象图包括一个或多个解除引用的对象。该方法可包括下述步骤:标识所述第一对象图中的第二对象,该第二对象紧挨所述第一对象的解除引用之前引用了所述第一对象;以及创建从所述第二对象图到所述第二对象的引用,以便将所述第二对象图中的所述第一对象与所述第一对象图中的所述第二对象关联。该方法可包括下述步骤:在所述第二对象图中创建第一元数据对象,所述第一元数据对象被安排为提供从所述第二对象图到所述第一对象图中的所述第二对象的所述引用,以及被安排为引用所述第二对象图中的所述第一对象。该方法可包括下述步骤:标识用于所述第一对象的预定的元数据,该预定的元数据用于标识紧挨所述解除引用之前所述第一对象图中所述第一对象的位置;以及将所述元数据与所述第一对象关联地存储在所述第二对象图中。所述元数据可存储在与所述第二对象图中所述第一对象关联的第二元数据对象中。所述元数据可包括标识所述第二对象中的字段的数据,该字段用于紧挨所述第一对象的所述解除引用之前从所述第二对象引用所述第一对象。该方法可包括下述步骤:响应于在其中标识包括存在于所述第一对象图中的所有对象的第一对象集的垃圾回收的第一阶段,标识包括存在于所述第二对象图中且不存在于所述第一对象图中的对象的第二对象集;以及在其中从所述内存删除所述第二对象集的垃圾回收的任何进一步的阶段之前,保存与所述第二对象集中的所述对象的每个关联的预定数据。所述预定数据可包括标识所述第一对象的数据。所述预定数据可包括标识所述第二对象的数据,所述第二对象紧挨所述第一对象的解除引用之前引用了所述第一对象。所述预定数据可包括标识所述第二对象中的字段的数据,该字段紧挨所述解除引用之前引用了所述第一对象图中的第一对象。另一实施例提供了一种用于管理计算机系统中内存的装置,其中在任何给定时间使用的内存位置被表示为第一对象图中的内存对象集,所述第一对象图包括通过对每个所述内存对象的引用而关联的系统根对象,所述装置可操作从而:创建用于所述内存的第二根对象,以便形成用于所述内存的第二对象图;以及响应于从所述第一对象图解除引用第一对象,将所述解除引用的第一对象与所述第二对象图关联,以便所述第二对象图包括一个或多个解除引用的对象。又一实施例提供了一种用于管理计算机系统中内存的计算机程序,其中在任何给定时间使用的内存位置被表示为第一对象图中的内存对象集,所述第一对象图包括通过引用到每个所述内存对象而关联的系统根对象,所述计算机程序产品包括具有具体化为计算机可读程序代码的计算机可读介质,所述计算机可读程序代码被配置为:创建用于所述内存的第二根对象,以便形成用于所述内存的第二对象图;以及响应于从所述第一对象图解除引用第一对象,将所述解除引用的第一对象与所述第二对象图关联,以便所述第二对象图包括一个或多个解除引用的对象。本发明的实施例被安排为保护与从系统对象图中移除的内存对象有关的数据,用于标识这样的被移除的对象的源。附图说明现在将参照以下的附图,通过仅为示例的方式描述优选的实施例,附图中:图1是对包括虚拟机的计算机系统的示意性说明;图2a和2b是图1的虚拟机的内存中对象图的示意性表示;图3是说明从图2b的对象图之一提取的数据的表;图4是说明响应于图2a的对象图中的对象的解除引用、在计算机系统中进行的处理的流程图;以及图5是说明响应于对得到图3的数据的图2b的对象图进行的垃圾回收处理而进行的处理的流程图。具体实施方式参照图1,计算机101加载有操作系统102,其提供用于一个或多个应用程序的处理平台。在本实施例中,该计算机加载有虚拟机环境应用程序103,其为JavaTM运行时环境(JavaTMruntimeenvironment,JRE)应用程序的形式,被安排为使得用户能够在计算机101上运行一个或多个JavaTM虚拟机(JavaTMvirtualmachine,JVM)104。每个JVM104包括虚拟内存105和包括垃圾回收模块的内存管理器程序106。每个JVM104还包括存储器107,被安排为存储一个或多个用于在JVM104上运行的程序108,以及存储输入或输出程序数据109。内存管理器106被安排为通过按要求分配或解除分配内存105的部分给程序108,在JVM104处理程序108之一个程序期间管理内存105的使用。内存管理器106定期地进行垃圾回收处理以扫描内存105,从而标识内存105中已经由程序108解除分配的部分,从内存的任何这样的部分中清除数据,并且将所述内存的部分标记为可用的,用于内存管理器106进一步分配给程序108。在用于JVM104的内存模型中,最初内存105是自由的且被分配给称作堆(heap)的内存管理数据构造,应来自程序108的以变量、函数或数据结构的形式存储内存对象的请求,从该堆分配内存105中的位置。参照图2a,由程序108在任何给定时间使用的内存对象201通过从一个对象201到另一个对象201的引用而被关联,以便形成系统对象图形式的第一对象图203。该系统对象图203包括称作系统根的根对象204。换言之,用于程序108的当前或活数据均通过引用202,或者直接、或者经由一个或多个其它对象201间接地关联到系统根204。任何给定的对象201可被任何数目的其它对象201引用。换言之,给定的对象201可通过从每个其它的对象201引用而与任意数目的其它对象201链接或关联。当程序108不再需要对给定对象201的引用202时,将相关的引用202从该对象图103中移除。换言之,该对象201被解除引用。然而,由于对象201可被任何数目的其它对象201引用,因此移除一个引用不一定指示该对象已经被丢弃。仅当对给定对象的所有引用202都被移除时,该对象201才会视为被丢弃的。由于因此对丢弃的对象201的所有引用202应该已经是被移除的,因此丢弃的对象将不再与系统根204链接或关联。内存管理器106的垃圾回收处理被安排为遍历内存105的对象图,且标识出或者直接或者间接地链接到系统根204的所有对象201。这样的对象被称作为活(live)对象,即当前被相关的程序108使用的对象。所有其它的对象都视为是丢弃的或死(dead)对象,且因此可从内存105中移除,且其分配的内存返回到堆以供再次使用。在本实施例中,内存管理器106被安排为响应于对象201的解除引用而收集用于对象201的数据。在垃圾回收处理期间,针对任何死的和将被丢弃的解除引用的对象,内存管理器106还被安排为以图1所示死对象数据110的形式保存与死对象有关的数据的预定集合。在本实施例中,死对象数据包括:1.死对象的标识2.到活对象的引用,死对象是从该活对象解除引用的;以及3.标识该活对象中的字段的字段元数据,该字段包括被移除的、对该死对象的引用。参照图2b,为了回收该死对象数据110,内存管理器106被安排为对内存105维持第二对象图205,其包括解除引用的对象(dereferencedobject)。在本实施例中,第二对象图205包括根对象206,这里被称作为死根。内存管理器106被安排为响应于从第一对象图203即系统根对象图解除引用对象,将该解除引用的对象添加到解除引用的对象图205。在本实施例中,这通过以死对象信息对象207的形式向解除引用的对象图205添加新的对象来实现。在本实施例中,所有新的死对象信息对象从死根对象直接引用。死对象信息对象207包括对新解除引用的对象209的引用208。在本实施例中,死信息对象207还包括对活对象201的引用210,解除引用的对象209是从该活对象201解除引用的。还向解除引用的对象图205添加字段定义对象211,并从死对象信息对象207引用字段定义对象211。字段定义对象211包括标识活对象201中的字段的数据,该字段包含被移除的、对新解除引用对象209的引用。由内存管理器106进行的垃圾回收处理被安排为在通常称为标记阶段的第一阶段搜索系统根对象图203并将所有存在的连接的对象标记为“活的”。换言之,或者直接从系统根204引用、或者经由系统根对象图203中一个或多个其它对象201间接从系统根204引用的所有对象被标识为当前正由加载的程序108使用。解除引用的对象图205不被用于标识“活”对象。然而经由系统根对象图203标识的一些对象也可存在于解除引用的对象图205中。这在当解除引用的对象被超过一个活对象引用、且当进行垃圾回收处理时一个或多个这样的引用保持时发生。在垃圾回收处理的第二阶段,内存管理器106被安排为搜索解除引用的对象图205以标识在第一阶段中没有被标识为“活的”的、且因此作为从内存105中移除或扫除的候选的任何连接的对象209。该垃圾回收被安排为从该搜索中排除任何元数据对象,即在本实施例中为死信息对象207和字段定义对象211。这避免了垃圾回收处理对元数据对象的不必要的处理,元数据对象在本实施例中,从来不被“活”对象引用。对于每个这样的候选对象,标识在解除引用对象时创建的死对象信息对象207以及元数据对象211形式的相关联的对象,且提取和存储预定的死对象数据110如图3。因此,对于每个相关的对象,死对象数据110首先包括标识死对象209的对象标识符301。其次,死对象数据110包括死对象209的最初父母201的标识302,即最初引用了死对象209的对象201。从自死对象信息207到最初引用的对象201的引用210导出标识符302。再次,死对象数据110包括引用字段数据303,其标识对象201中曾用于最初引用死对象209的字段。从自死对象信息对象207引用的字段定义对象211中提取引用字段数据303。在解除引用的对象图205中可存在这样的一些对象:其保持从系统根对象图203中的一个或多个活对象被引用,并且因此保持为“活的”。然而,在垃圾回收处理的第一阶段,与这样的被解除引用但仍旧为“活的”的对象相关联的元数据对象不会被标记为“活的”,这是因为不能从系统根204对其访问且因此将成为被移除的候选。因此,为了保留(preserve)用于这样被解除引用但仍旧为“活的”的对象的元数据对象,内存管理器106还被安排为标识任何在第二对象图205中被标记为“活的”的解除引用的对象,以及类似地将其相关联的元数据对象标记为“活的”以避免其之后被移除。一旦已经从解除引用的对象图205的相关节点提取了死对象数据110,则发起垃圾回收处理中的第三阶段,其通常称为扫除阶段。在该第三阶段中,扫描内存105中的所有对象并且移除所有没被标记为“活的”的对象,且其内存分配被返回到堆用于再次使用。当对象被从内存105移除时,解除引用的对象图205被修复(repaired)从而移除如今多余的元数据对象,即在本实施例中为相关的死信息对象207和字段定义对象211。由于一些对象仍旧被自系统根对象图203中一个或多个活对象引用,因此其可保持在解除引用的对象图205中。现在将参照图4的流程图描述响应于对象的解除引用而由内存管理器106进行的处理。响应于用于解除引用的对象的选择、在步骤401发起处理并且随后处理移至步骤402。在步骤402,该选择的对象被从系统根对象图203解除引用,并且处理移至步骤403。在步骤403,如果在内存105中目前不存在死根对象,则处理移至步骤404。在步骤404创建死根对象206,且处理移至步骤405。如果在步骤403在内存105中标识出死根对象206,则处理直接移至步骤405。在步骤405,创建新的死对象信息对象207,并且添加从死根对象206到新的死对象信息对象207的引用,且处理移至步骤406。在步骤406,添加从新的死对象信息对象207到活对象201的引用,该新对象201紧挨新解除引用的对象209的解除引用之前引用了该对象209,且处理移至步骤407。在步骤407,添加从新的死对象信息对象207到新解除引用的对象209的引用,且处理移至步骤408。在步骤408,创建新的元数据对象211,且数据标识之前引用对象201中的提供对新解除引用对象209的引用的字段,且处理移至步骤409。现在将参照图5的流程图描述在垃圾回收处理中由内存管理器106进行的处理。在步骤501根据内存管理器106的垃圾回收调度发起处理且处理移至步骤502。在步骤502,遍历系统根对象图203,且将所有可访问的对象标记为活的,且处理移至步骤503。在步骤503,遍历解除引用的对象图205以标识任何被标记为“活的”的解除引用的对象,标识其相关联的元数据对象并将这些对象标记为“活的”且处理移至步骤504。在步骤504,遍历解除引用的对象图205,从而标识任何在步骤502中没有被标识为“活的”、且因此作为从内存105中移除的候选对象的任何连接的对象209,且处理移至步骤505。在步骤505,对每个标识的供移除的候选者,从解除引用的对象图205中的相关对象提取死对象数据110并存储该死对象数据110,且处理移至步骤506。在步骤506,从内存移除在步骤502中标识的、供移除的所有候选对象,且其内存分配返回到堆,并且处理移至步骤507。在步骤507,在需要的情况下修复解除引用的对象图205,从而考虑被移除的对象。处理随后移至步骤508且结束。在另一实施例中,死对象数据包括最靠近的(closest)活对象的标识,最靠近的活对象或者直接或者经由一个或多个其它死对象间接地引用给定的死对象。在又一个实施例中,内存管理器提供来自两个堆的内存分配。第一个堆提供对所有对象的存储,且第二个堆提供用于死根对象和元数据对象(诸如死信息对象和字段定义对象)的存储。响应于第一个堆中的对象的解除引用,在第二堆中创建对应的元数据对象集,包括对第一个堆中的解除引用的对象的交叉堆引用。当对第一个堆应用垃圾回收处理时,没有从活对象进一步引用的任何解除引用的对象将被标识为供移除的候选。来自第二堆中元数据对象的交叉-堆引用将不可见,且因此不会破坏由垃圾回收处理对解除引用的对象的标识。对于每个被标识为供移除的候选的对象,扫描第二个堆从而标识并输出相关联的对象元数据。随后移除从元数据到第一个堆中相关联的对象的交叉-堆引用。随后从四根开始对第二个堆进行第二垃圾回收处理,且该处理被安排为标识并移除任何没有连接到活对象的元数据对象,即没有对活对象的交叉-堆引用的元数据对象。正如本领域的技术人员应理解的,本发明的实施例不限于JavaTM或JRETM,且可应用于任何虚拟机系统或环境。适合的虚拟机系统或环境可被安排为直接运行在计算机系统上或运行在操作系统上。换言之,虚拟机系统或环境可以本机地运行或被托管。虚拟机可通过软件仿真或硬件虚拟化提供。正如本领域的技术人员应理解的,本发明的实施例可应用于物理机环境,即应用于直接运行在物理计算机上的以及提供用于运行一个或多个应用程序的平台的操作系统。正如本领域的技术人员应理解的,可对给定的应用提供任何级别的死对象数据。在一些应用中,可提供最小限度的死对象数据,其提供用于每个死对象的单个数据项,诸如用于死对象的标识符、或紧挨死对象的解除引用之前引用了该死对象的对象的标识符,或最靠近的活对象的标识符,该活对象或者直接或者经由一个或多个死对象间接地引用给定的死对象。本发明的实施例从死根引用与解除引用的对象相关联的元数据对象,且从元数据引用该解除引用的对象自身。这避免需要对象中额外的字段用于引用对象各自的元数据的。在一些实现方式中,可能需要隐藏这样额外的字段。本发明的实施例被安排为保留与在计算机上的程序处理期间已经创建、并在随后已经作为垃圾回收处理或其它适合的内存管理处理的结果从内存移除的内存对象有关的数据。该数据可包括移除的对象的标识符、或与移除的对象相关联或引用移除的对象的对象的细节。该数据可包括引用对象的字段的标识,曾自该引用对象引用该移除的对象。死对象数据可以被用于标识创建各自对象的程序、部分程序或其它处理。这样的标识对于监控、测量、修改或提高相关程序、程序部分或其它处理的内存使用率是有用的。该数据可被用于在相关联的处理中、在选择的点处重构系统对象图。本领域的技术人员应理解,具体化本发明的一部分或全部的装置可以是具有被安排为提供本发明的实施例的一部分或全部的软件的通用设备。该设备可以是单个设备或设备的组,且该软件可以是单个程序或程序集。此外,任何或所有用来实现本发明的软件可经由任何适合的传输或存储装置通信以便该软件可加载到一个或多个设备上。尽管已经通过对本发明实施例的描述对其进行了说明,且尽管已经以相当多的细节描述了实施例,但是发明人并不旨在将所附权利要求的范围限制或以任何方式限定于这样的细节。对本领域的技术人员而言,额外的优点和修改会是容易想到的。因此,本发明在其较宽泛的方面并不限于代表性的装置和方法的特定细节,以及示出和描述的说明性示例。因此,可以在不偏离发明人总体发明理念的范围内偏离这样的细节。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1