首页> 中国专利> 确定存储器外部碎片的原因

确定存储器外部碎片的原因

摘要

一种确定存储器中的外部碎片的原因的方法。方法包括收集与由应用进行的存储器的区域的释放相关联的信息、将信息存储在存储器的区域中以及分析信息以确定存储器的区域为何没有被重新分配给任何应用。在由分配器将存储器的区域的第一部分分配给应用以及存储器的区域的第二部分被分配器释放的实施例中,方法包括将指示第二部分是剩余部分的指示符存储在存储器的区域的第二部分中、收集与第二部分的释放相关联的信息、将信息存储在第二部分中以及分析信息以确定第二部分为何没有被重新分配给任何应用。

著录项

  • 公开/公告号CN107077422A

    专利类型发明专利

  • 公开/公告日2017-08-18

    原文格式PDF

  • 申请/专利权人 国际商业机器公司;

    申请/专利号CN201680003389.2

  • 发明设计人 D·K·西格瓦尔特;M·R·基尔纳;

    申请日2016-02-05

  • 分类号

  • 代理机构中国国际贸易促进委员会专利商标事务所;

  • 代理人郑宗玉

  • 地址 美国纽约

  • 入库时间 2023-06-19 03:07:54

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-05-12

    授权

    授权

  • 2017-09-12

    实质审查的生效 IPC(主分类):G06F12/02 申请日:20160205

    实质审查的生效

  • 2017-08-18

    公开

    公开

说明书

技术领域

本发明涉及存储器管理,以及更具体地涉及确定存储器外部碎片的原因。

背景技术

存储器区域的碎片(诸如,堆)会导致计算机系统中的许多性能问题(诸如,长执行时间和较大存储器需求)。消除、避免或诊断碎片可以对计算机系统的操作有显著益处。

外部碎片是当可用于分配的存储器空闲块(“孔”)小到不能满足分配存储器的新请求时,目的通常是要创建新“对象”。在本专利申请的上下文中,“对象”是具有数据和与该数据相关联的唯一标识符两者的实体;该标识符可以是该数据在存储器中的位置。对象是动态分配的,即,可以由应用经由“分配器”分配和释放表示其数据的存储器区域。在本专利申请的上下文中,当对象的数据没有被应用释放时,对象是“活的”。对象可以被应用“销毁”;即,应用经由将存储器释放回到空闲列表的分配器对对象的数据解除分配,以及对象“死亡”。通常,分配器需要遍历孔列表(称为空闲列表),直到分配器可以在存储器中找到足够大以满足分配请求的孔为止。遍历空闲列表耗费执行时间以及小到不能被分配的孔浪费存储器。通常当存在相同存储器区域内分配的不同寿命的对象时产生外部碎片。当短寿命的对象死亡时,在存活的寿命较长的对象之间剩下的孔通常比要创建的新对象小。孔共同地为外部碎片。空闲列表中的孔越小以及越广泛,存储器就变得越支离破碎。

先前的公开可以通过分析空闲列表以及辨识空闲列表是否包括许多小孔来确定何时出现外部碎片,但是先前的公开不能确定什么正在导致那些孔,那些孔是在哪儿创建的,以及因此先前的公开不能提供任何有关计算机可读程序指令需要改变什么以减少、避免或消除碎片的建议。将会期望改进碎片(尤其是外部碎片)的诊断和避免将。

因此,现有技术中存在对解决前述问题的需求。

发明内容

从另外的方面来看,本发明提供用于确定存储器中的外部碎片的原因的方法,其中存储器的区域被应用释放、被分配器解除分配以及没有被重新分配给任何应用,该方法包括:收集与由应用进行的存储器的区域的释放相关联的信息;将信息存储在存储器的区域中;以及分析信息以确定存储器的区域为何没有被重新分配给任何应用。

从另外的方面来看,本发明提供用于确定存储器中的外部碎片的原因的系统,其中存储器的区域被应用释放、被分配器解除分配以及没有被重新分配给任何应用,该系统包括:分配器,用于收集与由应用进行的存储器的区域的释放相关联的信息以及将信息存储在存储器的区域中;以及分析器,用于分析信息以确定存储器的区域为何没有被重新分配给任何应用。

