CN113268439A - 内存地址的查找方法和装置、电子设备和存储介质 - Google Patents

内存地址的查找方法和装置、电子设备和存储介质 Download PDF

Info

Publication number
CN113268439A
CN113268439A CN202110580065.8A CN202110580065A CN113268439A CN 113268439 A CN113268439 A CN 113268439A CN 202110580065 A CN202110580065 A CN 202110580065A CN 113268439 A CN113268439 A CN 113268439A
Authority
CN
China
Prior art keywords
memory address
target
memory
address
node
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.)
Pending
Application number
CN202110580065.8A
Other languages
English (en)
Inventor
邱海港
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Kingsoft Cloud Network Technology Co Ltd
Original Assignee
Beijing Kingsoft Cloud Network Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Kingsoft Cloud Network Technology Co Ltd filed Critical Beijing Kingsoft Cloud Network Technology Co Ltd
Priority to CN202110580065.8A priority Critical patent/CN113268439A/zh
Publication of CN113268439A publication Critical patent/CN113268439A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0238Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2255Hash tables

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请提供了一种内存地址的查找方法和装置、电子设备和存储介质,其中,该方法包括:从目标内存地址集合中获取到第一内存地址,目标内存地址集合中包含为目标数据库分配的内存地址;在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找,为目标数据库释放的内存地址存储在目标链表中与释放的内存地址的哈希值对应的位置上;在第一位置上未查找到第一内存地址的匹配地址的情况下,确定第一内存地址为未释放的内存地址,第一内存地址的匹配地址为与第一内存地址相同、且未与为目标数据库分配的内存地址匹配过的内存地址。通过本申请,解决了相关技术中内存地址的查找方式存在由于内存地址数量过大导致的查找速度慢的问题。

Description