从另外的方面来看,本发明提供了用于确定存储器中的外部碎片的原因的计算机程序产品,其中存储器的区域被应用释放、被分配器解除分配以及没有被重新分配给任何应用,该计算机程序产品包括计算机可读存储介质,该计算机可读存储介质能被处理电路读取以及存储用于由处理电路运行以执行用于执行本发明的步骤的方法的指令。

从另外的方面来看,本发明提供了存储在计算机可读介质上以及能加载到数字计算机的内部存储器中的计算机程序,所述计算机程序包括软件代码部分,当在计算机上运行所述程序时,用于执行本发明的步骤。

本发明的实施例提供了用于确定存储器中的外部碎片的原因的方法,其中存储器的区域被应用释放、被分配器解除分配以及没有被重新分配给任何应用。该方法包括收集与由应用进行的存储器的区域的释放相关联的信息。该方法还包括将信息存储在存储器的区域中。该方法还包括分析信息以确定存储器的区域为何没有被重新分配给任何应用。

本发明的实施例还提供了用于确定存储器中的外部碎片的原因的方法,其中存储器的区域的第一部分被分配器分配给应用以及存储器的区域的第二部分被分配器释放。该方法包括将指示第二部分是剩余部分的指示符存储在存储器的区域的第二部分中。该方法还包括收集与第二部分的释放相关联的信息。该方法还包括将信息存储在第二部分中。该方法还包括分析信息以确定第二部分为何没有被重新分配给任何应用。

本发明的实施例还提供了用于确定存储器中的外部碎片的原因的系统,其中存储器的区域被应用释放、被分配器解除分配以及没有被重新分配给任何应用。该系统包括分配器。分配器收集与由应用进行的存储器的区域的释放相关联的信息以及将信息存储在存储器的区域中。该系统还包括分析器,该分析器用于分析信息以确定存储器的区域为何没有被重新分配给任何应用。在该系统中,存储器的区域被分配器解除分配以及没有被重新分配给任何应用。

本发明的实施例还提供了用于确定存储器中的外部碎片的原因的计算机程序产品,其中存储器的区域被应用释放、被分配器解除分配以及没有被重新分配给任何应用。该计算机程序产品包括在其中实现了程序代码的计算机可读存储介质。程序代码可运行以:收集与由应用进行的存储器的区域的释放相关联的信息;将信息存储在存储器的区域中;分析所述信息以确定所述存储器的区域为何没有被重新分配给任何应用。

本发明的实施例还提供了用于确定存储器中的外部碎片的原因的计算机程序产品,其中存储器的区域的第一部分被分配器分配给应用以及存储器的区域的第二部分被分配器释放。该计算机程序产品包括在其中实现了程序代码的计算机可读存储介质。程序代码可运行以:将指示第二部分是剩余部分的指示符存储在存储器的区域的第二部分中;收集与第二部分的释放相关联的信息;将信息存储在第二部分中;分析信息以确定第二部分为何没有被重新分配给任何应用。

附图说明

现在将仅通过示例的方式、参考如下列图中图示的优选实施例来描述本发明:

图1示出了根据现有技术的具有所分配的存储器块和存储器空闲孔的现有技术的存储器管理系统;

图2示出了根据现有技术的图1的存储器的空闲孔的现有技术的空闲列表;

图3示出了根据现有技术的图1的存储器的现有技术的空闲孔;

图4示出了根据现有技术的图1的存储器的现有技术的分配块;

图5示出了根据本发明的优选实施例的确定什么和/或谁正在导致外部碎片的根据本发明的方法的第一实施例的流程图;

图6示出了根据本发明的优选实施例的图3的存储器的空闲孔以及通过图5的实施例存储在其中的信息;

图7示出了根据本发明的优选实施例的基于通过图5的实施例收集的信息维持的一组统计度量;

图8示出了根据本发明的优选实施例的图5的分析步骤510的流程图;以及

图9示出了根据本发明的优选实施例的确定什么和/或谁正在导致外部碎片的根据本发明的方法的第二实施例的流程图。

具体实施方式

图1示出了可以实现本发明实施例的具有所分配的存储器块和存储器空闲孔的现有技术的存储器管理系统。应用130、132向分配器136提出请求以从存储器102的区域分配存储器的区域104、106供它们使用。可以使用诸如alloc或malloc的命令完成这种请求。当应用130、132请求分配器136时,分配器136分配存储器102的区域104、106供应用130、132使用。图1还示出了已经分配给图1中未示出的应用的存储器102的其它区域108-112。每个应用130、132可以向分配器136提出多个请求以分配存储器102的区域104-112,以及分配给应用130、132的存储器102的区域104-112不一定是连续的。当应用130、132用完存储器102的区域104-112时,它们使用诸如free(释放)或dealloc的命令将存储器102的区域104-112返回(“释放”(release或free))到分配器136。当存储器102的区域104-112被释放到分配器136时,分配器136将它们添加至存储器102的未分配区域122-128的空闲列表134。稍后将参照图2至图4对现有技术的空闲列表134进行描述。

当已经处理了分配和释放存储器102的存储器区域104-112、122-128的许多请求时,最初较长的连续空闲存储器区域被分割成越来越小的区域122-128。外部碎片是当分配给应用130、132的存储器102的分配区域104-112之间的空闲区域122-128小到不能满足从存储器102进行分配的新请求时产生的。外部碎片的一个度量是由于空闲列表上大量的小孔(这些孔小到不能满足分配请求)不能用于分配的存储器的百分比;外部碎片的另一个度量是由于遇到大量小孔导致的遍历空闲列表的增加的成本。

0%的外部存储器碎片意指可以分配空闲存储器的全部,而不需要存储器使用或计算工作量上的额外成本。90%的外部存储器碎片(在存储器使用度量下)意指分配器具有例如800KB大小的存储器102的区域、但是由于孔的小尺寸使得720KB不能用于分配。

图2示出了图1的存储器的空闲孔的现有技术的空闲列表。使用存储器的每个空闲区域122-128中的存储器区域作为存储器的下一个空闲区域122-128的指针,将存储器102的空闲区域122-128在链表中连接在一起。变量包括对存储器102的第一区域122的引用。存储器的最后区域128包括结束符值(通常是“NULL”),用以指示链表的结尾。为了释放存储器102的新区域128,仅仅将指向它的指针放在链表中的存储器102的上一个空闲区域126中。为了分配存储器102的区域126,仅仅将其指向存储器102的下一个空闲区域128的指针复制到存储器102的空闲区域124中,从而重写指向要从空闲列表134移除并且要被分配的存储器102的区域126的现有指针。

分配器136可以自己创建存储器102的空闲区域122-128。这可以在应用130、132请求例如56字节大小的存储器102的区块、而分配器136仅可以找到64字节大小的区块时发生。分配器136向应用130、132分配例如56字节的第一部分,以及从64字节大小的区块的剩余第二部分创建8字节的空闲存储器102区块,其链接至空闲列表134。分配器将指示存储器区域的第二部分是剩余部分的指示符存储在被分配器释放的存储器区域的第二部分中。

图3示出了图1的存储器的现有技术的空闲孔。存储器102的示例性现有技术的空闲孔124包括对存储器孔124的大小的指示304。通常,最高有效位302用来指示存储器102的关联区域是否是存储器102的空闲孔124或它是否是存储器102的分配块106。在其它现有技术中,空闲/分配位302与对大小的指示304分开。在另一个实现中,标记图与用于存储器的每个区块的位一起使用,示出存储器的每个区块是空闲的还是已分配的。例如,如果在指示空闲存储器的标记图中存在三个相邻位,则存在三个空闲的连续存储器区块。在另一个实现中,通过上下文确定存储器孔的大小。分配器136维持若干独立的空闲列表134,每个空闲列表134包括单个给定大小的存储器102的区域122-128。无论使用存储存储器区域的大小的这些实现中的哪一个,分配器都使用它来保存大小的记录以实施常规分配。