内存地址的查找方法和装置、电子设备和存储介质
技术领域
本申请涉及互联网技术领域,尤其涉及一种内存地址的查找方法和装置、电子设备和存储介质。
背景技术
目前,在如MySQL(一种关系型数据库管理***)等数据库的业务逻辑(例如,内存缓存的使用)中,查询数据、更新数据等使用的内存空间都是通过malloc(memoryallocation,指动态内存分配函数)分配生成的,即,所有的内存空间都是通过动态申请完成的。
上述业务逻辑使用的都是临时内存,一个事务完成或者一个连接完成之后,会把动态申请的内存空间全部释放(free)掉。在一个事务过程中,有大量的内存申请释放(在10分钟内有百万级别的malloc内存的次数),长期频繁的申请释放会导致大量的内存碎片。以MySQL为例,在使用一段时间之后,MySQL进程占用的内存增长过快,从而影响内存的使用率。
为了提高内存的使用率,可以通过匹配malloc和free的内存地址的方式查找申请之后未被释放的内存,从而对内存使用等提供分析依据。在频繁的malloc与free的过程中,malloc的内存地址中会有大量的重复地址。把malloc与free的内存地址打印后,数量能达到百万级别甚至更多,其中重复地址的数量甚至会达到几万级别。在数万级别的重复地址中,一一过滤掉free的地址,查找速度慢。
由此可见,相关技术中内存地址的查找方式,存在由于内存地址数量过大导致的查找速度慢的问题。
发明内容
本申请提供了一种内存地址的查找方法和装置、电子设备和存储介质,以至少解决相关技术中内存地址的查找方式存在由于内存地址数量过大导致的查找速度慢的问题。
根据本申请实施例的一个方面,提供了一种内存地址的查找方法,包括:从目标内存地址集合中获取到第一内存地址,其中,所述目标内存地址集合中包含为目标数据库分配的内存地址;在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找,其中,为所述目标数据库释放的内存地址存储在所述目标链表中与所述释放的内存地址的哈希值对应的位置上;在所述第一位置上未查找到所述第一内存地址的匹配地址的情况下,确定所述第一内存地址为未释放的内存地址,其中,所述第一内存地址的匹配地址为与所述第一内存地址相同、且未与为所述目标数据库分配的内存地址匹配过的内存地址。
可选地,在所述从目标内存地址集合中获取到第一内存地址之前,所述方法还包括:获取目标日志文件,其中,所述目标日志文件中存储有为所述目标数据库分配内存地址的第一日志和为所述目标数据库释放内存地址的第二日志;将所述第一日志分发到第一日志文件,以及将所述第二日志分发到第二日志文件,其中,所述目标内存地址集合是读取所述第一日志文件得到的,所述目标链表是读取第二日志文件之后生成的。
可选地,所述在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找包括:查找所述目标链表中位于所述第一位置上的第一节点中所存储的内存地址;在所述第一节点中所存储的内存地址与所述第一内存地址不同、且所述第一节点具有关联的第一子链表的情况下,查找所述第一子链表中位于各个位置上的子节点中存储的内存地址,其中,所述第一子链表用于存储为所述目标数据库释放的内存地址中对应的哈希值为所述第一哈希值的内存地址。
可选地,在所述在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找之后,所述方法还包括:在所述第一节点中所存储的内存地址与所述第一内存地址相同的情况下,确定查找到所述第一内存地址的匹配地址;将所述第一节点中所存储的内存地址修改为目标标识;在所述第一子链表中位于第一子位置上的第一子节点中所存储的内存地址与所述第一内存地址相同的情况下,确定查找到所述第一内存地址的匹配地址;将所述第一子节点中存储的内存地址修改为目标标识;其中,所述目标标识用于表示当前节点存储的内存地址已与为所述目标数据库分配的内存地址匹配过。
可选地,在所述查找所述第一子链表中位于各个位置上的子节点中存储的内存地址的过程中,所述方法还包括:在所述第一子链表中位于第二子位置上的第二子节点中所存储的内存地址为所述目标标识的情况下,将所述第二子节点从所述第一子链表中删除。
可选地,在所述在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找之前,所述方法还包括:获取第二内存地址的第二哈希值,其中,所述第二内存地址是为所述目标数据库释放的一个内存地址;在所述目标链表中位于与所述第二哈希值对应的第二位置上的第二节点中存储有第三内存地址的情况下,将所述第二内存地址存储到与所述第二节点关联的第二子链表中,其中,所述第二子链表用于存储为所述目标数据库释放的内存地址中对应的哈希值为所述第二哈希值的内存地址。
可选地,所述第二节点的目标指针指向所述第二子链表的头部节点;所述将所述第二内存地址存储到与所述第二节点关联的第二子链表中包括:将所述第二内存地址存储到第三子节点中,其中,所述第三子节点是为存储所述第二内存地址所生成的节点;将所述第三子节点更新为所述第二子链表的头部节点,并将所述目标指针更新为指向所述第三子节点。
可选地,在所述在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找之后,所述方法还包括:根据所述目标内存地址集合中所有未释放的内存地址,生成目标统计结果,其中,所述目标统计结果用于描述为所述目标数据库分配的内存空间中所有未释放的内存空间。
根据本申请实施例的另一个方面,提供了一种内存地址的查找装置,包括:第一获取单元,用于从目标内存地址集合中获取到第一内存地址,其中,所述目标内存地址集合中包含为目标数据库分配的内存地址;查找单元,用于在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找,其中,为所述目标数据库释放的内存地址存储在所述目标链表中与所述释放的内存地址的哈希值对应的位置上;第一确定单元,用于在所述第一位置上未查找到所述第一内存地址的匹配地址的情况下,确定所述第一内存地址为未释放的内存地址,其中,所述第一内存地址的匹配地址为与所述第一内存地址相同、且未与为所述目标数据库分配的内存地址匹配过的内存地址。
可选地,所述装置还包括:第二获取单元,用于在所述从目标内存地址集合中获取到第一内存地址之前,获取目标日志文件,其中,所述目标日志文件中存储有为所述目标数据库分配内存地址的第一日志和为所述目标数据库释放内存地址的第二日志;分发单元,用于将所述第一日志分发到第一日志文件,以及将所述第二日志分发到第二日志文件,其中,所述目标内存地址集合是读取所述第一日志文件得到的,所述目标链表是读取第二日志文件之后生成的。
可选地,所述查找单元包括:第一查找模块,用于查找所述目标链表中位于所述第一位置上的第一节点中所存储的内存地址;第二查找模块,用于在所述第一节点中所存储的内存地址与所述第一内存地址不同、且所述第一节点具有关联的第一子链表的情况下,查找所述第一子链表中位于各个位置上的子节点中存储的内存地址,其中,所述第一子链表用于存储为所述目标数据库释放的内存地址中对应的哈希值为所述第一哈希值的内存地址。
可选地,所述装置还包括:第二确定单元,用于在所述在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找之后,在所述第一节点中所存储的内存地址与所述第一内存地址相同的情况下,确定查找到所述第一内存地址的匹配地址;将所述第一节点中所存储的内存地址修改为目标标识;第三确定单元,用于在所述第一子链表中位于第一子位置上的第一子节点中所存储的内存地址与所述第一内存地址相同的情况下,确定查找到所述第一内存地址的匹配地址;将所述第一子节点中存储的内存地址修改为目标标识;其中,所述目标标识用于表示当前节点存储的内存地址已与为所述目标数据库分配的内存地址匹配过。
可选地,所述装置还包括:删除单元,用于在所述查找所述第一子链表中位于各个位置上的子节点中存储的内存地址的过程中,在所述第一子链表中位于第二子位置上的第二子节点中所存储的内存地址为所述目标标识的情况下,将所述第二子节点从所述第一子链表中删除。
可选地,所述装置还包括:第三获取单元,用于在所述在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找之前,获取第二内存地址的第二哈希值,其中,所述第二内存地址是为所述目标数据库释放的一个内存地址;存储单元,用于在所述目标链表中位于与所述第二哈希值对应的第二位置上的第二节点中存储有第三内存地址的情况下,将所述第二内存地址存储到与所述第二节点关联的第二子链表中,其中,所述第二子链表用于存储为所述目标数据库释放的内存地址中对应的哈希值为所述第二哈希值的内存地址。
可选地,所述第二节点的目标指针指向所述第二子链表的头部节点;所述存储单元包括:存储模块,用于将所述第二内存地址存储到第三子节点中,其中,所述第三子节点是为存储所述第二内存地址所生成的节点;更新模块,用于将所述第三子节点更新为所述第二子链表的头部节点,并将所述目标指针更新为指向所述第三子节点。
可选地,所述装置还包括:生成单元,用于在所述在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找之后,根据所述目标内存地址集合中所有未释放的内存地址,生成目标统计结果,其中,所述目标统计结果用于描述为所述目标数据库分配的内存空间中所有未释放的内存空间。
根据本申请实施例的又一个方面,还提供了一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器、通信接口和存储器通过通信总线完成相互间的通信;其中,存储器,用于存储计算机程序;处理器,用于通过运行所述存储器上所存储的所述计算机程序来执行上述任一实施例中的方法步骤。
根据本申请实施例的又一个方面,还提供了一种计算机可读的存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一实施例中的方法步骤。
在本申请实施例中,采用使用链表按照哈希值保存为数据库释放的内存地址的方式,通过从目标内存地址集合中获取到第一内存地址,其中,目标内存地址集合中包含为目标数据库分配的内存地址;在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找,其中,为目标数据库释放的内存地址存储在目标链表中与释放的内存地址的哈希值对应的位置上;在第一位置上未查找到第一内存地址的匹配地址的情况下,确定第一内存地址为未释放的内存地址,其中,第一内存地址的匹配地址为与第一内存地址相同、且未与为目标数据库分配的内存地址匹配过的内存地址,由于将为数据库释放的内存地址按照哈希值保存到链表中,从而可以实现减少查找内存地址所需查找的内存地址的数量的目的,达到了提高内存地址的查找速度的技术效果,进而解决了相关技术中内存地址的查找方式存在由于内存地址数量过大导致的查找速度慢的问题。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是根据本申请实施例的一种可选的内存地址的查找方法的硬件环境的示意图;
图2是根据本申请实施例的一种可选的内存地址的查找方法的流程示意图;
图3是根据本申请实施例的一种可选的内存地址的查找方法的示意图;
图4是根据本申请实施例的另一种可选的内存地址的查找方法的示意图;
图5是根据本申请实施例的另一种可选的内存地址的查找方法的流程示意图;
图6是根据本申请实施例的一种可选的内存地址的查找装置的结构框图;
图7是根据本申请实施例的一种可选的电子设备的结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、***、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
根据本申请实施例的一个方面,提供了一种内存地址的查找方法。可选地,在本实施例中,上述内存地址的查找方法可以应用于如图1所示的由终端102和服务器104所构成的硬件环境中。如图1所示,服务器104通过网络与终端102进行连接,可用于为终端或终端上安装的客户端提供服务(如游戏服务、应用服务等),可在服务器上或独立于服务器设置数据库,用于为服务器104提供数据存储服务。
上述网络可以包括但不限于以下至少之一:有线网络,无线网络。上述有线网络可以包括但不限于以下至少之一:广域网,城域网,局域网,上述无线网络可以包括但不限于以下至少之一:WIFI(Wireless Fidelity,无线保真),蓝牙。终端102可以并不限定于为PC、手机、平板电脑等。
本申请实施例的内存地址的查找方法可以由服务器104来执行,也可以由终端102来执行,还可以是由服务器104和终端102共同执行。其中,终端102执行本申请实施例的内存地址的查找方法也可以是由安装在其上的客户端来执行。
以由服务器104来执行本实施例中的内存地址的查找方法为例,图2是根据本申请实施例的一种可选的内存地址的查找方法的流程示意图,如图2所示,该方法的流程可以包括以下步骤:
步骤S202,从目标内存地址集合中获取到第一内存地址,其中,目标内存地址集合中包含为目标数据库分配的内存地址。
本实施例中的内存地址的查找方法可以应用于从为数据库分配的内存地址中查找未释放的内存地址的场景,例如,在为MySQL等数据库malloc的内存地址中查找未free的内存地址的场景。本实施例中以应用于数据库(例如,MySQL)中检测malloc内存后是否释放为例进行说明,对于其他类似的场景,本实施例中的内存地址的查找方法同样适用。
目标设备可以首先获取目标内存地址集合(例如,把malloc的内存地址加载到内存),该目标内存地址集合包含为目标数据库分配的内存地址。目标设备可以是目标服务器,例如,数据库服务器,其可以是运行目标数据库的数据库应用程序的数据库服务器。
目标内存地址集合包含的可以是某一时间段内为目标数据库分配的内存地址,例如,目标内存地址集合可以包含在目标时间段内为目标数据库分配的内存地址,又例如,目标内存地址集合可以包含在目标时间段内为目标数据库分配的内存地址、以及在目标时间段的前一个时间段内剩余未匹配的、为目标数据库分配的内存地址。
对于目标内存地址集合中的各个内存地址,目标设备可以依次判断为目标数据库释放的内存地址中是否存在与其匹配的内存地址。例如,目标设备可以从目标内存地址集合中获取到第一内存地址,该第一内存地址可以是目标内存地址集合中的任意一个内存地址。
步骤S204,在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找,其中,为目标数据库释放的内存地址存储在目标链表中与释放的内存地址的哈希值对应的位置上。
在目标设备上可以使用目标链表存储为目标数据库释放的内存地址,为目标数据库释放的各个内存地址可以存储在目标链表中与释放的内存地址的哈希值对应的位置上。目标链表中的一个位置上可以为目标链表的一个节点。目标链表中的一个位置上可以存储有一个或多个为目标数据库释放的内存地址,也可以未存储有内存地址。
可选地,也可以通过目标数组存储为目标数据库释放的内存地址,存储的方式也可以是:为目标数据库释放的内存地址存储在目标数据中与释放的内存地址的哈希值对应的位置上,相对于数组,通过链表存放内存地址具有更高的操作灵活性。
这里,当一个位置上存储的内存地址为多个时,多个内存地址可以是相同的内存地址,也可以是不同的内存地址。同一位置上的多个内存地址可以通过目标分隔符(例如,空格,星号等)进行分隔保存,也可以通过子链表的方式进行保存,对应地,目标链表中的每个位置上的节点以及子链表中的每个子位置上的子节点中可以仅保存一个内存地址。
对于第一内存地址,目标设备可以首先对该第一内存地址进行哈希计算,得到第一哈希值。第一哈希值可以是第一内存地址对于目标值进行哈希取余所得到的哈希值,目标值为目标链表中包含的节点的总数量。每个哈希值可以对应于目标链表中的一个位置,目标设备可以在目标链表中与第一哈希值对应的第一位置上进行查找,例如,在目标链表中以第一哈希值为下标的第一位置上进行查找。
步骤S206,在第一位置上未查找到第一内存地址的匹配地址的情况下,确定第一内存地址为未释放的内存地址,其中,第一内存地址的匹配地址为与第一内存地址相同、且未与为目标数据库分配的内存地址匹配过的内存地址。
由于频繁的内存申请和释放,为目标数据库分配的内存地址可以有多个重复地址,而为目标数据库释放的内存地址也可以有多个重复地址,目标设备可以确定从第一位置上是否查找到第一内存地址的匹配地址,即,与第一内存地址相同、且未与为目标数据库分配的内存地址匹配过的内存地址。
如果在第一位置上查找到第一内存地址的匹配地址,目标设备可以将该第一内存地址的匹配地址标记为已匹配状态,例如,将该第一内存地址的匹配地址更新为目标标识、或者、在该第一内存地址的匹配地址之前或者之后添加特定标识(例如,添加0),以标识该内存地址已与为目标数据库分配的内存地址匹配过。
如果在第一位置上未查找到第一内存地址的匹配地址,目标设备可以确定该第一内存地址为未释放的内存地址,并打印该第一内存地址。打印内存地址的方式可以是异步输出到目标日志中,该目标日志可以是磁盘中的日志,也可以是内存中的日志。
在第一内存地址之后,如果目标内存地址集合中还存在其他的内存地址,目标设备可以采用类似的方式确定该内存地址是否是未释放的内存地址。在目标内存地址集合中所有的内存地址均已完成匹配之后,目标设备可以获取到目标内存地址集合中所有未释放的内存地址。
通过上述步骤S202至步骤S206,从目标内存地址集合中获取到第一内存地址,其中,目标内存地址集合中包含为目标数据库分配的内存地址;在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找,其中,为目标数据库释放的内存地址存储在目标链表中与释放的内存地址的哈希值对应的位置上;在第一位置上未查找到第一内存地址的匹配地址的情况下,确定第一内存地址为未释放的内存地址,其中,第一内存地址的匹配地址为与第一内存地址相同、且未与为目标数据库分配的内存地址匹配过的内存地址,解决了相关技术中内存地址的查找方式存在由于内存地址数量过大导致的查找速度慢的问题,提高了内存地址的查找速度。
作为一种可选的实施例,在从目标内存地址集合中获取到第一内存地址之前,上述方法还包括:
S11,获取目标日志文件,其中,目标日志文件中存储有为目标数据库分配内存地址的第一日志和为目标数据库释放内存地址的第二日志;
S12,将第一日志分发到第一日志文件,以及将第二日志分发到第二日志文件,其中,目标内存地址集合是读取第一日志文件得到的,目标链表是读取第二日志文件之后生成的。
在本实施例中,可以增加为目标数据库分配内存地址操作的日志(即,第一日志)以及为目标数据库释放内存地址操作的日志(即,第二日志)。开始输出的所有日志在一个日志文件(即,目标日志文件)中,目标设备可以首先获取目标日志文件。
所有日志在一个日志文件中时不方便进行查找。为了提高查找的速度,目标设备可以将第一日志和第二日志分发到不同的日志文件中,即,将第一日志分发到第一日志文件,以及将第二日志分发到第二日志文件。
日志分发以是依据日志中包含的关键字执行的,第一日志中可以包含与内存地址分发对应的第一关键字,第二日志可以包含与内存地址释放对应的第二关键字,目标设备可以将目标日志文件中具有第一关键字的日志分发到第一日志文件中,将目标日志文件中具有第二关键字的日志分发到第二日志文件中,从而得到第一日志文件和第二日志文件。
目标内存地址集合可以是读取第一日志文件得到的,例如,可以将第一日志文件读取到内存,得到第一内存地址集合(即,上述目标内存地址集合)。而目标链表是读取第二日志文件之后生成的,例如,可以将第二日志文件读取到内存,得到第二内存地址集合,该第二内存地址集合包含为目标数据库分配的内存地址;将第二内存地址集合中的内存地址存储到目标链表中与其哈希值对应的位置上,得到目标链表。
示例性地,在数据库程序中可以增加malloc与free操作内存地址的日志,在数据库程序中可以首先打印malloc与free的内存地址。这里,malloc的打印格式包含线程地址thread、类型malloc、内存在数据库中的模块类型key、申请内存的大小size和申请内存的地址ptr,free的打印格式包含线程地址thread、类型free和申请内存的地址ptr。
例如,对于一个malloc的内存地址,其线程地址thread=7fffec218700,类型为malloc,内存在数据库中的模块类型key=154,申请内存的大小size=8224,申请内存的地址ptr=7ff4b400edd0,则打印的malloc的内存地址如下:
thread=7fffec218700malloc key=154size=8224ptr=7ff4b400edd0
又例如,对于一个free的内存地址,其线程地址thread=7fffec218700,类型为free,申请内存的地址ptr=7ff4b4007af0,则打印的free的内存地址如下:
thread=7fffec218700free ptr=7ff4b4007af0
对于打印的malloc与free的内存地址,可以把malloc与free的日志分发的不同的文件,例如,可以通过malloc与free关键字,把对应的日志分发到不同的文件中,可以生成malloc.txt和free.txt两个文件。在日志分发之后,可以把malloc的内存地址加载到内存,把free的内存地址加载到内存,例如,把malloc.txt和free.txt一次性读取到内存,目的是解析文件更快。
通过本实施例,通过把为数据库分配内存地址的日志和为数据库释放内存地址的日志分发到不同的文件中,可以方便进行日志处理,提高内存地址查找的便捷性。
作为一种可选的实施例,在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找包括:
S21,查找目标链表中位于第一位置上的第一节点中所存储的内存地址;
S22,在第一节点中所存储的内存地址与第一内存地址不同、且第一节点具有关联的第一子链表的情况下,查找第一子链表中位于各个位置上的子节点中存储的内存地址,其中,第一子链表用于存储为目标数据库释放的内存地址中对应的哈希值为第一哈希值的内存地址。
在本实施例中,哈希值相同的内存地址可以通过子链表的方式进行保存。在查找第一位置时,目标设备可以首先查找目标链表中位于第一位置上的第一节点中所存储的内存地址。如果第一节点中所存储的内存地址与第一内存地址相同,目标设备可以直接将其确定为该第一内存地址的匹配地址,或者,目标设备也可以基于其他标识进一步确定其是否是第一内存地址的匹配地址。
例如,可以把free的内存地址计算为hash值,存储在hash链表(目标链表的一种示例)中。定义hash链表中存储内存地址的结构体如下:
Figure BDA0003085819270000121
如果第一节点中所存储的内存地址与第一内存地址不同、且第一节点具有关联的第一子链表(目标链表为主链表,目标链表中节点所关联的子链表为从链表),目标设备可以继续查找第一子链表中位于各个位置上的子节点中存储的内存地址,确定其是否与第一内存地址相同且未与其他为目标数据库分配的内存地址匹配过。
需要说明的是,如果第一节点中所存储的内存地址与第一内存地址相同、但该内存地址已与为目标数据库分配的内存地址匹配过,也可以继续查找第一子链表中位于各个位置上的子节点中存储的内存地址。
通过本实施例,使用链表存放哈希值相同的内存地址,可以提高内存地址存储的便捷性。
作为一种可选的实施例,在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找之后,上述方法还包括:
S31,在第一节点中所存储的内存地址与第一内存地址相同的情况下,确定查找到第一内存地址的匹配地址;将第一节点中所存储的内存地址修改为目标标识;
S32,在第一子链表中位于第一子位置上的第一子节点中所存储的内存地址与第一内存地址相同的情况下,确定查找到第一内存地址的匹配地址;将第一子节点中存储的内存地址修改为目标标识;
其中,目标标识用于表示当前节点存储的内存地址已与为目标数据库分配的内存地址匹配过。
为了方便确定目标链表中的匹配地址是否已与为目标地址分配的内存地址匹配过,可以将已匹配过的内存地址修改为特定标识,例如,目标标识,目标标识用于表示当前节点存储的内存地址已与为目标数据库分配的内存地址匹配过。
如果第一节点中所存储的内存地址与第一内存地址相同,则可以确定查找到第一内存地址的匹配地址,并将第一节点中所存储的内存地址修改为目标标识。否则,如果第一节点中所存储的内存地址与第一内存地址不同、且第一节点具有关联的第一子链表,则可以继续查找该第一子链表,直到查找到与第一内存地址相同的内存地址,或者,查找完第一子链表中的所有子位置。
如果在第一子链表中位于第一子位置上的第一子节点中所存储的内存地址与第一内存地址相同,则可以确定查找到第一内存地址的匹配地址。并且,目标设备可以将第一子节点删除,或者,将第一子节点中存储的内存地址修改为目标标识,而不执行节点删除操作。
通过本实施例,将已与为数据库分配的内存地址匹配过的内存地址修改为特定标识,可以提高内存地址查找的效率。
作为一种可选的实施例,在查找第一子链表中位于各个位置上的子节点中存储的内存地址的过程中,上述方法还包括:
S41,在第一子链表中位于第二子位置上的第二子节点中所存储的内存地址为目标标识的情况下,将第二子节点从第一子链表中删除。
为了减少对内存的占用、以及所需查找的内存地址数量,可以将第一子链表中已与为数据库分配的内存地址匹配过的内存地址所在的节点删除。而对于目标链表中的节点,由于其可能需要与子链表关联,为了链表操作的便捷性,可以无论其是否具有关联的子链表,均不删除目标链表中的节点。
为了与目标链表保持一致,同时方便编程(不需要校验节点属于主链表还是从链表,在从链表需要循环遍历),对于子链表中的节点,可以在第一次查找到匹配的内存地址时仅将其修改为目标标识,不删除节点,而在之后遍历的过程中,如果在子链表中位于某一子位置上的子节点中所存储的内存地址为目标标识时,将该子节点从子链表中删除。例如,如果第一子链表中位于第二子位置上的第二子节点中所存储的内存地址为目标标识,目标设备可以将第二子节点从第一子链表中删除。
可选地,在查找第一节点中存储的内存地址以及第一子链表中位于各个位置上的子节点中存储的内存地址的过程中,在第一次查找到目标标识时,由于其可能是目标链表中的节点所存储的内存地址,可以忽略该目标标识,在第二次查找到目标标识时,将存储该目标标识的节点(其一定是存储在某一子节点中)删除。
示例性地,对于如图3中所示的哈希链表,hash链表的长度为17,即,hash链表的大小为17*sizeof(NODEFREE),其序号为14的位置上的节点具有关联的从链表,该从链表包含4个从节点。在进行内存地址查找时,计算malloc的内存地址的hash值,去hash链表中查找,如果查询到则说明此地址已经free,如果未查询到说明此地址未free,则可以打印此内存地址。
例如,查找7ff4b4012120,计算此内存地址的哈希值为5(7ff4b4012120%17),则在序号为5的位置查找,查看该位置存储的地址是否为7ff4b4012120,可以找到此地址,不打印信息。此外,其存储的内存地址可以修改为0(目标标识的一种示例)。
再查找7ff4b4010ff0,计算此内存地址的哈希值为8(7ff4b4010ff0%17),则在序号为8的位置查找,查看此位置存储的地址是否为7ff4b4010ff0,未找到此地址,且没有从链表,说明此7ff4b4010ff0未释放,打印此记录。
再查找7ff4b4011d60,计算此内存地址的哈希值为14(7ff4b4010ff0%17),则在序号为14的位置查找,查看此位置存储的地址是否为7ff4b4011d60,可以找到此地址,则该位置存储的地址修改为0,因为此值为hash链表,不清空。
第二次查找7ff4b4011d60,计算此内存地址的哈希值为14,在序号为14的位置查找。由于hash链表中存储的地址已修改为0,则不相等,查找下一个节点(从链表中的节点),查看此位置存储的地址是否为7ff4b4011d60,图3中标号为4的节点符合查询条件,则将该节点存储的地址修改为0,本次不修改链表。
第三次查找7ff4b4011d60,计算此内存地址的哈希值为14,在序号为14的位置查找。由于hash链表中存储的地址已修改为0,不相等,继续查找。第二个节点存储的地址为0,则把此节点删除掉(例如,将hash链表中存储节点的next指针指向删除节点的下一个节点),继续遍历下一个节点(即,图3中标号为3的节点),判断存储地址是否为7ff4b4011d60,可以找到此地址,则将该节点存储的地址修改为0。
这里,把地址项赋值为0是为了与主hash链表保持一致(编程统一),由于主hash链表因无法释放空间,需要把地址清0。此外,把地址项赋值为0还是为了编程方便,不需要校验节点属于主链表还是从链表(在从链表需要循环遍历),而只需第二次遍历遇到0即可判断是否为主链表。
通过本实施例,在遍历从链表时将从链表中存储的内存地址为目标标识的节点删除,可以减少对内存的占用,同时可以减少所需查找的内存地址数量,提高内存地址查找的效率。
作为一种可选的实施例,在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找之前,上述方法还包括:
S51,获取第二内存地址的第二哈希值,其中,第二内存地址是为目标数据库释放的一个内存地址;
S52,在目标链表中位于与第二哈希值对应的第二位置上的第二节点中存储有第三内存地址的情况下,将第二内存地址存储到与第二节点关联的第二子链表中,其中,第二子链表用于存储为目标数据库释放的内存地址中对应的哈希值为第二哈希值的内存地址。
在进行内存地址查找之前,可以将为目标数据库释放的内存地址存储到目标链表(以及目标链表的从链表中)。第二内存地址集合包含为目标数据库释放的内存地址,例如,在目标时间段内为目标数据库释放的内存地址。目标设备可以从第二内存地址集合中获取一个内存地址,得到第二内存地址,该第二内存地址可以是为目标数据库释放的任意一个内存地址。
目标设备可以获取第二内存地址的第二哈希值,第二哈希值可以是第二内存地址对于目标值进行哈希取余所得到的哈希值,目标值为目标链表中包含的节点的总数量。每个哈希值可以对应于目标链表中的一个位置,该第二哈希值与目标链表中的第二位置对应,例如,第二位置是目标链表中以第二哈希值为下标的位置,而目标链表中位于第二位置上的节点为第二节点。目标设备可以首先确定第二节点中是否存储有某一内存地址。
如果第二节点中未存储有某一内存地址,目标设备可以将第二内存地址存储到第二节点中。如果第二节点中存储有第三内存地址,标识为目标数据库释放的内存地址中,对应的哈希值为第二哈希值的内存地址至少包括两个(第二内存地址,第三内存地址),可以通过从链表的方式存储多个内存地址。这里,第二内存地址与第三内存地址可以是相同的内存地址,也可以是不同的内存地址,本实施例中对此不做限定。
与第二节点关联的从链表为第二子链表,该第二子链表用于存储为目标数据库释放的内存地址中对应的哈希值为第二哈希值的内存地址。目标设备可以将第二内存地址存储到该第二子链表中。例如,可以在第二子链表的尾部添加新的子节点,将第二内存地址添加到新的子节点中。
通过本实施例,使用链表存放哈希值相同的内存地址,可以提高内存地址存储的便捷性。
作为一种可选的实施例,第二节点的目标指针指向第二子链表的头部节点。目标链表中可以采用如前述相同或者类似的结构体保存内存地址,目标链表的每个节点中可以通过目标指针(例如,next指针)指向与本节点关联的从链表的头部节点。对应地,将第二内存地址存储到与第二节点关联的第二子链表中包括:
S61,将第二内存地址存储到第三子节点中,其中,第三子节点是为存储第二内存地址所生成的节点;
S62,将第三子节点更新为第二子链表的头部节点,并将目标指针更新为指向第三子节点。
在将第二内存地址存储到第二子链表中时,可以将存储该第二内存地址的、新的子节点添加到第二子链表的头部。可选地,可以将第二内存地址存储到第三子节点中,该第三子节点是为存储第二内存地址所生成的节点,其可以是新分配的一块内存;然后,将第三子节点更新为第二子链表的头部节点,并将目标指针更新为指向第三子节点。
例如,可以新malloc一块内存(nodeHash->next,nodeHash为主链表中的节点)存储当前地址:
nodetmp=nodeHash->next;
nodeHash=nodeHash->next=(NODEFREE*)malloc(sizeof(NODEFREE));
nodeHash->next=nodetmp;
每次新申请的节点在hash链表中的节点后的第一个节点,即,最后***的节点一直在hash链表中的节点后的第一个节点,避免了链表的遍历,***效率为O(1)。
示例性地,可以通过遍历free文件(例如,free.txt,第二日志文件的一种示例)在内存的中数据,完成hash链表的初始化。在初始化hash链表,hash链表的长度为17,free的内存地址使用hash链表的长度求余,计算出内存地址存储的位置。
比如,存放7ff4b4012120,计算此内存地址的哈希值为5(7ff4b4012120%17),则此内存地址存储在hash链表中序号为5的空间内。再存放7ff4b4011d60,计算此内存地址的哈希值为14(7ff4b4011d60%17),存储在序号为14的空间(nodeHash)内。
如果有多个地址7ff4b4011d60,序号为14的位置会形成一个链表(从链表)。当第二个free的内存地址7ff4b4011d60存入时,可以新malloc一块内存存储当前地址,新malloc的内存的***方式可以是:将最后***的节点一直在hash链表中的节点后的第一个节点。如图4所示,序号为14的位置上形成链表中,标号为1、2、3和4的节点添加顺序与标号的顺序相同。
通过本实施例,通过将最后***的节点一直在主链表中的节点后的第一个节点(即,从链表的头部节点),可以提高节点的***效率。
可选地,在本实施例中,在查找完目标内存地址集合中的所有内存地址之后,可以释放为进行内存地址查找所申请的地址空间。例如,在运行完成后释放申请的地址空间,可以包括但不限于:释放目标链表(例如,hash链表)的空间,释放重复节点的空间,重复节点通过next形成一个链表依次释放。
作为一种可选的实施例,在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找之后,上述方法还包括:
S71,根据目标内存地址集合中所有未释放的内存地址,生成目标统计结果,其中,目标统计结果用于描述为目标数据库分配的内存空间中所有未释放的内存空间。
在查找完目标内存地址集合中的所有内存地址之后,目标设备可以获取到所有未释放的内存地址。目标设备可以统计与每个未释放的内存地址对应的内存空间,确定出为目标数据库分配的内存空间中所有未释放的内存空间,从而得到目标统计结果,该目标统计结果中可以但不限于包含以下至少之一的信息:内存空间的大小,内存空间的种类。
由于每个未释放的内存地址是与申请的内存空间对应的,在为不同的线程分配内存空间时,由于申请的内存大小不同,即使分配的内存地址相同,为不同的线程分配的内存空间也可能是不同的。由于内存空间之后被释放之后才能被再次分配,通过记录为目标数据库分配内存地址操作的日志(即,第一日志)的先后顺序,目标设备可以确定出与未释放的内存地址所对应的未释放的内存空间,即,最后一次分配该内存地址的日志所指示的内存空间。
通过本实施例,通过生成用于描述为数据库分配的内存空间中所有未释放的内存空间的统计结果,可以便于对内存空间进行分析处理,进而提高内存空间的使用率。
下面结合可选示例对本申请实施例中的内存地址的查找方法进行解释说明。在本示例中,目标数据库为MySQL。
本示例中的内存地址的查找方法是一种数据库中检测malloc内存后是否释放的方案,通过增加malloc与free操作内存地址的日志后通过hash加链表的方式,在百万、千万级别内存地址中,通过查找性能为O(N)速度,查询出未free的内存地址,检测内存泄漏与内存的使用及使用量。
如图5所示,本可选示例中的内存地址的查找方法的流程可以包括以下步骤:
步骤S502,在数据库程序中打印malloc与free的内存地址;
步骤S504,把malloc与free的日志分发到不同的文件(malloc.txt和free.txt);
步骤S506,把malloc的内存地址加载到内存,以及把free的内存地址加载到内存;
步骤S508,把free的内存地址计算为hash值,存放的hash链表中;
步骤S510,把malloc的内存地址以同样的方式计算为hash值,去hash链表查找,如果查询到则说明此地址已经free,如果未查询到说明此地址未free。
运行完成后,可以释放申请的地址空间,并统计未释放的内存空间、大小和种类等。
通过本示例,通过hash链表存放free地址,将重复地址以链表存放,将最后的节点存放在链表的头部,并在查找链表重复的地址时,先把头部地址修改为0,下次遍历再删除,可以在百万及更多能快速完成匹配查找(查找性能为O(1))。
根据本申请实施例的另一个方面,还提供了一种内存地址的查找方法,本实施例中所提供的内存地址的查找方法与前述类似,区别在于:使用链表存储的是为目标数据库分配的内存地址,而查找的是为目标数据库释放的内存地址。
可选地,在本实施例中,上述内存地址的查找方法可以包括以下步骤:从目标地址集合(与前述第二内存地址集合类似)中依次获取各个内存地址,得到第一目标地址(第一目标地址是目标地址集合中的任一个内存地址),其中,目标地址集合中包含为目标数据库释放的内存地址;在目标地址链表中与第一目标地址的第一目标哈希值对应的第一目标位置上进行查找,其中,为目标数据库分配的内存地址存储在目标地址链表中与分配的内存地址的哈希值对应的位置上;确定第一目标位置上第一目标地址的匹配地址,其中,第一目标地址的匹配地址为与第一目标地址相同、且未与为目标数据库释放的内存地址匹配过的内存地址;将目标地址链表中未与为目标数据库释放的内存地址匹配过的内存地址,确定为未释放的内存地址。
可选地,在从目标地址集合中依次获取各个内存地址之前,该方法还包括:获取目标日志文件,其中,目标日志文件中存储有为目标数据库分配内存地址的第一日志和为目标数据库释放内存地址的第二日志;将第一日志分发到第一日志文件,以及将第二日志分发到第二日志文件,其中,目标地址集合是读取第二日志文件得到的,目标地址链表是读取第一日志文件之后生成的。
可选地,在目标地址链表中与第一目标地址的哈希值对应的第一目标位置上进行查找包括:查找目标地址链表中位于第一目标位置上的第一目标节点中所存储的内存地址;在第一目标节点中所存储的内存地址与第一目标地址不同的情况下,查找第一目标子链表中位于各个位置上的子节点中存储的内存地址,其中,第一目标子链表是与第一目标节点具有关联的子链表,第一目标子链表用于存储为目标数据库分配的内存地址中对应的哈希值为第一目标哈希值的内存地址。
可选地,在目标地址链表中与第一目标地址的哈希值对应的第一目标位置上进行查找之后,上述方法还包括:在第一目标节点中所存储的内存地址与第一目标地址相同的情况下,确定查找到第一目标地址的匹配地址;将第一目标节点中所存储的内存地址修改为目标地址标识;在第一目标子链表中位于第一目标子位置上的第一目标子节点中所存储的内存地址与第一目标地址相同的情况下,确定查找到第一目标地址的匹配地址;将第一目标子节点中存储的内存地址修改为目标地址标识;其中,目标地址标识用于表示当前节点存储的内存地址已与为目标数据库释放的内存地址匹配过。
可选地,在查找第一目标子链表中位于各个位置上的子节点中存储的内存地址的过程中,该方法还包括:在第一目标子链表中位于第二目标子位置上的第二目标子节点中所存储的内存地址为目标地址标识的情况下,将第二目标子节点从第一目标子链表中删除。
可选地,在目标地址链表中与第一目标地址的哈希值对应的第一目标位置上进行查找之前,上述方法还包括:获取第二目标地址的第二目标哈希值,其中,第二目标地址是为目标数据库分配的一个内存地址;在目标地址链表中位于与第二目标哈希值对应的第二目标位置上的第二目标节点中存储有第三目标地址的情况下,将第二目标地址存储到与第二目标节点关联的第二目标子链表中,其中,第二目标子链表用于存储为目标数据库分配的内存地址中对应的哈希值为第二目标哈希值的内存地址,其中,第三目标地址为为目标数据库分配的一个内存地址。
可选地,第二目标节点的目标节点指针指向第二目标子链表的头部节点;将第二目标地址存储到与第二目标节点关联的第二目标子链表中包括:将第二目标地址存储到第三目标子节点中,其中,第三目标子节点是为存储第二目标地址所生成的节点;将第三目标子节点更新为第二目标子链表的头部节点,并将目标节点指针更新为指向第三目标子节点。
可选地,在将目标地址链表中未与为目标数据库释放的内存地址匹配过的内存地址,确定为未释放的内存地址之后,上述方法还包括:根据未释放的内存地址,生成目标查找结果,其中,目标查找结果用于描述为目标数据库分配的内存空间中未释放的内存空间。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM(Read-Only Memory,只读存储器)/RAM(Random Access Memory,随机存取存储器)、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。
根据本申请实施例的另一个方面,还提供了一种用于实施上述内存地址的查找方法的内存地址的查找装置。图6是根据本申请实施例的一种可选的内存地址的查找装置的结构框图,如图6所示,该装置可以包括:
第一获取单元602,用于从目标内存地址集合中获取到第一内存地址,其中,目标内存地址集合中包含为目标数据库分配的内存地址;
查找单元604,与第一获取单元602相连,用于在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找,其中,为目标数据库释放的内存地址存储在目标链表中与释放的内存地址的哈希值对应的位置上;
第一确定单元606,与查找单元604相连,用于在第一位置上未查找到第一内存地址的匹配地址的情况下,确定第一内存地址为未释放的内存地址,其中,第一内存地址的匹配地址为与第一内存地址相同、且未与为目标数据库分配的内存地址匹配过的内存地址。
需要说明的是,该实施例中的第一获取单元602可以用于执行上述步骤S202,该实施例中的查找单元604可以用于执行上述步骤S204,该实施例中的第一确定单元606可以用于执行上述步骤S206。
通过上述模块,从目标内存地址集合中获取到第一内存地址,目标内存地址集合中包含为目标数据库分配的内存地址;在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找,为目标数据库释放的内存地址存储在目标链表中与释放的内存地址的哈希值对应的位置上;在第一位置上未查找到第一内存地址的匹配地址的情况下,确定第一内存地址为未释放的内存地址,第一内存地址的匹配地址为与第一内存地址相同、且未与为目标数据库分配的内存地址匹配过的内存地址,解决了相关技术中内存地址的查找方式存在由于内存地址数量过大导致的查找速度慢的问题,提高了内存地址的查找速度。
作为一种可选的实施例,上述装置还包括:
第二获取单元,用于在从目标内存地址集合中获取到第一内存地址之前,获取目标日志文件,其中,目标日志文件中存储有为目标数据库分配内存地址的第一日志和为目标数据库释放内存地址的第二日志;
分发单元,用于将第一日志分发到第一日志文件,以及将第二日志分发到第二日志文件,其中,目标内存地址集合是读取第一日志文件得到的,目标链表是读取第二日志文件之后生成的。
作为一种可选的实施例,查找单元604包括:
第一查找模块,用于查找目标链表中位于第一位置上的第一节点中所存储的内存地址;
第二查找模块,用于在第一节点中所存储的内存地址与第一内存地址不同、且第一节点具有关联的第一子链表的情况下,查找第一子链表中位于各个位置上的子节点中存储的内存地址,其中,第一子链表用于存储为目标数据库释放的内存地址中对应的哈希值为第一哈希值的内存地址。
作为一种可选的实施例,上述装置还包括:
第二确定单元,用于在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找之后,在第一节点中所存储的内存地址与第一内存地址相同的情况下,确定查找到第一内存地址的匹配地址;将第一节点中所存储的内存地址修改为目标标识;
第三确定单元,用于在第一子链表中位于第一子位置上的第一子节点中所存储的内存地址与第一内存地址相同的情况下,确定查找到第一内存地址的匹配地址;将第一子节点中存储的内存地址修改为目标标识;
其中,目标标识用于表示当前节点存储的内存地址已与为目标数据库分配的内存地址匹配过。
作为一种可选的实施例,上述装置还包括:
删除单元,用于在查找第一子链表中位于各个位置上的子节点中存储的内存地址的过程中,在第一子链表中位于第二子位置上的第二子节点中所存储的内存地址为目标标识的情况下,将第二子节点从第一子链表中删除。
作为一种可选的实施例,上述装置还包括:
第三获取单元,用于在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找之前,获取第二内存地址的第二哈希值,其中,第二内存地址是为目标数据库释放的一个内存地址;
存储单元,用于在目标链表中位于与第二哈希值对应的第二位置上的第二节点中存储有第三内存地址的情况下,将第二内存地址存储到与第二节点关联的第二子链表中,其中,第二子链表用于存储为目标数据库释放的内存地址中对应的哈希值为第二哈希值的内存地址。
作为一种可选的实施例,第二节点的目标指针指向第二子链表的头部节点;存储单元包括:
存储模块,用于将第二内存地址存储到第三子节点中,其中,第三子节点是为存储第二内存地址所生成的节点;
更新模块,用于将第三子节点更新为第二子链表的头部节点,并将目标指针更新为指向第三子节点。
作为一种可选的实施例,上述装置还包括:
生成单元,用于在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找之后,根据目标内存地址集合中所有未释放的内存地址,生成目标统计结果,其中,目标统计结果用于描述为目标数据库分配的内存空间中所有未释放的内存空间。
此处需要说明的是,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现,其中,硬件环境包括网络环境。
根据本申请实施例的又一个方面,还提供了一种用于实施上述内存地址的查找方法的电子设备,该电子设备可以是服务器、终端、或者其组合。
图7是根据本申请实施例的一种可选的电子设备的结构框图,如图7所示,包括处理器702、通信接口704、存储器706和通信总线708,其中,处理器702、通信接口704和存储器706通过通信总线708完成相互间的通信,其中,
存储器706,用于存储计算机程序;
处理器702,用于执行存储器706上所存放的计算机程序时,实现如下步骤:
从目标内存地址集合中获取到第一内存地址,其中,目标内存地址集合中包含为目标数据库分配的内存地址;
在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找,其中,为目标数据库释放的内存地址存储在目标链表中与释放的内存地址的哈希值对应的位置上;
在第一位置上未查找到第一内存地址的匹配地址的情况下,确定第一内存地址为未释放的内存地址,其中,第一内存地址的匹配地址为与第一内存地址相同、且未与为目标数据库分配的内存地址匹配过的内存地址。
可选地,在本实施例中,上述的通信总线可以是PCI(Peripheral ComponentInterconnect,外设部件互连标准)总线、或EISA(Extended Industry StandardArchitecture,扩展工业标准结构)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。为便于表示,图7中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。通信接口用于上述电子设备与其他设备之间的通信。
存储器可以包括RAM,也可以包括非易失性存储器(non-volatile memory),例如,至少一个磁盘存储器。可选地,存储器还可以是至少一个位于远离前述处理器的存储装置。
作为一种示例,上述存储器706中可以但不限于包括上述内存地址的查找装置中的第一获取单元602、查找单元604以及第一确定单元606。此外,还可以包括但不限于上述内存地址的查找装置中的其他模块单元,本示例中不再赘述。
上述处理器可以是通用处理器,可以包含但不限于:CPU(Central ProcessingUnit,中央处理器)、NP(Network Processor,网络处理器)等;还可以是DSP(DigitalSignal Processing,数字信号处理器)、ASIC(Application Specific IntegratedCircuit,专用集成电路)、FPGA(Field-Programmable Gate Array,现场可编程门阵列)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例在此不再赘述。
本领域普通技术人员可以理解,图7所示的结构仅为示意,实施上述内存地址的查找方法的设备可以是终端设备,该终端设备可以是智能手机(如Android手机、iOS手机等)、平板电脑、掌上电脑以及移动互联网设备(Mobile Internet Devices,MID)、PAD等终端设备。图7其并不对上述电子设备的结构造成限定。例如,电子设备还可包括比图7中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图7所示的不同的配置。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、ROM、RAM、磁盘或光盘等。
根据本申请实施例的又一个方面,还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于执行本申请实施例中上述任一项内存地址的查找方法的程序代码。
可选地,在本实施例中,上述存储介质可以位于上述实施例所示的网络中的多个网络设备中的至少一个网络设备上。
可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:
从目标内存地址集合中获取到第一内存地址,其中,目标内存地址集合中包含为目标数据库分配的内存地址;
在目标链表中与第一内存地址的第一哈希值对应的第一位置上进行查找,其中,为目标数据库释放的内存地址存储在目标链表中与释放的内存地址的哈希值对应的位置上;
在第一位置上未查找到第一内存地址的匹配地址的情况下,确定第一内存地址为未释放的内存地址,其中,第一内存地址的匹配地址为与第一内存地址相同、且未与为目标数据库分配的内存地址匹配过的内存地址。
可选地,本实施例中的具体示例可以参考上述实施例中所描述的示例,本实施例中对此不再赘述。
可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、ROM、RAM、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。
在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例中所提供的方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