如上面参照图2解释的,下一个指针306指向空闲列表134中的空闲存储器102的下一个区域126。空闲存储器的每个区域中的下一指针306形成空闲存储器区域122-128的链表。空闲存储器310形成存储器102的空闲孔124的剩余部分。

图4示出了图1的存储器的现有技术的分配块。存储器102的示例性现有技术的分配块106包括对存储器块106的大小的指示404。通常,最高有效位402用来指示存储器102的关联区域是否是存储器102的空闲孔124或它是否是存储器102的分配块106。在其它现有技术中,空闲/分配位402与对大小的指示404分开。由于没有已分配存储器的链表,因此已分配存储器104-112不需要如空闲块124中所看到的下一个指针306。已分配存储器410形成存储器102的分配块106的剩余部分。

图5示出了确定什么和/或谁正在导致外部碎片的根据本发明的方法的第一实施例的流程图。方法在步骤502处开始。在步骤504处,应用130、132的方法(诸如,例程、函数等等(被称为“调用器”))想要销毁不再需要的对象。调用器调用分配器136的解除分配函数,以便释放先前分配给对象的存储器区域。分配器136将存储器区域插入到如上面参照图2所述的空闲列表中。在步骤506处,收集与先前分配给对象的存储器区域的释放相关联的信息。所收集的信息可以涉及销毁一个对象的原因。在其它实施例中,所收集的信息可以涉及超过一个对象。所存储的信息(图6中的602-608)纯粹是示例性的,以及可以包括所示信息602-608以及未示出的其它信息中的一些或全部或不包括这些信息。如果存储器102的空闲区域122中没有充足的可用空间,则可以不存储信息602-608中的全部。所存储的信息602-608涉及谁创建或销毁先前拥有存储器102的区域122的对象、或在何处创建或销毁先前拥有存储器102的区域122的对象。

参照图6,所存储的信息可以包括调用器的返回地址602,该调用器销毁对象以及因此对存储器102的区域104-112进行释放或解除分配;返回地址602可以用来识别调用器本身。可以通过分配器136遍历当前线程的调用栈来获得该返回地址。常规的栈遍历器用于正在使用的语言和平台。对栈进行遍历直到找到返回到调用器的返回地址为止。由于分配器136的解除分配方法的一个或多个入口点被很好地定义,因此可以确定当前线程的调用栈中的返回地址的位置。

所存储的信息还可以包括创建对象和/或销毁对象的行号604、文件名ID 606以及方法ID 608。这些中的每一个可以通过被作为解除分配(dealloc)或释放命令的参数传递给分配器136而获得。在以C++语言实现的实施例中,__FILE__、__LINE__和__func__(或__FUNCTION__)通常分别内置于在编译时给出当前完整路径和文件名、当前行号以及当前函数名的变量中。例如,常规释放命令可以是:解除分配(Pointer1);用以丢弃分配给由变量*Pointer1指向的对象的存储器。在本发明的实施例中,解除分配命令可以是:解除分配(Pointer1,102,“ClassA::methodA”);对于行号102处的函数“ClassA::methodA”,丢弃分配给由变量*Pointer1指向的对象的存储器。在其它实施例中,代替行号,可以将来自源文件的语句编号用作参数。通过使用哈希表将名称存储为由ID引用的字符串,名称可被转换成较短的ID以被存储为FILE NAME ID 606和METHOD ID 608。以后,在后处理时,在给定ID的情况下,哈希表可以用来查找关联的字符串。

在另一个实施例中,当应用或一个或多个其它活动对象保持对对象的引用时,该对象是“活的”。当从所有活动对象和应用移除对对象的所有引用时,该对象死亡。当移除最后引用时,销毁对象以及可以通过现有技术的引用计数的方法来确定使得该销毁发生的应用函数。引用计数是存储对对象的引用、指针或句柄的数量的技术。在该实施例中,分配器存储与对象本身相关联或对象本身中的引用计数。应用使用分配器方法添加或移除对对象的引用以及对象之间的引用。当应用函数经由分配器的方法移除对对象的最后引用时,对象的引用计数将降为零,已知对象在那时死亡,以及分配器将对与刚死亡的对象相关联的存储器解除分配。在该精确点处,分配器可以确定使得对象被销毁的函数。如稍早描述的,分配器可以遍历调用栈,直到它到达分配器的移除引用方法的入口点为止。可以确定函数的返回地址。或以类似的方式,可以向移除引用方法传递包括当前文件名、当前行号和函数的当前函数名的附加参数。

在本发明的实施例中,另外的信息可以存储在存储器102的空闲区域122中,包括但不限于:(i)存储器102的该空闲区域122不满足请求的、空闲列表134上的分配请求数量“N_not_sat”;(ii)在创建对象到销毁对象之间的经过时间/CPU时间;(iii)当先前拥有存储器102的区域122的对象是活的时出现的分配请求的数量或分配请求的总大小;以及(iv)其它信息,诸如使得对象被销毁的函数的线程ID或模块ID。

存储器的每个空闲区域122-128将包括与存储器的该特定区域以及一个或多个对象的销毁的原因相关的上述信息中的全部或一些或不包括这些信息。存储器102的该空闲区域122-128不满足请求的、空闲列表134上的分配请求数量“N_not_sat”是有用的,因为它使本发明的实施例能够将最近添加到空闲列表134的存储器102的那些空闲区域122-128与长时间在空闲列表134上以及不是“有用的”存储器102的那些空闲区域122-128(即,不能满足分配请求的存储器102的那些空闲区域122-128)区分开。可以将分配请求数量“N_not_sat”实现为与其它信息602-608存储在一起的计数器,每次分配器136针对分配请求检查存储器区域122-128中的每一个存储器区域时,计数器递增,但是分配请求数量“N_not_sat”不用于分配。

在创建对象到销毁对象之间的经过时间或CPU时间是有用的,因为先前分配给仅持续较短经过时间或较短CPU时间的对象(称为短寿命对象)的存储器102的空闲区域122-128是产生较多孔的那种对象。当将存储器区域122分配给对象时,可以将创建对象时的开始时间与其它信息存储在一起。在对对象解除分配时,知道销毁对象时的时间。这两个时间之间的差是对象活了多久(经过时间或CPU时间或两者)。

在创建对象到销毁对象之间的存储器分配的数量或存储器分配的总大小的增大是对象是短寿命对象还是长寿命对象的另一个度量。当将存储器区域122分配给对象时,可以将直到对象被创建已发生的分配的数量与其它信息存储在一起。在对对象进行解除分配时,知道直到对象被销毁已发生的分配的数量。这两个数量之间的差是当对象是活的时已发生的存储器分配的数量。

当分配器136试图向应用130、132分配存储器时,分配器136搜索空闲列表134,寻找合适大小的存储器区域122-128以从中进行分配。当分配器136找到这种存储器区域时,存储器区域可能比所请求的分配大小大得多。分配器136分配存储器区域的一部分,将存储器区域的剩余部分插入到空闲列表134上。为此,分配器136将存储器区域分成两个部分,创建两个对象:分配对象和剩余对象。将分配对象返回给应用以满足分配请求。将剩余对象插入到空闲列表134中,以及因此剩余对象立即“死亡”。在本发明的实施例中,根据存储器的空闲区域中有多少空间可用,当分配器136这样做时,分配器136记录指示与剩余对象到空闲列表134上的释放相关联的分配器136的“插入剩余部分”动作的专用方法ID(在存储器的空闲区域122中)。类似地,当合并存储器区域时,分配器136记录指示分配器136的合并动作的专用方法ID。以类似方式,从合并的两个或更多个存储器区域创建一个合并对象,以及该合并对象立即“死亡”并且被插入回到空闲列表134中。注意,专用方法ID可以重写先前的方法ID 608,或者专用方法ID可以附加至该存储器区域122的较早的方法ID 608,使得关于孔的原始原因的信息在数据分析时仍然可用。