Claims (11)

1.一种内存地址的查找方法,其特征在于,包括:
从目标内存地址集合中获取到第一内存地址,其中,所述目标内存地址集合中包含为目标数据库分配的内存地址;
在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找,其中,为所述目标数据库释放的内存地址存储在所述目标链表中与所述释放的内存地址的哈希值对应的位置上;
在所述第一位置上未查找到所述第一内存地址的匹配地址的情况下,确定所述第一内存地址为未释放的内存地址,其中,所述第一内存地址的匹配地址为与所述第一内存地址相同、且未与为所述目标数据库分配的内存地址匹配过的内存地址。
2.根据权利要求1所述的方法,其特征在于,在所述从目标内存地址集合中获取到第一内存地址之前,所述方法还包括:
获取目标日志文件,其中,所述目标日志文件中存储有为所述目标数据库分配内存地址的第一日志和为所述目标数据库释放内存地址的第二日志;
将所述第一日志分发到第一日志文件,以及将所述第二日志分发到第二日志文件,其中,所述目标内存地址集合是读取所述第一日志文件得到的,所述目标链表是读取第二日志文件之后生成的。
3.根据权利要求1所述的方法,其特征在于,所述在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找包括:
查找所述目标链表中位于所述第一位置上的第一节点中所存储的内存地址;
在所述第一节点中所存储的内存地址与所述第一内存地址不同、且所述第一节点具有关联的第一子链表的情况下,查找所述第一子链表中位于各个位置上的子节点中存储的内存地址,其中,所述第一子链表用于存储为所述目标数据库释放的内存地址中对应的哈希值为所述第一哈希值的内存地址。
4.根据权利要求3所述的方法,其特征在于,在所述在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找之后,所述方法还包括:
在所述第一节点中所存储的内存地址与所述第一内存地址相同的情况下,确定查找到所述第一内存地址的匹配地址;将所述第一节点中所存储的内存地址修改为目标标识;
在所述第一子链表中位于第一子位置上的第一子节点中所存储的内存地址与所述第一内存地址相同的情况下,确定查找到所述第一内存地址的匹配地址;将所述第一子节点中存储的内存地址修改为目标标识;
其中,所述目标标识用于表示当前节点存储的内存地址已与为所述目标数据库分配的内存地址匹配过。
5.根据权利要求4所述的方法,其特征在于,在所述查找所述第一子链表中位于各个位置上的子节点中存储的内存地址的过程中,所述方法还包括:
在所述第一子链表中位于第二子位置上的第二子节点中所存储的内存地址为所述目标标识的情况下,将所述第二子节点从所述第一子链表中删除。
6.根据权利要求1所述的方法,其特征在于,在所述在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找之前,所述方法还包括:
获取第二内存地址的第二哈希值,其中,所述第二内存地址是为所述目标数据库释放的一个内存地址;
在所述目标链表中位于与所述第二哈希值对应的第二位置上的第二节点中存储有第三内存地址的情况下,将所述第二内存地址存储到与所述第二节点关联的第二子链表中,其中,所述第二子链表用于存储为所述目标数据库释放的内存地址中对应的哈希值为所述第二哈希值的内存地址。
7.根据权利要求6所述的方法,其特征在于,所述第二节点的目标指针指向所述第二子链表的头部节点;
所述将所述第二内存地址存储到与所述第二节点关联的第二子链表中包括:
将所述第二内存地址存储到第三子节点中,其中,所述第三子节点是为存储所述第二内存地址所生成的节点;
将所述第三子节点更新为所述第二子链表的头部节点,并将所述目标指针更新为指向所述第三子节点。
8.根据权利要求1至7中任一项所述的方法,其特征在于,在所述在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找之后,所述方法还包括:
根据所述目标内存地址集合中所有未释放的内存地址,生成目标统计结果,其中,所述目标统计结果用于描述为所述目标数据库分配的内存空间中所有未释放的内存空间。
9.一种内存地址的查找装置,其特征在于,包括:
第一获取单元,用于从目标内存地址集合中获取到第一内存地址,其中,所述目标内存地址集合中包含为目标数据库分配的内存地址;
查找单元,用于在目标链表中与所述第一内存地址的第一哈希值对应的第一位置上进行查找,其中,为所述目标数据库释放的内存地址存储在所述目标链表中与所述释放的内存地址的哈希值对应的位置上;
第一确定单元,用于在所述第一位置上未查找到所述第一内存地址的匹配地址的情况下,确定所述第一内存地址为未释放的内存地址,其中,所述第一内存地址的匹配地址为与所述第一内存地址相同、且未与为所述目标数据库分配的内存地址匹配过的内存地址。
10.一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,所述处理器、所述通信接口和所述存储器通过所述通信总线完成相互间的通信,其特征在于,
所述存储器,用于存储计算机程序;
所述处理器,用于通过运行所述存储器上所存储的所述计算机程序来执行权利要求1至8中任一项所述的方法步骤。
11.一种计算机可读的存储介质,其特征在于,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行权利要求1至8中任一项所述的方法步骤。
CN202110580065.8A 2021-05-26 2021-05-26 内存地址的查找方法和装置、电子设备和存储介质 Pending CN113268439A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110580065.8A CN113268439A (zh) 2021-05-26 2021-05-26 内存地址的查找方法和装置、电子设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110580065.8A CN113268439A (zh) 2021-05-26 2021-05-26 内存地址的查找方法和装置、电子设备和存储介质