回到图5,在步骤508处,将步骤506处收集的信息存储在正在被释放以及先前与现在被销毁的对象相关联的存储器区域122中,其中现在被销毁的对象拥有先前分配(现在空闲)的存储器区域122。简要地参照图6,图6示出了图3的存储器102的空闲孔122连同通过图5的实施例的步骤508存储在其中的信息602-608。

在步骤510处,对所收集的信息进行分析,以确定存储器102的一个或多个区域122-128为什么没有被重新分配给任何应用。这种分析可以是例如收集谁创建了这些对象和谁使得这些对象被销毁和/或在何处创建了这些对象或在何处销毁了这些对象的统计概况。这种统计概况可以是示出区域122-128的大小的种类或空闲区域122-128的数量的直方图。这可以示出不能分配的存储器102的空闲区域122-128中的大多数包括存储器102的分配区域之间的小孔。在该情况下,可以研究创建那些对象和/或使得那些对象被销毁的方法的源代码以确定创建了哪种对象,它们为什么具有短使用寿命以及确定避免外部碎片的其它手段。

在作为诊断工具的一部分的本发明实施例中,可以(i)在由分析员提出请求时(原地分析)或(ii)在应用终止时(事后分析),对存储器102的空闲区域122-128中存储的所收集的信息进行分析。

在作为自适应分配器136的一部分的本发明实施例中,可以在分配器决定进行校正动作时,对存储器102的空闲区域122-128中存储的所收集的信息进行分析。

参照图7,对于(如由其文件名、方法、函数或例程名和/或行号确定的)每个调用器ID,基于所收集的信息维持一组统计度量700。在示例性实施例中,在包括如在数据收集期间记录的该调用器的一个或多个指示符的空闲列表134上,维持与该调用器ID相关联的存储器区域122-128的数量的计数702、空闲存储器区域122-128的大小的平均值704或空闲存储器区域122-128的大小的直方图706。

每个调用器ID与一组统计度量700相关联;以及如将为本领域技术人员所熟知的,可以例如通过将调用器ID用作哈希表的关键字来存储和检索该组统计度量。可以在该组度量700中维持其它统计度量,例如,跨越与调用器ID相关联的所有存储器区域122-128的所有未满足分配请求的总计数708、当对象是活的时候被销毁的对象的平均寿命710(与调用器ID相关联,以CPU时间或经过时间为单位);以应用在那些使用寿命期间进行的分配的数量为单位的对象的平均寿命712;或以应用所分配的字节数量为单位的对象的平均寿命714。度量702-714可以全部存在,它们可以以任何组合存在,或者可以仅存在任何一个。

图8示出了图5的分析步骤510的实施例的流程图。方法在步骤802处开始。通过检查空闲列表134生成统计度量700。在步骤804处,对于空闲列表134上的每个存储器区域122-128,首先识别调用器ID。调用器ID是下列中的一个或多个:方法ID、线程ID、模块ID、行号、文件名ID或方法中的返回地址,其可以根据可被写入到目标文件或单独的“调试信息”文件中的符号信息映射到调用器方法ID和/或行号。根据符号信息的调用器ID的映射将为本领域技术人员所熟知。

在步骤806处,检索对于该调用器ID计算的该组统计度量700,以及用正被检查的当前存储器区域的所收集的信息更新该组统计度量700。例如,可以更新与调用器ID相关联的存储器区域122-128的数量的计数702,可以使用来自存储器区域122中存储的已知大小304更新对于调用器ID的存储器区域的大小的平均值704,和/或可以使用已知大小304更新对于调用器ID的存储器区域的大小的直方图706。

在步骤808处,可以更新对于该调用器ID的其它统计度量708-714。例如,可以基于正被检查的存储器区域的未满足分配请求数量“N_not_sat”更新对于该调用器ID的未满足分配请求总数量708。此外,作为示例,对于该调用器ID,可以使用与存储器区域相关联的对象是活的时候的以CPU时间或经过时间为单位的时间段来更新对于该调用器ID的以当对象是活的时候被销毁的对象的CPU时间或经过时间为单位的平均寿命710。方法在步骤810处结束。

应当理解,可能存在可以采用的许多不同统计度量,以及上述仅给出了它们中的选集。此外,由于调用器ID具有分级性质,度量中的一些可以产生分级信息。例如,作为结果产生的统计数据可以示出通过方法所驻留的模块、接着通过方法以及接着通过行号发生了什么。可以利用源代码增强信息。

可以将统计数据(i)传递给作为将使用信息改变分配器136行为的自适应分配器136的一部分的系统的另一个组件;或(ii)传递给剖析工具,该剖析工具将使用信息将诊断报告输出给性能分析员,该性能分析员将使用报告对应用或分配器进行更改以减少碎片。存在许多关于可以如何使统计数据可视化以使得指示数据的丰富视图的现有技术(例如可从SourceForge购得的Performance Inspector、可从Intel公司购得的vtune,或可从SourceForge购得的oprofile)。

下面针对C++语言示出可以如何查看上面(ii)的这种诊断报告的示例。碎片原因的识别(诸如,还识别产生碎片的对象“objA”的ClassA::methodA的行10)是本发明实施例的主要优点。

未满足的请求

孔的大小<16字节

其中:

标记-事件发生的分层级别:

TID-线程级别

MOD-模块级别

SYM-符号级别

LIN-行号

计数-给定报告度量的计数(例如,未满足请求,大小<16字节的孔)

%%%-该符号内的该度量的比例(作为百分比)

名称-符号名称(即,线程id名称、模块名称、方法名称、行号和该行处的源代码)。

在步骤512处,研究结果可以用于改变存储器的分配以便避免外部碎片的原因。分配器使用步骤510的结果以更好地分配正在导致外部碎片的那种对象。方法在步骤514处结束。

图9示出了确定什么和/或谁正在导致外部碎片的根据本发明的方法的第二实施例的流程图。步骤502至510与上面已经参照图5描述的那些步骤相同。在步骤912处,步骤510的所收集的信息的分析结果用来从存储器的第一区域为类似于被销毁的一个或多个对象的新创建的对象分配存储器102的区域,存储器的第一区域与用来为新创建的对象中的其它对象分配存储器区域的存储器的第二区域分开。在该实施例中,如果数据分析确定第一应用或特定的第一方法通常通过请求以及随后释放小存储器区域导致碎片整理,同时第二应用或特定的第二方法请求以及随后释放大得多的存储器区域,则可以从分离的存储器区域分配来自第一应用和第二应用的请求。方法在步骤914处结束。在实施例中,存储器的第一区域中的新创建的对象具有不同大小,通常为小对象,而对于存储器的第二区域中的新创建的对象,通常为大对象。

本发明的实施例需要知道对象何时以及在何处死亡,以及因此在程序源中,对象死亡的位置需要被很好地定义并且是明确的。例如,对于自动存储器管理(诸如,虚拟机垃圾收集器(Virtual Machine Garbage Collector)),程序仅隐含地确定对象何时死亡,这(主要)是在对象不再被活动对象引用时发生。因此,人们不能确定“谁”销毁了对象,因为仅在垃圾收集时发现死亡对象。在这种实施例中,当垃圾收集器利用引用计数时,这可以用来确定对象何时死亡。然而,在许多分配方案(诸如,C/C++中的许多存储器模型)中,对于“谁”销毁了对象以及对象在程序源中“何处”死亡存在非常清楚的定义。IBM是在世界范围内的许多管辖区域中注册的国际商业机器公司的商标。Java和所有基于Java的商标和标识是Oracle和/或其子公司的商标或注册商标。

计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或通过电线传输的电信号。

这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。

用于执行本发明操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本发明的各个方面。

这里参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。

这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。

也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。

附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或可以用专用硬件与计算机指令的组合来实现。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号