Publications (1)

Publication Number Publication Date
CN113268439A true CN113268439A (zh) 2021-08-17

Family

ID=77233120

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110580065.8A Pending CN113268439A (zh) 2021-05-26 2021-05-26 内存地址的查找方法和装置、电子设备和存储介质

Country Status (1)

Country Link
CN (1) CN113268439A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116132166A (zh) * 2023-02-03 2023-05-16 网易(杭州)网络有限公司 基于区块链的通信方法、装置、设备及存储介质
CN117349483A (zh) * 2023-12-05 2024-01-05 杭州行芯科技有限公司 一种寄生参数的查找方法、装置、电子设备及存储介质
CN117806988A (zh) * 2024-02-29 2024-04-02 山东云海国创云计算装备产业创新中心有限公司 任务执行方法、任务配置方法、板卡、服务器

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040172513A1 (en) * 2003-03-01 2004-09-02 International Business Machines Corporation System and method for detecting memory management programming errors
CN103455424A (zh) * 2013-09-18 2013-12-18 哈尔滨工业大学 基于VxWorks操作***的动态内存泄漏检测方法及装置

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040172513A1 (en) * 2003-03-01 2004-09-02 International Business Machines Corporation System and method for detecting memory management programming errors
CN103455424A (zh) * 2013-09-18 2013-12-18 哈尔滨工业大学 基于VxWorks操作***的动态内存泄漏检测方法及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
侯朋朋;武延军;谢沛东;: "高频内存分配下内存泄露检测的性能提升方法", 计算机工程, no. 11, 15 November 2013 (2013-11-15), pages 295 - 298 *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116132166A (zh) * 2023-02-03 2023-05-16 网易(杭州)网络有限公司 基于区块链的通信方法、装置、设备及存储介质
CN117349483A (zh) * 2023-12-05 2024-01-05 杭州行芯科技有限公司 一种寄生参数的查找方法、装置、电子设备及存储介质
CN117349483B (zh) * 2023-12-05 2024-04-09 杭州行芯科技有限公司 一种寄生参数的查找方法、装置、电子设备及存储介质
CN117806988A (zh) * 2024-02-29 2024-04-02 山东云海国创云计算装备产业创新中心有限公司 任务执行方法、任务配置方法、板卡、服务器
CN117806988B (zh) * 2024-02-29 2024-05-24 山东云海国创云计算装备产业创新中心有限公司 任务执行方法、任务配置方法、板卡、服务器

Similar Documents

Publication Publication Date Title
CN113268439A (zh) 内存地址的查找方法和装置、电子设备和存储介质
JP5497206B2 (ja) ディレクトリエントリを処理するための方法及びコンピュータ装置
US11347787B2 (en) Image retrieval method and apparatus, system, server, and storage medium
US20180307428A1 (en) Data storage method, electronic device, and computer non-volatile storage medium
CN107015985B (zh) 一种数据存储与获取方法及装置
CN107066498B (zh) 键值kv存储方法和装置
CN108932257B (zh) 多维度数据的查询方法及装置
CN112287182A (zh) 图数据存储、处理方法、装置及计算机存储介质
CN106843842B (zh) 一种应用程序配置文件的更新方法及装置
CN113032156B (zh) 内存分配方法和装置、电子设备和存储介质
CN111339088A (zh) 数据库的分库分表方法、装置、介质及计算机设备
CN111651667A (zh) 数据推送分流控制方法、装置及计算机可读存储介质
CN115757406A (zh) 数据存储方法、装置、电子设备及存储介质
CN112269665B (zh) 内存的处理方法和装置、电子设备和存储介质
CN111198885A (zh) 数据的处理方法及装置
CN110099112B (zh) 基于点对点网络的数据存储方法、装置、介质及终端设备
US11200204B2 (en) Method, device and computer program product for searching a file
CN108154024A (zh) 一种数据检索方法、装置及电子设备
US20150278543A1 (en) System and Method for Optimizing Storage of File System Access Control Lists
CN112650692A (zh) 堆内存分配方法、装置及存储介质
CN115964002B (zh) 一种电能表终端档案管理方法、装置、设备及介质
CN110362540B (zh) 一种数据存储、访客数获取方法及装置
CN105653540B (zh) 文件属性信息的处理方法和装置
US9483560B2 (en) Data analysis control
CN114036104A (zh) 基于分布式存储的重删数据的云归档方法、装置及***

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination